所以,我有这段代码,它只是从客户端读取消息并回复“是”
while(strcmp(buffer, "QUIT") != 0){
bzero(buffer, 255); //cleans the read buffer
/*this reads the aux (request) from the client*/
recv(newsockfd, buffer, 255, 0);
if(strlen(buffer))
printf("Thread %d: %s\n", thread_no, buffer);
fflush(stdout);
write(newsockfd, "yup\n", 4);
}
问题在于,在第一次阅读时一切正常,但所有其他读数都搞砸了,如果我发送消息“吉他”,例如,它获得'g',循环,然后它得到“ uitar“,发送另一个”呀“。
我不知道发生了什么。
答案 0 :(得分:6)
长话短说:TCP不是面向消息的协议,它是一种面向流的协议。消息可能会碎片化或合并在一起,您的应用程序必须处理(唯一的保证是您将以相同的顺序收到数据)。
答案 1 :(得分:0)
recv()
读取当前可用的数据。您应该阅读,直到您点击EOF,错误或换行符。只有你有这个换行符,你才有一个完整的行,然后用“QUIT”进行比较,并且你用“Yup”确认。
答案 2 :(得分:0)
上面代码中的其他三个错误。
1)不检查recv()的返回值。套接字可以正常关闭(返回值== 0),遇到错误(返回值== -1)等等...更重要的是,没有建议您将收到“QUIT”的所有4个字节远程发送呼叫发送的消息。您只能收到“Q”。
2)如果recv()要接收255个字符(其中没有一个是空字符),那么后续的strlen()将读入无效的内存并可能崩溃。
3)不检查写调用的返回值。