C服务器奇怪的行为

时间:2012-02-12 03:49:27

标签: c sockets unix

所以,我有这段代码,它只是从客户端读取消息并回复“是”

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“,发送另一个”呀“。

我不知道发生了什么。

3 个答案:

答案 0 :(得分:6)

长话短说:TCP不是面向消息的协议,它是一种面向流的协议。消息可能会碎片化或合并在一起,您的应用程序必须处理(唯一的保证是您将以相同的顺序收到数据)。

答案 1 :(得分:0)

recv()读取当前可用的数据。您应该阅读,直到您点击EOF,错误或换行符。只有你有这个换行符,你才有一个完整的行,然后用“QUIT”进行比较,并且你用“Yup”确认。

答案 2 :(得分:0)

上面代码中的其他三个错误。

1)不检查recv()的返回值。套接字可以正常关闭(返回值== 0),遇到错误(返回值== -1)等等...更重要的是,没有建议您将收到“QUIT”的所有4个字节远程发送呼叫发送的消息。您只能收到“Q”。

2)如果recv()要接收255个字符(其中没有一个是空字符),那么后续的strlen()将读入无效的内存并可能崩溃。

3)不检查写调用的返回值。