csdn火木達人
建立好了socket連線之後,我們就可以把得到的fd當作檔案描述符來使用,一下三種方式可用於socket資料收發
1.connect() + write() + read() : 適用於tcp
標頭檔案:
#include
#include
#include
ssize_t write(int d,const void *buf,size_t nbytes);
呼叫成功返回成功寫入的位元組數,呼叫失敗則返回-1。
引數1為物件的控制代碼;
引數2是寫入的內容;
引數3是前者的大小。
ssize_t read(int d,void *buf,size_t nbytes);
正常呼叫返回成功讀入的位元組數,當讀到控制代碼物件的底部時返回0,呼叫失敗返回-1。
引數1為物件控制代碼;
引數2是讀入容器的位址;
引數3是前者的大小。
2.sendto() + recvfrom() : 適用於tcp、udp,多數用於udp
標頭檔案:
#include
#include
ssize_t sendto(int s,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_t tolen);
呼叫成功返回成功寫入的位元組數,呼叫失敗則返回-1。
引數1是套接字控制代碼;
引數2是需要傳送的資料;
引數3是前者的大小;
引數4是特殊傳輸標識,其值多為0;
引數5是傳送目的地的sockaddr結構主機位址的指標值;
引數6是前者的長度。
ssize_t recvfrom(int s,void *buf,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);
正常呼叫返回成功讀入的位元組數,呼叫失敗返回-1。
引數1是套接字控制代碼;
引數2是成功接收到遠端傳輸過來後的資料時放入的變數位址;
引數3是前者的大小;
引數4是特殊傳輸標識,其值多為0;
引數5是接收到的資料的傳送端的sockaddr結構主機位址的指標值;
引數6是前者長度的位址值。
3.connect() + send() + recv() : 適用於tcp、udp,多數用於tcp
標頭檔案:
#include
#include
ssize_t send(int s, const void *msg, size_t len, int flags);
呼叫成功返回成功寫入的位元組數,呼叫失敗則返回-1。
引數1是套接字控制代碼;
引數2是需要傳送的資料;
引數3是前者的大小;
引數4是特殊傳輸標識,其值多為0。
ssize_t recv(int s, void *buf, size_t len, int flags);
正常呼叫返回成功讀入的位元組數,呼叫失敗返回-1。
引數1是套接字控制代碼;
引數2是成功接收到遠端傳輸過來後的資料時放入的變數位址;
引數3是前者的大小;
引數4是特殊傳輸標識,其值多為0。
send和recv的第四個引數也可以是以下的組合
msg_dontroute:不查詢路由表
msg_oob:接受或傳送帶外資料
msg_peek:檢視資料,並不從系統緩衝區移走資料
msg_waitall : 等待任何資料
msg_dontwait : 僅本操作非阻塞
假如flags為0,則和read,write相同的操作
Socket收發資料
client write server client read 位元組數writebyte unsignedbyte readunsignedbyte 1 writelengthstring string readstring writebyte byte readbyte 1 writeunsig...
Linux C UDP資料收發
基於udp的通訊時不可靠地,面向無連線的,傳送的資料無法確切知道對方收到沒有,通常用於對可靠性要求不高的通訊中,使用簡單,udp沒有嚴格區分server端和client端,唯一的區別是綁不繫結 bind 埠。1,接收程式 server include include include include ...
socket資料收發
socket讀寫 tcp協議是面向流的,read和write呼叫的返回值往往小於引數指定的位元組數。對於read呼叫,如果接收緩衝區中有20位元組,請求讀100個位元組,就會返回20。對於write呼叫,如果請求寫100個位元組,而傳送緩衝區中只有20個位元組的空閒位置,那麼write會阻塞,直到把...