从C中的套接字读取消息

Ash*_*332 6 c sockets linux

我试着理解从C(Linux)中的socket读取,这只是代码的一部分:

while(success == 0) {

    while((n = read(sockfd, buffer, BUFFSIZE, 0)) > 0) {
        printf("%s",buffer);
        bzero(buffer,BUFFSIZE);
    }
    success = 1;
    printf("###");

}
Run Code Online (Sandbox Code Playgroud)

打印信息,但三个哈希(###)永远不会打印?为什么?该程序似乎阻止了read().这里我只是打印,但我需要做的是缓冲整个消息然后处理它.

Wil*_*ill 8

套接字另一端的程序没有关闭它,也没有关闭它的写入(这是你的读取),所以你的结局并不知道一切都已完成 - 事实上,从逻辑上看,它没有完成,直到另一端说你没有更多的东西可供阅读.

通常,您的应用程序级逻辑需要事先知道要读取多少内容,或者在收到某个终结符之前读取,或者另一端正常关闭或关闭套接字.

(非阻塞I/O完全不同于它 - 它允许您在单个线程中有效地从套接字读取时执行其他操作,但它无法解决确定何时从套接字读取完成的问题,是你的问题.)


nin*_*alj 5

您需要知道您收到的消息有多大,并继续阅读,直到您收到整条消息(读取只能返回部分消息).

do {
    nread = read(s, buf, to_read);
    if (nread < 0 && errno == EINTR)
            continue;
    if (nread < 0) {
            perror("read");
            exit(1);
    }

    if (nread == 0) {
            printf("socket closed");
            ... do something appropiate ...
            ... (reconnecting/exiting the loop with an error/...) ...
    }

    to_read -= nread;
    buf += nread;
} while (to_read > 0); 
Run Code Online (Sandbox Code Playgroud)

to_read是您期望读取的字节长度.buf有足够的空间.之后每次读取,更新to_readbuf相应.当然,您应该正确处理错误.