常用的三种socket总结

简述

    在网络开发过程中常用三种socket(不具体区分协议),一种是传输层socket,使用该层socket的时候你可以具体的选择TCP或UDP,使用的时候你需要指明对端的ip与port,以及需要发送的数据;第二种是网络层socket,使用该层socket你可以自己进行组包(ip层与传输层),发送的时候还是需要指明ip(路由需要),但port不再需要(大于0就行),该好处是相比于链路层socket省去了组MAC头部的烦恼(ARP),但性能相比链路层稍低(毕竟走内核了);以上两种socket都是需要经过内核协议栈的,使用的时候需要指明AF_INET,第三种socket不走内核协议栈,直接通过网卡发包,所以需要你自己组包(从MAC开始),收包的时候也需要自己解析包(有相关的依赖包用于收发包,也挺方便的),使用的时候指明AF_PACKET。

相关函数

1、传输层
//socket的建立
socket(AF_INET, SOCK_STREAM, 0); //TCP
socket(AF_INET, SOCK_DGRAM, 0);   //UDP
//发送
sendto(sd, sendBuffer,BUFSIZE, 0, (SOCKADDR*)&addrServ, sizeof(SOCKADDR));//UDP
send(sd, sendBuffer, BUFSIZE, 0); //TCP(由于先connet了,所以发送不需要指定地址)
//接收
recvfrom(sd, recvBuffer, BUFSIZE,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));//UDP
recv(sd, recvBuffer, BUFSIZE, 0);//TCP
2、网络层
//socket的建立
socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
setsockoptInt(fd, IPPROTO_IP, IP_HDRINCL, 1);//自定义ip头部
//发送
sendto(sd, sendBuffer,BUFSIZE, 0,(SOCKADDR*)&addrServ,sizeof(SOCKADDR));//UDP
send(sd, sendBuffer, BUFSIZE, 0); //TCP(由于先connet了,所以发送不需要指定地址)
//接收
recvfrom(sd, recvBuffer, BUFSIZE,0, (SOCKADDR*)&addrClient, sizeof(SOCKADDR));//UDP
recv(sd, recvBuffer, BUFSIZE, 0);//TCP
3、链路层
//socket的建立
socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));//第三个参数可以为ETH_P_ALL ETH_P_IP等
//发送
sendto(sock, sendBuffer, BUFSIZE, 0, (struct sockaddr *) &client, sizeof(client)); //地址为链路层地址
//接收
recvfrom(sock, recvBuffer, BUFSIZE, 0, (struct sockaddr *)&client, sizeof(client));//地址是数据链路层的地址
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要出家当道士

打赏是不可能,这辈子都不可能

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值