常用的三种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));//地址是数据链路层的地址
上一篇:TCP/UDP协议


下一篇:2022-2-6数学day1