Linux中的tcp udp的send、recv、sendto和recvfrom接口

原文鏈接:https://blog.csdn.net/u014507230/article/details/45311033

參考:https://blog.csdn.net/u014507230/article/details/45311033

send() 和recv() 
系統調用send()的用法如下:
int send(int sockfd, const void* msg, int len, int flags); 
第一個參數是你希望給發送數據的套接口文件描述符。它可以是你通過socket()系統調用返回的,也可以是通過accept()系統調用得到的。
第二個參數是指向你希望發送的數據的指針。
第三個參數是數據的字節長度。第四個參數標誌設置爲0。
下面是一個簡單的例子:
char*msg="Beejwashere!";
intlen,bytes_sent;
..
len=strlen(msg);
bytes_sent=send(sockfd, msg, len, 0);
... 
系統調用send()返回實際發送的字節數,這可能比你實際想要發送的字節數少。如果返回的字節數比要發送的字節數少,你在以後必須發送剩下的數據。當send()出錯時,將返回-1。
系統調用recv()的使用方法和send()類似:
int recv(int sockfd, void* buf, int len, unsigned int flags); 
第一個參數是要讀取的套接口文件描述符。
第二個參數是保存讀入信息的地址。
第三個參數是緩衝區的最大長度。第四個參數設置爲0。
系統調用recv()返回實際讀取到緩衝區的字節數,如果出錯則返回-1。
這樣使用上面的系統調用,你可以通過數據流套接口來發送和接受信息。 
--------------------------------------------------------------------------------

sendto() 和recvfrom() 
因爲數據報套接口並不連接到遠程的主機上,所以在發送數據包之前,我們必須首先給出目的地址,請看:
int sendto(int sockfd, const void* msg, int len, unsigned int flags,
conststruct sockaddr*to, inttolen); 
除了兩個參數以外,其他的參數和系統調用send()時相同。
參數to是指向包含目的IP地址和端口號的數據結構sockaddr的指針。
參數tolen可以設置爲sizeof(structsockaddr)。
系統調用sendto()返回實際發送的字節數,如果出錯則返回-1。
系統調用recvfrom()的使用方法也和recv()的十分近似:
int recvfrom(int sockfd, void* buf, int len, unsigned int flags
struct sockaddr* from, int* fromlen); 
參數from是指向本地計算機中包含源IP地址和端口號的數據結構sockaddr的指針。
參數fromlen設置爲sizeof(struct sockaddr)。
系統調用recvfrom()返回接收到的字節數,如果出錯則返回-1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章