亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 7653 | 回復(fù): 7
打印 上一主題 下一主題

socket: write(fd,buf,size) 什么時(shí)候返回值小于size [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-02-21 13:24 |只看該作者 |倒序?yàn)g覽
int sd, bytes_written = 0, retval;
sd = socket(AF_INET, SOCK_STREAM, 0);
... /*** Connect to host ***/
while ( bytes_written < len ) /* repeat sending until all */
{ /*...bytes of message are sent */
retval = write(sd, buffer+bytes_written, len);
if ( retval >= 0 )
bytes_written += retval;
else
/*---report connection error---*/
}

FILE *sp;
int sd;
sd = socket(AF_INET, SOCK_STREAM, 0);
... /*** Connect to host ***/ sp = fdopen(sd, "w"); /* create FILE* from socket */
if ( sp == NULL )
perror("FILE* conversion failed");
fprintf(sp, "%s, %s, %s\ n",Name, Address, Phone);


Note that in the first example, the program has to loop on the write() to get all the bytes out. Even though this is a socket stream, you cannot guarantee that the program sends all the bytes at once. The second instance does not have that limitation, because FILE* has its own data-buffering subsystem. When you write to a FILE* buffer, the subsystem forces you to wait until it sends all the bytes.

黑體部分不太懂, 還望指教

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-02-21 14:13 |只看該作者
你要用個(gè)循環(huán)把所有數(shù)據(jù)都寫到發(fā)送緩沖區(qū)去,但是套接口不保證你寫到緩沖區(qū)里的數(shù)據(jù)都能送的出去

retval = write(sd, buffer+bytes_written, len);
這哪里來(lái)的代碼

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-02-21 14:15 |只看該作者
http://ishare.iask.sina.com.cn/f/11173186.html
這本書中  31 頁(yè)。

作者應(yīng)該不是這個(gè)意思。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-02-24 22:55 |只看該作者
jeung 發(fā)表于 2012-02-21 14:13
你要用個(gè)循環(huán)把所有數(shù)據(jù)都寫到發(fā)送緩沖區(qū)去,但是套接口不保證你寫到緩沖區(qū)里的數(shù)據(jù)都能送的出去

retval ...

《unix網(wǎng)絡(luò)編程》中有講,由于socket是低速IO設(shè)備,套接口不保證你想寫要到內(nèi)核緩沖區(qū)等于實(shí)際寫入的字節(jié)數(shù)。write(sockfd, buff, 32),這句希望這次調(diào)用寫入32字節(jié),可能內(nèi)核緩沖區(qū)已經(jīng)沒(méi)辦法核收這么多了,可能只寫入了5字節(jié)。你要保證你希望寫入的字節(jié)數(shù),那么你等多次調(diào)用write,至到寫入你想寫入的字節(jié)為止。write在出錯(cuò)的時(shí)候返回-1,調(diào)用成功但并沒(méi)有寫入數(shù)據(jù)返回0,大于0表示實(shí)際寫入的字節(jié)數(shù)。《unix網(wǎng)絡(luò)編程》中作者寫了一個(gè)writen函數(shù),用write實(shí)現(xiàn),,writen可能多次調(diào)用write實(shí)現(xiàn)一次寫入想寫的字節(jié),你可以在網(wǎng)上找到源代碼,有人說(shuō),里面的代碼就是可以拿來(lái)就用的。

PS:最好看這些經(jīng)典的書吧,收獲不少,很多疑問(wèn)都可以解開(你可能會(huì)有更多疑問(wèn))。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-02-24 23:00 |只看該作者
本帖最后由 _print 于 2012-02-24 23:00 編輯

你的write是不是第二個(gè)參數(shù)寫錯(cuò)了,還有,我看了你的while循環(huán),它就是我上面說(shuō)的writen函數(shù)做的工作,只是Steven把它封裝成函數(shù)了,而這里的作者寫到代碼中,你喜歡那種風(fēng)格由你了。我覺得Steven的方式更好,不要再來(lái)理解一次這個(gè)while的作用。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-02-25 14:16 |只看該作者
回復(fù) 5# _print


第二個(gè)參數(shù)沒(méi)有寫錯(cuò),錯(cuò)的是第三個(gè)。 應(yīng)該是len-bytes_written.

而這里我想知道的是,當(dāng)使用write , 如果socket buffer 中的空間不足, write 是不是會(huì)立即返回還是會(huì)阻塞。 現(xiàn)在看來(lái)是前者。  而對(duì)于這種循環(huán)調(diào)用wirte 來(lái)完成寫 本身也不算好注意。  如果socket buffer 一直沒(méi)有 空閑空間, 或者在每次循環(huán)的這段間隔剛好空出來(lái)1bytes, 那么while 就要 100 次了?  更好的做法最好是能event drive 的。

關(guān)于
The second instance does not have that limitation, because FILE* has its own data-buffering subsystem. When you write to a FILE* buffer, the subsystem forces you to wait until it sends all the bytes.

不知道是不是有什么event drive, 至少不會(huì)比 wirte 差。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-02-25 14:41 |只看該作者
Meets 發(fā)表于 2012-02-25 14:16
回復(fù) 5# _print


你提的這種極端情況,基本是不存在的,一般都是上面說(shuō)的這樣處理。對(duì)一般socket進(jìn)入簡(jiǎn)單的寫,還不至于有什么問(wèn)題。如果你真要用event drive那么你看看select,poll,epoll函數(shù)吧,就是你想要的,這些函數(shù)一般都是用在對(duì)大量socket對(duì)進(jìn)操作的時(shí)候,殺雞用牛刀。

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-02-25 14:51 |只看該作者
Meets 發(fā)表于 2012-02-25 14:16
回復(fù) 5# _print


這段英文的意思是說(shuō),如果用FILE也就是C語(yǔ)言的I/O庫(kù)函數(shù)操作,就不會(huì)有上面的問(wèn)題,因?yàn)镕ILE會(huì)為你處理緩沖?墒荢teven說(shuō)這樣會(huì)引入更隱蔽,更復(fù)雜的問(wèn)題,你要了解請(qǐng)參考《unix網(wǎng)絡(luò)編程》。我手里只有中文版,從你發(fā)英文看來(lái),講得完全一樣,而看代碼,卻不是同一本書,不知誰(shuí)抄誰(shuí)的,天下文章一大抄。往往是最經(jīng)典的書把該講都講得差不多了,其他人就東抄抄西抄抄,就出書,特別是國(guó)內(nèi)作者,以前我只要一看到是國(guó)內(nèi)出的書,就不看了。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP