从C中的套接字读取消息

时间:2011-03-14 20:56:03

标签: c linux sockets

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

while(success == 0) {

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

}

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

6 个答案:

答案 0 :(得分:7)

套接字的另一端上的程序不是closing它,也不是shutting down它的写入(这是你的读取),所以你的结局不知道一切都完成了 - 事实上,从逻辑上来说,不会完成,直到另一端说你没有更多东西要读。

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

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

答案 1 :(得分: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); 

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

答案 2 :(得分:1)

您现在必须停止从套接字读取,否则套接字将阻止您的程序,直到它收到更多数据。如果您想知道如何创建不阻止程序的套接字,请查看非阻塞套接字。

ief2

答案 3 :(得分:0)

尝试添加\n。有时不打印非结束线。

编辑:哦等你意味着程序没有结束?

答案 4 :(得分:0)

我猜你的while循环永远不会终止,因为读取成功或阻塞。

答案 5 :(得分:0)

只有当n的值为零时,你的while循环才会结束。

您希望read何时返回零值?您发送到此套接字的数据是否满足任何导致读取返回零的条件?