socket中的傳送與接收函式

2021-08-10 02:22:49 字數 2445 閱讀 5101

網路i/o操作:

(一)read()/write()

(二)recv()/send()

(三)readv()/writev()

(四)recvmsg()/sendmsg()

(五)recvfrom()/sendto()

---------------------------------------------

(1)推薦使用recvmsg()/sendmsg()函式,這兩個函式是最通用的i/o函式,實際上可以把上面的其它函式都替換成這兩個函式。

(2)各個函式宣告如下:

#include

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

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

#include

#include

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

const struct sockaddr *dest_addr, socklen_t addrlen);

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

struct sockaddr *src_addr, socklen_t *addrlen);

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

-------------------------------------------

(3)read()/write():

1)read函式:

read函式是負責從fd中讀取內容.當讀成功時,read返回實際所讀的位元組數,如果返回的值是0表示已經讀到檔案的結束了,小於0表示出現了錯誤。如果錯誤為eintr說明讀是由中斷引起的,如果是econnrest表示網路連線出了問題。

2)wirte函式:

write函式將buf中的nbytes位元組內容寫入檔案描述符fd.成功時返回寫的位元組數。失敗時返回-1,並設定errno變數。

兩種返回結果:

1)write的返回值大於0,表示寫了部分或者是全部的資料。

2)返回的值小於0,此時出現了錯誤。我們要根據錯誤型別來處理。如果錯誤為eintr表示在寫的時候出現了中斷錯誤。如果為epipe表示網路連線出現了問題(對方已經關閉了連線)。

-----------------------------------------

(4)recv()/send():

1)send函式:

send 的引數含義如下:

sockfd :代表你與遠端程式連線的套接字描述符。

msg :乙個指標,指向你想傳送的資訊的位址。

len :是你想傳送資訊的長度。

flags :傳送標記。一般都設為0(你可以檢視send 的man pages 來獲得其他的引數值並且明白各個引數所代表的含義)。

2)send返回值:

send()函式在呼叫後會返回它真正傳送資料的長度,send()函式如果發生錯誤,則返回 –1。

注意:send所傳送的資料可能少於你給它的引數所指定的長度!因為如果你給send()的引數中包含的資料的長度遠遠大於send()所能一次傳送的資料,則send()函式只傳送它所能傳送的最大資料長度,然後它相信你會把剩下的資料再次呼叫它來進行第二次傳送。所以,記住如果send()函式的返回值小於len 的話,則你需要再次傳送剩下的資料。幸運的是,如果包足夠小(小於1k),那麼send()一般都會一次傳送光的。

3)recv函式:

sockfd :是你要讀取資料的套接字描述符。

buf :是乙個指標,指向你能儲存資料的記憶體快取區域。

len :是快取區的最大尺寸。

flags :是recv() 函式的乙個標誌,一般都為0 (具體的其他數值和含義請參考recv()

4)recv返回值:

recv() 返回它所真正收到的資料的長度。(也就是存到buf 中資料的長度)。如果返回–1 則代表發生了錯誤(比如網路以外中斷、對方關閉了套接字連線等),全域性變數errno 裡面儲存了錯誤**。

------------------------------------------

(5)readv()/writev()

(6)recvmsg()/sendmsg()

(7)recvfrom()/sendto()

Python利用socket傳送與接收檔案001

應用場景 語言python,利用socket進行檔案傳輸 針對windows本地檔案d盤主目錄下的6個子目錄對應6中檔案,如 d 主目錄 001 2021 01 01 每個子目錄每天會產生乙個新的次子目錄並附帶一些內部檔案以當天日期命名如 d 主目錄 002 2021 01 01 xx,001則產生...

socket的傳送與接收緩衝區

應用程式可通過呼叫send write,sendmsg等 利用tcp socket向網路傳送應用資料,而tcp ip協議棧再通過網路裝置介面把已經組織成struct sk buff的應用資料 tcp資料報 真正傳送到網路上,由於應用程式呼叫send的速度跟網路介質傳送資料的速度存在差異,所以,一部分...

socket的傳送與接收緩衝區

應用程式可通過呼叫send write,sendmsg等 利用tcp socket向網路傳送應用資料,而tcp ip協議棧再通過網路裝置介面把已經組織成struct sk buff的應用資料 tcp資料報 真正傳送到網路上,由於應用程式呼叫send的速度跟網路介質傳送資料的速度存在差異,所以,一部分...