TCP、UDP套接字的數據傳輸。本站提示廣大學習愛好者:(TCP、UDP套接字的數據傳輸)文章只能為提供參考,不一定能成為您想要的結果。以下是TCP、UDP套接字的數據傳輸正文
tcp發送數據:
1 #include <sys/types.h> 2 #include <socket.h> 3 ssize_t send(int sockfd,const void *msg,size_t len,int flags);
函數send只能對面向連接的套接字使用。參數sockfd為已經建立好連接的套接字描述符。參數msg指向待發送數據的緩沖區,參數len為代發數據的長度。參數flags為控制選項:
MSG_OOB:在指定的套接字上發送帶外數據(out-of-band data),該類型的套接字必須支持帶外數據(如SOCK_STREAM)。
MSG_DONTROUTE:通過最直接的路徑發送數據,而忽略下層協議的路由設置。
PS:函數執行成功只是說明數據寫入套接字的緩沖區中,並不表示數據已經成功地通過網絡發送到目的地。
tcp接收數據:
#include <sys/types.h> #include <sys/socket.h> ssize_t recv(int sockfd,void *buf,size_t len,int flags);
函數從sockfd接受數據並保存到參數buf中,參數len為緩沖區的長度。(只能是面向連接的套接字)參數flags為控制選項:
MSG_OOB:請求接受帶外數據。
MSG_PEEK:只查看數據而不讀出。
MSG_WAITALL:只在接受緩沖區滿時才返回。
如果一個數據報太長以至於無法完全放下時,剩余部分將可能丟棄。如果在指定的套接字上無數據到達時,recv函數將阻塞。成功返回收到的字節數,出錯-1,錯誤代碼errno。
UDP發送數據:
#include <sys/types.h> #include <sys/socket.h> ssize_t sendto(int sockfd,const void *msg,size_t len,int flags, const struct sockaddr *to,socklen_t tolen);
函數sendto的功能和send類似,但函數sendto不需要套接字一定是面向連接的,所以該函數主要用來發送UDP數據。參數to指定目的地地址。
UDP接收數據:
#include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags, struct sockaddr *from,socklen_t *fromlen);
函數recvfrom與函數recv類似,但recvfrom不要求套接字一定是面向連接的。如果參數from非空,且該套接字不是面向連接的,則函數返回時,參數from中將保存數據的源地址。
關閉套接字:
#include <unistd.h> int close(int fd);
#include <sys/socket.h> int shutdown(int s,int how);
參數how的取值:
SHUT_RD:將連接的讀通道關閉,接收緩沖區中的未讀取數據將丟棄,仍可以發送數據。
SHUT_WR:將連接的寫通道關閉,發送緩沖區中的為發送的數據丟棄,仍可以接收數據。
SHUT_REWR:讀寫通道都關閉。
成功0,出錯-1,errno。