socket读写 linux,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的某些属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值