日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系

發(fā)布時間:2024/4/11 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. TCP發(fā)送接口:send()

? ? ? ? TCP發(fā)送數(shù)據(jù)的接口有send,write,sendmsg。在系統(tǒng)內(nèi)核中這些函數(shù)有一個統(tǒng)一的入口,即sock_sendmsg()。由于TCP是可靠傳輸,所以對TCP的發(fā)送接口很容易產(chǎn)生誤解,比如sn = send(...); 錯誤的認(rèn)為sn的值是表示有sn個字節(jié)的數(shù)據(jù)已經(jīng)發(fā)送到了接收端。其實真相并非如此。

? ? ? ? 我們知道,TCP的發(fā)送和接收在在內(nèi)核(linux)中是有對應(yīng)的緩沖的:

[cpp]?view plaincopy
  • struct?sock{??
  • ...??
  • struct?sk_buff_head?receive_queue;??//接收的數(shù)據(jù)報隊列??
  • struct?sk_buff_head?write_queue;????//即將發(fā)送的數(shù)據(jù)報隊列??
  • ...??
  • }??
  • ? ? ? ? 對于發(fā)送端而言,用戶空間調(diào)用send(data)等發(fā)送接口將數(shù)據(jù)發(fā)送,內(nèi)核會將data拷貝到內(nèi)核空間的socket對應(yīng)的緩沖中,即sock.write_queue。而send()函數(shù)的返回值僅僅是表示本次send()調(diào)用中成功拷貝的字節(jié)數(shù)(用戶空間->內(nèi)核空間對應(yīng)的sock緩沖隊列)。具體發(fā)送和接收端的接收就由TCP協(xié)議完成,雖然TCP是可靠傳輸,但是這個前提是發(fā)送端和接收端的網(wǎng)絡(luò)是連接的,否則你懂得。這樣,對于調(diào)用send()發(fā)送的用戶而言,如果想要確定接收方是否成功接受數(shù)據(jù),就得需要靠其他的辦法查詢。

    2. send()阻塞和非阻塞

    前面已說過,sn=send(data)負(fù)責(zé)將數(shù)據(jù)拷貝到內(nèi)核空間,而具體發(fā)送是有tcp后續(xù)完成(這里面就包括流量控制等)。對已阻塞和非阻塞僅僅是對于數(shù)據(jù)從用空空間拷貝到內(nèi)核空間的發(fā)送緩沖這段期間而言的。

    ? ? ? ? 1. 如果發(fā)送緩沖剩余空間大于欲發(fā)送data的字節(jié)數(shù),對于阻塞和非阻塞而言都能成功將數(shù)據(jù)拷貝至內(nèi)核緩沖,返回的sn即等于欲發(fā)送的數(shù)據(jù)的字節(jié)數(shù)。

    ? ? ? ? 2.如果發(fā)送緩沖剩余空間小于欲發(fā)送data的字節(jié)數(shù),

    ? ? ? ? ? ? ? ? ? ? a. 那么阻塞模式會進(jìn)行阻塞,等待內(nèi)核緩沖的空閑空間,然后繼續(xù)將數(shù)據(jù)拷貝到內(nèi)核緩沖中,直到全部拷貝為止。返回rn即為data的數(shù)據(jù)量。

    ? ? ? ? ? ? ? ? ? ? b. 非阻塞模式,當(dāng)內(nèi)核發(fā)送緩沖被填滿后,立即返回。rn等于data中已被拷貝到發(fā)送緩沖的數(shù)據(jù)量。

    3. 如何判定接收成功接收數(shù)據(jù)?

    ? ? ? ? 1.接收端回復(fù)應(yīng)答信息。

    ? ? ? ? ? ? ? ? 這個方法比較土,但也是比較實用的。

    ? ? ? ? 2.計算發(fā)送端sock已發(fā)送數(shù)據(jù)量

    ? ? ? ? ? ?可參考:如何判斷TCP數(shù)據(jù)包是否發(fā)送成功?作者提到可以使用?ioctl接口:ioctl(tcp_socket, SIOCOUTQ, &value);


    4. 參考:


    TCP之send函數(shù)研究??

    recv send 阻塞和非阻塞??

    如何判斷TCP數(shù)據(jù)包是否發(fā)送成功?

    總結(jié)

    以上是生活随笔為你收集整理的TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。