C 为什么赢了';我的代码不会进入这个循环吗?套接字编程

C 为什么赢了';我的代码不会进入这个循环吗?套接字编程,c,sockets,if-statement,C,Sockets,If Statement,我正在尝试创建一个简单的套接字连接 这就是我的客户正在做的: strcpy(send_data, "Hello Server"); send(sock,send_data,strlen(send_data), 0); strcpy(send_data, "Compression Method: null(0)"); send(sock,send_data,strlen(send_data), 0); strcpy(send_data, "end"

我正在尝试创建一个简单的套接字连接

这就是我的客户正在做的:

strcpy(send_data, "Hello Server");
send(sock,send_data,strlen(send_data), 0);

strcpy(send_data, "Compression Method:  null(0)");                      
send(sock,send_data,strlen(send_data), 0);

strcpy(send_data, "end");                      
send(sock,send_data,strlen(send_data), 0);
    int clntSock = accept(servSock, (struct sockaddr *) &clntAddr, &clntAddrLen);

    while(clntSock){

        int inMsgLen = recvfrom(clntSock, inMsg, 1024, 0,(struct sockaddr *)&clntAddr, (socklen_t*)&clntAddrLen);

        inMsg[inMsgLen] = '\0';

        if(strcmp(inMsg, "Hello Server") == 0){   // check if the client sent hello server

            printf("%s\n", inMsg);

        } else if(strcmp(inMsg, "end") == 0){  // check if client send end

            printf("\n WHY ISNT"T THIS EXECUTING\n"); // THIS IS NOT HAPPENING

        } else {

            printf("%s\n", inMsg);  //keep receiving and do nothing
        }
send\u data
定义为
char send\u data[1024]

现在是我的服务器端:

strcpy(send_data, "Hello Server");
send(sock,send_data,strlen(send_data), 0);

strcpy(send_data, "Compression Method:  null(0)");                      
send(sock,send_data,strlen(send_data), 0);

strcpy(send_data, "end");                      
send(sock,send_data,strlen(send_data), 0);
    int clntSock = accept(servSock, (struct sockaddr *) &clntAddr, &clntAddrLen);

    while(clntSock){

        int inMsgLen = recvfrom(clntSock, inMsg, 1024, 0,(struct sockaddr *)&clntAddr, (socklen_t*)&clntAddrLen);

        inMsg[inMsgLen] = '\0';

        if(strcmp(inMsg, "Hello Server") == 0){   // check if the client sent hello server

            printf("%s\n", inMsg);

        } else if(strcmp(inMsg, "end") == 0){  // check if client send end

            printf("\n WHY ISNT"T THIS EXECUTING\n"); // THIS IS NOT HAPPENING

        } else {

            printf("%s\n", inMsg);  //keep receiving and do nothing
        }
现在,我的服务器设法进行第一次检查(即检查客户端是否发送了服务器hello),并打印出以下内容:
hello server

然后它转到else语句并输出:
compressionmethod:null(0)

之后,它继续进入else语句它从不执行else if语句


*为什么else\u if语句从未执行过?*

您假设一次发送等于对等方的一次接收。事实并非如此。TCP是一种字节流协议。如果您想要消息,您必须自己安排它们,例如,行、字长前缀、类型长度值、XML、…

您假设在对等方一次发送等于一次接收。事实并非如此。TCP是一种字节流协议。如果您想要消息,您必须自己安排它们,例如,行、字长前缀、类型长度值、XML等。在TCP层上,您需要实现某种协议。这意味着您的客户机应该发送一些指示符,即它将要发送的字符串的固定大小长度,然后是实际字符串(对于简单的protocoll)。 在服务器代码中,您不能仅仅接收并期望字符串完全到达。它可以被切成几块,所以你能做的是:

 1. Client sends a fixed length header (for example. N chars which have the length of the following string)
 2. Since the server knows now that the the header has a fixed length, it should wait until this header has arrived.
 3. Parse the header to see how many data the client wants to send and then loop as long as a full message has not yet been delivered.

对于更复杂的情况,您可能需要一个协议,该协议还允许在客户端发送错误数据的情况下重新同步,但您必须根据该协议对您的重要性来决定。对于一个简单的客户机/服务器,应该使用类似上述的方案。我正在使用相同的方法。

在TCP层上,您需要实现某种协议。这意味着您的客户机应该发送一些指示符,即它将要发送的字符串的固定大小长度,然后是实际字符串(对于简单的protocoll)。 在服务器代码中,您不能仅仅接收并期望字符串完全到达。它可以被切成几块,所以你能做的是:

 1. Client sends a fixed length header (for example. N chars which have the length of the following string)
 2. Since the server knows now that the the header has a fixed length, it should wait until this header has arrived.
 3. Parse the header to see how many data the client wants to send and then loop as long as a full message has not yet been delivered.

对于更复杂的情况,您可能需要一个协议,该协议还允许在客户端发送错误数据的情况下重新同步,但您必须根据该协议对您的重要性来决定。对于一个简单的客户机/服务器,应该使用类似上述的方案。我使用相同的方法。

在客户端,您正在执行以下操作:

Send(“你好服务器”)

Send(“压缩方法:null(0)”

发送(“结束”)

因此,在套接字流中,您有:

Hello服务器压缩方法:null(0)end

在服务器上发出Recv(1024)时,它可能会从1个字符返回到整个字符串,这意味着您可能会收到该字符串的任意组合。这就是为什么您需要告诉服务器在每个send()中要发送多少个字符。此外,您还可以在每个字符串的末尾添加一个特殊字符,如\n或\0,以便在服务器端分隔字符串。这不太推荐,因为字符串本身可能包含该特殊字符


如果您想发送和接收单独的数据包,请考虑使用UDP而不是TCP。使用UDP,服务器在客户端发送数据包时接收数据包。在转到UDP之前,请阅读并了解UDP与TCP在客户端的优缺点,您可以这样做:

Send(“你好服务器”)

Send(“压缩方法:null(0)”

发送(“结束”)

因此,在套接字流中,您有:

Hello服务器压缩方法:null(0)end

在服务器上发出Recv(1024)时,它可能会从1个字符返回到整个字符串,这意味着您可能会收到该字符串的任意组合。这就是为什么您需要告诉服务器在每个send()中要发送多少个字符。此外,您还可以在每个字符串的末尾添加一个特殊字符,如\n或\0,以便在服务器端分隔字符串。这不太推荐,因为字符串本身可能包含该特殊字符


如果您想发送和接收单独的数据包,请考虑使用UDP而不是TCP。使用UDP,服务器在客户端发送数据包时接收数据包。在转到UDP之前,请阅读并了解UDP与TCP的优缺点

首先,您应该检查错误。这包括
accept
调用,理论上它可以返回一个值为
0
的套接字(这意味着你不会进入循环)。更糟糕的是,即使
accept
失败,您也会进入循环,因为
clnSock
将是
-1
,这也是“true”.我正在做所有的错误检查--我只是没有在这篇文章中包括它们,因为它太长了。他的回答可能有助于理解TCP套接字的基本工作原理:首先,你应该从检查错误开始。这包括
accept
调用,理论上它可以返回一个值为
0
的套接字(这意味着你不会进入循环)。更糟糕的是,即使
accept
失败,你也会进入循环,因为
clnSock
将是
-1
,这也是“真的”。我正在做所有的错误检查——我只是没有在这篇文章中包括它们,因为它太长了。这个答案可能有助于理解TCP套接字的基本工作原理:呃,发送行,字长前缀。。。我确实回答了这个问题,我不知道单词前缀的长度是什么意思(我对socket编程非常陌生)。你能给我一个示例发送和接收语句吗?呃,发送行,一个字长前缀。。。我确实回答了。我不知道单词前缀的长度是什么意思