建站服務(wù)器
數(shù)據(jù)讀寫分為TCP數(shù)據(jù)讀寫,UDP數(shù)據(jù)讀寫,通用數(shù)據(jù)讀寫
1.TCP數(shù)據(jù)讀寫
定義:socket是連接用戶空間和內(nèi)核空間,TCP和UDP是內(nèi)核第一層。
解釋:對于文件的read和write同樣適用于socket
例子:對于TCP流數(shù)據(jù)的系統(tǒng)調(diào)用
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);
參數(shù)解釋:
1.3buf和len是指緩存區(qū)的位置和大小
1.3.1flags通常為0
recv成功返回實際讀取到的數(shù)據(jù)的長度
注:實際讀取的長度可能小于期望len,所以要多次調(diào)用recv
recv可能返回0,意味著通信對方已經(jīng)關(guān)閉了連接
recv出錯返回-1并設(shè)置errno
1.4send基本上同上
發(fā)送的實例代碼
int main(int argc, char *argv[]){
if(argc<=2){
printf(參數(shù)是錯誤);
}
//一系列之前的連接
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參數(shù)只對send和recv的當(dāng)前調(diào)用生效,可以使用setsockket系統(tǒng)調(diào)用來永久性修改socket的某些屬性