簡體   English   中英

C套接字read()返回值

[英]C socket read() return value

我正在一個C項目上,使用服務器/客戶端結構將文件從一個IP地址發送到另一個IP地址。 從閱讀其他文章中,我了解到,只有在套接字關閉的情況下,從套接字讀取的內容才會返回0。

服務器端的相關代碼(socket(),bind()和accept()的行為符合預期)

char *toSend = malloc(packet_size);
size_t bytesRead;
while ((bytesRead = fread(toSend, sizeof(char), packet_size, fp)) > 0) {
printf("Sending: %s \n", toSend);
    write(newsockfd, toSend);
    usleep(packet_delay*1000000);
}      

在客戶端:

char buffer[256];
int numRead;
while ((numRead = read(sockfd, buffer, 255)) > 0) {                        
  printf("read %d\n", numRead);                                                       
  printf("%s\n", buffer);
  fwrite(buffer, sizeof(char), 255, fp);                                                                     
}

客戶端的connect()調用成功返回0,但是盡管套接字當時處於打開狀態,但對read(sockfd,buffer,255)的第一次調用返回0。 看來這不可能。 有人有提示嗎? 謝謝。

我看到您正在以錯誤的方式寫入數據,您是否為write()系統調用使用了包裝器?

正確的簽名是

ssize_t write(int fd, const void *buf, size_t count);

因此,您必須傳遞正在寫入的數據的長度,並通過捕獲返回值並正確檢查它來檢查它是否成功寫入。

read()的返回值0並不意味着發生錯誤,這意味着當有錯誤時read()返回-1時就沒有要讀取的數據。

如果需要等到有數據,請使用select()這是一個示例

fd_set         set;
struct timeval tv;

FD_ZERO(&set);
FD_SET(sockfd, &set);

tv.tv_sec  = TIMEOUT;
tv.tv_usec = 0;

if ((select(sockfd + 1, NULL, &set, NULL, &tv) != 1) || (FD_ISSET(sockfd, &set) == 0))
    return timedOutWaitingForData();

proceedReadingFrom(sockfd);

如您所見,您可以自由設置超時值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM