簡體   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