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编程非常陌生)。你能给我一个示例发送和接收语句吗?呃,发送行,一个字长前缀。。。我确实回答了。我不知道单词前缀的长度是什么意思