繁体   English   中英

从C中的套接字读取消息

[英]Reading message from socket in C

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

while(success == 0) {

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

}

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

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

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

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

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

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 当然,您应该正确处理错误。

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

ief2

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM