linux高性能网络编程读书笔记之socket数据读写-创新互联
数据读写分为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 voidbuf,size_t len,int flags);
参数解释:
1.3buf和len是指缓存区的位置和大小
1.3.1flags通常为0
recv成功返回实际读取到的数据的长度
注:实际读取的长度可能小于期望len,所以要多次调用recv
recv可能返回0,意味着通信对方已经关闭了连接
recv出错返回-1并设置errno
1.4send基本上同上
发送的实例代码
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的某些属性
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享标题:linux高性能网络编程读书笔记之socket数据读写-创新互联
网页地址:http://azwzsj.com/article/dspdji.html