我正在尝试创建一个简单的套接字连接。
这是我的客户正在做的事情:
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语句永远不会被执行?*
答案 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
的优缺点