为什么我的代码不会进入这个循环?套接字编程

时间:2013-09-23 10:34:06

标签: 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");                      
send(sock,send_data,strlen(send_data), 0);

send_data定义为char send_data[1024]

现在这是我的服务器端:

    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 Server

然后转到else语句并输出:Compression Method: null(0)

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

* 为什么else_if语句永远不会被执行?*

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

 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.

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

答案 2 :(得分:0)

在客户端,你这样做:

Send ("Hello Server");

Send("Compression Method: null(0)");

Send("end");

所以,在你的socket的流中你有这个:

Hello ServerCompression Method: null(0)end

当您在服务器上发出Recv(1024)时,它可能会从1个字符串返回到整个字符串,这意味着您可能会收到任何组合。这就是为什么你需要告诉服务器你在每个send()中发送了多少个字符。此外,您可以使用\ n或\ 0等特殊字符结束每个字符串,以便您可以在服务器端分隔字符串。由于字符串本身可能具有该特殊字符,所以不推荐使用。

如果要发送和接收单个数据包,请考虑使用UDP而不是TCP。使用UDP,服务器在客户端发送数据包时接收数据包。在转向UDP之前,先了解UDP与TCP here

的优缺点