2012-01-28 42 views
4

可能是解決這兩個函數之間的任何差異?:
對於這個問題帶來了另一個問題......是字符數總是與字節數相同?
欲瞭解更多信息:我用它在Linux上的TCP套接字通信(sys/socket.h) 感謝您的迴應。write()和send()解決錯誤=>差異?

send()
write()

返回:
寫():
成功時,寫入返回的字節數(零表示沒有寫)。出錯時,返回-1,並且適當地設置errno。如果count爲零且文件描述符引用常規文件,則將返回0而不會導致任何其他影響。對於特殊文件,結果不可移植。

send():
調用返回發送的字符數,如果發生錯誤,則返回-1。

來自stackoverflow的問題,說這種方法應該與使用標誌零相同。
here

int client_sockfd; 
char* msg; 
int length = strlen(msg); 

//first option 
if(send(client_sockfd, msg, length, 0) != length) return 1; 
else return 0; 
//second option 
if(write(client_sockfd, msg, length) != length) return 1; 
else return 0; 

回答

3

他們都將返回相同數量的寫入的字節(==字符在這種情況下,除了注意這一點:

如果消息太長通過底層協議原子通過,所述 誤差EMSGSIZE返回,並且不發送消息。

換句話說,取決於數據的大小被寫入,寫()可以成功,而發送()可能會失敗。

1

字節數==字符數,因爲C標準要求char是一個1字節的整數。

write(): 是的,它返回寫入的字節數。但是,如果它不會返回應該寫入的字節數量,那並不總是一個錯誤。特別是不用於TCP通信。一個套接字可能是非阻塞的或者只是繁忙,在這種情況下,你需要重寫尚未寫入的字節。可以實現這種行爲是這樣的:

char *buf = (however you acquire your byte buffer); 
ssize_t len = (total number of bytes to be written out); 

while (len > 0) 
{ 
    ssize_t written = write(sockfd, buf, len); 
    if (written < 0) 
    { 
     /* now THAT is an error */ 
     break; 
    } 
    len -= written; 
    buf += written; /* tricky pointer arythmetic */ 
} 

read(): 亦如這裏,與EOF通過返回0指示的唯一差別,這是不是錯誤。同樣,如果您想從套接字接收所有可用數據,則必須重試讀取。

int readbytes = 0; 
char buf[512]; 
do { 
    readbytes = read(sockfd, buf, 512); 
    if (readbytes < 0) 
    { 
     /* error */ 
     break; 
    } 
    if (readbytes > 0) 
    { 
     /* process your freshly read data chunk */ 
    } 
} while (readbytes > 0); /* until EOF */ 

你可以看到我的實現使用這種技術的一個簡單的TCP輔助類的https://github.com/H2CO3/TCPHelper/blob/master/TCPHelper.m

+0

權,規則的改變,如果套接字是非阻塞的。 – 2012-01-28 22:07:45

+0

但是TCP在阻塞模式下處於默認狀態?所以我不應該這樣複雜?在這種情況下 .. – user1097772 2012-01-28 22:19:21