數據讀寫分爲TCP數據讀寫,UDP數據讀寫,通用數據讀寫
1.TCP數據讀寫
定義:socket是鏈接用戶空間和內核空間,TCP和UDP是內核第一層。
解釋:對於文件的read和write一樣適用於socket
例子:對於TCP流數據的系統調用
1.1ssize_t recv(int sockfd,void buf,size_t len,int flags);
1.2ssize_t send(int sockfd,const void buf,size_t len,int flags);緩存
參數解釋:
1.3buf和len是指緩存區的位置和大小
1.3.1flags一般爲0
recv成功返回實際讀取到的數據的長度
注:實際讀取的長度可能小於指望len,因此要屢次調用recv
recv可能返回0,意味着通訊對方已經關閉了鏈接
recv出錯返回-1並設置errnosocket
1.4send基本上同上
發送的實例代碼tcp
int main(int argc, char *argv[]){ if(argc<=2){ printf("參數是錯誤"); } //一系列以前的鏈接 if(connect(sockfd,(struct sockaddr*) &server_address,sizeof(server_address))<0){ printf("鏈接失敗"); }else{ const char* oob_data = "abc"; const char* normal_data = "123"; send(sockfd,normal_data,strlen(normal_data),0); sned(sockefd,oob_data,strlen(oob_data).MSG_OOB); send(sockfd,normal_data,strlen(normal_data),0); } close(sockfd); return 0; } //接收代碼也是相似的 //鏈接成功 int connfd = accept(sock,(struct sockaddr *) &client,&client_addrlength); char buffer[BUF_SIZE]; memset(buffer,'\0',BUF_SIZE); ret = recv(connfd,buffer,BUF_SIZE-1,0); close(connfd); close(sock); return 0; ./testoobrecv 192.168.1.109 54321 ./testoobsend 192.168.1.109 54321 tcpdump -ntx -i eth0 port 54321 注:flags參數只對send和recv的當前調用生效,能夠使用setsockket系統調用來永久性修改socket的某些屬性