Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中进行套接字读写编程后,没有代码运行_C_Sockets_Tcp_Inet - Fatal编程技术网

在c中进行套接字读写编程后,没有代码运行

在c中进行套接字读写编程后,没有代码运行,c,sockets,tcp,inet,C,Sockets,Tcp,Inet,我正在用c语言编写一个服务器客户端程序 服务器首先启动,等待客户端,然后客户端连接。 在客户端连接之后,它等待来自用户的输入,而服务器正在运行read以从客户端获取该输入 这是主要问题 while循环发现新行字符后,它会将缓冲区中的数据从客户端发送到正在等待读取的服务器。服务器读取数据,但读取数据下的代码不能运行,除非它与缓冲区有关 如果代码是这样的 readsocket_fd,buff,sizeofbuff; 来自客户端的printfdata:%s,buff;//这条线路将在终点站运行 打印测

我正在用c语言编写一个服务器客户端程序

服务器首先启动,等待客户端,然后客户端连接。 在客户端连接之后,它等待来自用户的输入,而服务器正在运行read以从客户端获取该输入

这是主要问题

while循环发现新行字符后,它会将缓冲区中的数据从客户端发送到正在等待读取的服务器。服务器读取数据,但读取数据下的代码不能运行,除非它与缓冲区有关

如果代码是这样的 readsocket_fd,buff,sizeofbuff; 来自客户端的printfdata:%s,buff;//这条线路将在终点站运行 打印测试测试;//这一行永远不会被读

客户方面也是这样。 在客户端执行写操作后,写操作下的任何代码都不会运行。这基本上是一个死锁,我认为这两个程序都在等待另一个程序的输入

我不知道这是为什么。也许它正在等待读取更多的数据,但这并不能解释为什么它运行的代码只打印缓冲区,而不打印其他任何内容

下面是从客户端发送和接收数据的代码段。服务器是用TCP设置的

while(1){
    //wait for data from user
    bzero(buffer, 256);
    printf("Enter the string : ");
    n = 0;
    while ((buffer[n++] = getchar()) != '\n')
        ;
    write(sockfd, buffer, sizeof(buffer));
    printf("WE HERE");
    read(sockfd, buffer, sizeof(buffer));
    printf("READING THE DATA");
    printf("From Server : %s", buffer);
    if ((strncmp(buffer, "exit", 4)) == 0) {
        printf("Client Exit...\n");
        break;
    }
}
这是从客户端读取数据并提供响应的服务器代码

while(1) {
    bzero(buffer, 256);


    //read the message from the client
    read(newsockfd, buffer, sizeof(buffer));
    printf("From the client: %s", buffer);

    printf("WORKING HERE BEFORE LOWER CASE [SERVER]");
    printf("the buffer again: %s", buffer);
    lower_string(buffer);
    printf("WORKING AFTER THE LOWER CASE [SERVER]");
    write(sockfd, buffer, sizeof(buffer));
    printf("WRITING TO THE CLIENT");

    if (strncmp("exit", buffer, 4) == 0) {
        printf("Server Exit...\n");
        break;
    }
    bzero(buffer, 256);
}

您的代码包含许多问题:

您没有将换行符放在printf语句的末尾,这意味着在stdout缓冲区满到足以强制将其刷新到控制台之前,打印文本将不可见。这可能会让您对程序的行为感到困惑,因为正在执行printf语句,但您没有及时看到它们的输出。您应该这样做,例如在此处打印\n;而不是在这里打印

您没有将send和recv的返回值捕获到一个变量中,以便检查它们返回的值并对其进行适当的操作。如果您不查看返回值,您就不知道实际发送或接收了多少字节—它可能少于您要求发送或接收的字节数!你不知道是否发生了错误或EOF情况

您应该知道,recv将阻塞,直到至少有一个字节的数据可放入传入缓冲区,同样,写入可以阻塞,直到网络堆栈可以使用传入缓冲区的至少一个字节。在某些情况下,这确实会导致死锁,例如,如果远程对等方从未发送任何数据,因为它在recv中被阻止,等待您首先向其发送一些数据。这个问题可以通过各种更高级的技术来解决,例如超时、非阻塞或异步I/O,但我在这里不赘述

将整个256字节数组归零,然后最多接收256字节意味着在一次接收256字节数据的情况下,数组不会以NUL结尾,如果尝试将其用作C字符串(例如,通过将其传递给printf%s,buffer;),则会调用未定义的行为;。您最好改为接收sizeofbuf-1字节,如果您按照第2点中的建议捕获recv的返回值,那么您可以只设置缓冲区[numBytesReceived]='\0';之后,与不必要地清除所有256字节相比,哪种方法更有效地确保字符串以NUL结尾

请注意,您不能假设您将在一次recv调用中接收整个字符串。除非您的网络状况非常糟糕,否则在这个玩具程序中不太可能发生这种情况,但一般来说,发送方可以发送例如123456789,接收方的第一个recv呼叫得到1234,然后第二个recv呼叫得到567,然后第三个呼叫得到89,或者字符串子集的任何其他组合。接收器保证按顺序接收所有字节,但不保证一次接收所有字节。生产级代码需要足够智能才能正确处理


bzerobuffer,256;读取之后,服务器不应该在那里。另外,缓冲区是如何定义的?后缓冲区的定义。更好的是:发布你的真实代码。与bzerobuffer一样,256;阅读后问题仍然存在。我会对此进行投票,但我不能,因为代表仍在试图理解它。到目前为止,我已经将返回值放入了read中,并且我一直返回256作为该变量的数字。我将继续参考,以了解如何继续从客户端发送当前仍不工作的消息,并感谢@Jeremy Friesner从读取返回256是可能的,但不保证,因为您要发送256字节,因此,除非出现任何错误,否则将发送256个字节。我已确定问题出在客户端的读取中。这本书永远读不完
任何其他代码。我会继续调查并阅读你的笔记,谢谢你,我明白了,哈哈。。。。服务器中的客户端套接字名称为newsockfd,而服务器套接字名称为sockfd。我是个白痴。感谢您帮助我识别问题,让我能够使用打印语句进行诊断。非常有用。尽情享受我的一天!再次感谢@DevinTripp你基本上告诉我们,你在没有显示给我们的代码中发现了问题?您是否仍然认为,拒绝提供最低限度的强制性信息是一个好主意?对缺失零件的错误假设是导致重大故障的首要原因。