Linux网络套接字(socket)

Linux网络套接字(socket)
概念:操作系统用于网络应用开发的一系列API函数

Windows下的socket属于一个句柄 而linux下的socket属于一个文件描述符 它是封装成一个文件描述符 但是创建的时候还是默认包含本机任意ip和随机端口端口号
Socketfd=socket(AF_INET,SOCK_STREAM,0)#创建socket
第一个参数是ip协议 AF_INET(ipv4)AF_INET6(ipv6)
第二参数是运输层协议SOCK_STREAM(流协议 大多数是TCP) SOCK_DRGAM(报文协议)
第三个参数就是几号运输层协议 如果是0号就是TCP协议
失败返回-1 并且设置errno
Bind
可以为socketfd指定ip地址和端口号(固定端口)
Bind(socketfd,(struct sockaddr*)&addr,sizeof(addr))
Strcut sockaddr_in addr;//保存网络信息的结构体
Addr.sin_family=AF_INET;
Addr.sin_port=8000;
Addr.sin_addr.s_addr=192.168.1.1
主机存储是小端 大端存储是网络
大小端转换的函数
Htons()#小端转小端端口
htonl#小端转大端ip
Ntohs#大端抓小端端口
Ntohl#大端转小端ip
Inet_pton();#字符串转大端存储32位ip
Inet_ntop();#大端存储转字符串
Return value -1失败 并设置errno
Listen();
用于监听网络事件并且连接动态和事件
Lsiten(tcp_socketfd,128);#128是监听序列号

会有两个队列 一个是等待队列 一个是成功队列 128是共用的监听序列 所以当由一个客户端来的时候先进入等待队列 等服务器同意连接的时候就会进入到握手成功的队列 如果监听的序列已经满的时候 再来客户端就会被RET复位 请求重新尝试
监听序列过少:序列使用异常 会导致大量客户端复位请求重连
监听序列过多:会导致无意义的系统开销和浪费

Accpet:
阻塞等待建立连接,某时刻接收到连接请求 唤醒完后TCP连接并进行三次握手
Socketfd=accept(my_socketfd,struct sockaddr_inc_addr,socklen_taddrsize);
参数:自己的socket 传出对方的网络信息 网络信息大小
连接成功成功返回socketfd 这个socketfd都对应一个请求连接端 通过socketdf与该端进行数据交互.
Return value -1 失败 并设置errno

Connect:与accept成对匹配
Connect(my socket,struct sockaddr*s_addr,sizeof(addr));//请求对方连接 自己的socket 对方的网络信息 信息大小
Return value 成功返回0 失败返回-1 并设置errno
网络测试命令 nc ip port
TCP常用的读写数据API read write send recv
UDP常用的读写数据 sendto recvfrom

Udp是面向无连接的,把dusocket函数的SOCK_STREAM改成SOCK_DGRAM,zhisever断不用daolisten和accept函数,client端不用connect函数,保留原来的数据

Socket编程中的nodelay
Tcp是流式传输 特点是可以拆包 组包
网络数据 以太网帧最少是64个字节 用户每次就发送一个字节(浪费)–>组合策略—>一起发送 —等待(包达到最小值)—算法 nagle用于合包
Nodelay 就是禁止nagle算法 有数据包立即发送

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值