socket编程:socket()函数详解
文章目录
- 1. 什么是socket?
- 1.1 意义
- 1.2 本质
- 1.3 应用
- 1.4 结论
- 2. socket() 函数参数介绍
- 2.1 参数1:int af
- 2.2 参数2:int type
- 2.3 参数3:int protocol
- 3. socket()函数返回值介绍
1. 什么是socket?
套接字函数创建一个绑定到特定传输服务提供者的套接字。
将底层复杂的协议体系,执行流程,进行了封装,封装完的结果,就是一个SOCKET了,也就是说,SOCKET是我们调用协议进行通信的操作接口。
1.1 意义
将复杂的协议过程与我们编程人员分开,我们直接操作一个简单SOCKET就行了,对于底层的协议过程细节,完全不用知道,这就大大方便了我们。
网络编程难就难在协议本身的复杂性,简单就简单在我们编程层面完全不用考虑那些。
1.2 本质
本质就是一种数据类型,转定义下看类型
就是一个整数(
unsigned int
)但是这个数是唯一的
- 标识着我们当前的应用程序,协议特点等信息
- ID,门牌号
1.3 应用
我们网络通信的函数,全部都要使用SOCKET
逻辑:
每个客户端有一个SOCKET,服务器有一个SOCKET,通信时候,就需要这个SOCKET做参数,给谁通信,就要传递谁的SOCKET。
1.4 结论
网络编程,理论层面SOCKET是网络封装的精华,代码层面就是不停的使用SOCKET这个变量,所以又叫SOCKET编程。
2. socket() 函数参数介绍
SOCKET WSAAPI socket(int af, //地址族规范。 地址族的可能值在Winsock2.h头文件中定义。int type,//新套接字的类型规范。int protocol//要使用的协议。
);
SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2.1 参数1:int af
地址族规范。 地址族的可能值在Winsock2.h头文件中定义。
在为Windows Vista和更高版本发布的Windows SDK上,头文件的组织已更改,并且地址族的可能值在Ws2def.h头文件中定义。 请注意,Ws2def.h头文件自动包含在Winsock2.h中,并且绝对不能直接使用。
当前支持的值为AF_INET或AF_INET6,这是IPv4和IPv6的Internet地址族格式。 如果安装了地址族的Windows套接字服务提供程序,则支持地址族的其他选项(例如,与NetBIOS一起使用的AF_NETBIOS)。 请注意,AF_地址族和PF_协议族常量的值是相同的(例如,AF_INET和PF_INET),因此可以使用任何一个常量。
下表列出了地址系列的常用值,尽管许多其他值也是可能的。
Af | Meaning |
---|---|
AF_UNSPEC 0 | 地址族未指定。 |
AF_INET 2 | Internet协议版本4(IPv4)地址族。 |
AF_IPX 6 | IPX / SPX地址族。 仅当安装了NWLink IPX / SPX NetBIOS兼容传输协议时,才支持此地址系列。WindowsVista和更高版本不支持此地址系列。 |
AF_APPLETALK 16 | AppleTalk地址族。 仅当安装了AppleTalk协议时才支持此地址系列。WindowsVista和更高版本不支持此地址系列。 |
AF_NETBIOS 17 | NetBIOS地址族。 仅当安装了用于NetBIOS的Windows套接字提供程序时,才支持此地址系列。在32位版本的Windows上支持用于NetBIOS的Windows套接字提供程序。 默认情况下,此提供程序安装在32位版本的Windows上.NetBIOS的Windows套接字提供程序在64位版本的Windows(包括Windows 7,Windows Server 2008,Windows Vista,Windows Server 2003或Windows XP)上不受支持。 用于NetBIOS的Windows套接字提供程序仅支持将* type 参数设置为* SOCK_DGRAM **的套接字。用于NetBIOS的Windows套接字提供程序与[NetBIOS]不直接相关(https://docs.microsoft.com/en -us / previous-versions / windows / desktop / netbios / portal)编程界面。 Windows Vista,Windows Server 2008和更高版本不支持NetBIOS编程接口。 |
AF_INET6 23 | Internet协议版本6(IPv6)地址族。 |
AF_IRDA 26 | 红外数据协会(IrDA)地址族。仅当计算机安装了红外端口和驱动程序时,才支持此地址族。 |
AF_BTH 32 | 蓝牙地址系列。如果计算机安装了蓝牙适配器和驱动程序,则Windows XP SP2或更高版本支持此地址系列。 |
2.2 参数2:int type
新套接字的类型规范。
套接字类型的可能值在Winsock2.h头文件中定义。
下表列出了Windows套接字2支持的type参数的可能值:
Type | Meaning |
---|---|
SOCK_STREAM 1 | 一种套接字类型,可通过OOB数据传输机制提供顺序的,可靠的,双向的,基于连接的字节流。 此套接字类型将传输控制协议(TCP)用于Internet地址系列(AF_INET或AF_INET6)。 |
SOCK_DGRAM2 | 一种支持数据报的套接字类型,这些数据报是无连接的,不可靠的最大长度固定(通常很小)的缓冲区。 此套接字类型对Internet地址系列(AF_INET或AF_INET6)使用用户数据报协议(UDP)。 |
SOCK_RAW3 | 提供原始套接字的套接字类型,该套接字允许应用程序操作下一个上层协议标头。 要操作IPv4标头,必须在套接字上设置IP_HDRINCL套接字选项。 要操作IPv6标头,必须在套接字上设置IPV6_HDRINCL套接字选项。 |
SOCK_RDM4 | 提供可靠消息数据报的套接字类型。 这种类型的一个示例是Windows中的实用通用多播(PGM)多播协议实现,通常称为可靠多播编程。仅当安装了可靠多播协议时才支持此* type *值。 |
SOCK_SEQPACKET5 | 一种套接字类型,可根据数据报提供伪流数据包。 |
在Windows套接字2中,引入了新的套接字类型。 应用程序可以通过WSAEnumProtocols函数动态发现每个可用传输协议的属性。 因此,应用程序可以确定地址族的可能套接字类型和协议选项,并在指定此参数时使用此信息。 随着新套接字类型,地址族和协议的定义,Winsock2.h和Ws2def.h头文件中的套接字类型定义将定期更新。
在Windows套接字1.1中,唯一可能的套接字类型是SOCK_DGRAM和SOCK_STREAM。
2.3 参数3:int protocol
要使用的协议。 protocol参数的可能选项特定于指定的地址族和套接字类型。 在Winsock2.h和Wsrm.h头文件中定义了协议的可能值。
在为Windows Vista和更高版本发布的Windows SDK上,头文件的组织已更改,并且此参数可以是Ws2def.h头文件中定义的IPPROTO枚举类型的值之一。 请注意,Ws2def.h头文件自动包含在Winsock2.h中,并且绝对不能直接使用。
如果指定的值为0,则调用者不希望指定协议,服务提供商将选择要使用的协议。
当af参数为AF_INET或AF_INET6且类型为SOCK_RAW时,在IPv6或IPv4数据包头的协议字段中设置为协议指定的值。
下表列出了该协议的通用值,尽管许多其他值也是可能的。
protocol | Meaning |
---|---|
IPPROTO_ICMP1 | The Internet Control Message Protocol (ICMP). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6 and the type parameter is SOCK_RAW or unspecified.This protocol value is supported on Windows XP and later. |
IPPROTO_IGMP2 | The Internet Group Management Protocol (IGMP). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6 and the type parameter is SOCK_RAW or unspecified.This protocol value is supported on Windows XP and later. |
BTHPROTO_RFCOMM3 | The Bluetooth Radio Frequency Communications (Bluetooth RFCOMM) protocol. This is a possible value when the af parameter is AF_BTH and the type parameter is SOCK_STREAM.This protocol value is supported on Windows XP with SP2 or later. |
IPPROTO_TCP6 | The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter is SOCK_STREAM. |
IPPROTO_UDP17 | The User Datagram Protocol (UDP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter is SOCK_DGRAM. |
IPPROTO_ICMPV658 | The Internet Control Message Protocol Version 6 (ICMPv6). This is a possible value when the af parameter is AF_UNSPEC, AF_INET, or AF_INET6 and the type parameter is SOCK_RAW or unspecified.This protocol value is supported on Windows XP and later. |
IPPROTO_RM113 | The PGM protocol for reliable multicast. This is a possible value when the af parameter is AF_INET and the type parameter is SOCK_RDM. On the Windows SDK released for Windows Vista and later, this protocol is also called IPPROTO_PGM.This protocol value is only supported if the Reliable Multicast Protocol is installed. |
3. socket()函数返回值介绍
SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (INVALID_SOCKET == socketServer)
{int a = WSAGetLastError();printf("socket function failed with error = %d\n", a);//清理网络库WSACleanup();return 1;
}closesocket(socketServer);
如果没有发生错误,socket将返回一个引用新socket的描述符。否则,将返回INVALID_SOCKET 的值,并且可以通过调用WSAGetLastError检索特定的错误代码。
Error code | Meaning |
---|---|
WSANOTINITIALISED | A successful WSAStartup call must occur before using this function. |
WSAENETDOWN | The network subsystem or the associated service provider has failed. |
WSAEAFNOSUPPORT | The specified address family is not supported. For example, an application tried to create a socket for the AF_IRDA address family but an infrared adapter and device driver is not installed on the local computer. |
WSAEINPROGRESS | A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function. |
WSAEMFILE | No more socket descriptors are available. |
WSAEINVAL | An invalid argument was supplied. This error is returned if the af parameter is set to AF_UNSPEC and the type and protocol parameter are unspecified. |
WSAEINVALIDPROVIDER | The service provider returned a version other than 2.2. |
WSAEINVALIDPROCTABLE | The service provider returned an invalid or incomplete procedure table to the WSPStartup. |
WSAENOBUFS | No buffer space is available. The socket cannot be created. |
WSAEPROTONOSUPPORT | The specified protocol is not supported. |
WSAEPROTOTYPE | The specified protocol is the wrong type for this socket. |
WSAEPROVIDERFAILEDINIT | The service provider failed to initialize. This error is returned if a layered service provider (LSP) or namespace provider was improperly installed or the provider fails to operate correctly. |
WSAESOCKTNOSUPPORT | The specified socket type is not supported in this address family. |
socket编程:socket()函数详解相关推荐
- linux socket编程 accept函数详解
int accept(int sockfd,struct sockaddr * addr,socklen_t * addrlen); sockfd的参数为listen()函数返回的监听套接字: add ...
- Linux Socket API Connect 函数详解
在讲解套接字编程函数之前,有必要对socket编程的两个不可或缺的结构体进行说明. 第一个结构体式struct sockaddr..这个结构为许多类型的套接字储存套接字地址信息: Sockaddr结构 ...
- Linux socket下read函数详解
在socket中服务器与客户端进行通信,当其中一方调用close(即这一方会发送一个fin)关闭套接字之后,另一方read()会返回一个0. 服务器开两个进程,一个用于接收客户端发送的数据,另一个进程 ...
- linux网络编程常用函数详解与实例(socket--bind--listen--accept)
常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可 ...
- Window编程主函数详解
Windows编程中主函数是非常重要的,但是却在编写上非常简单(可能我这个初学者还不是很理解),有的时候我们.总体上可以分为这几个部分. 第一个是主函数的生命 WinMain(),这个含函数在百度上是 ...
- Windows编程—BroadcastSystemMessage函数详解
介绍 BroadcastSystemMessage函数 可以发送一个消息给指定一类接受者(从Broadcast就可以看出,广播的意思).这里的接受者可以是,一般的应用程序.可装载的驱动程序.网络驱动程 ...
- Linux文件编程常用函数详解——lseek()函数
lseek()函数的头文件和形式: #include <sys/types.h> #include <unistd.h> off_t lseek(int filedes, of ...
- socket编程流程及函数详解
socket编程流程及函数详解-服务器端 一.创建socket 二.命名socket 2.1通用的socket地址结构体 2.2专用socket地址 三.监听socket 四.接受连接 五.总结 一. ...
- 常用socket函数详解
常用socket函数详解 关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄 ...
- linux Socket send与recv函数详解
转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include &l ...
最新文章
- 判断二叉树是否为平衡二叉树
- cdoj916-方老师的分身 III 【拓扑排序】
- [LOJ3153] 三级跳(单调栈 + 线段树)
- css两列显示,div+css如何控制信息分两列显示?
- sun.misc jar包
- POJ 3294 Life Forms
- 限时下载 | 132G编程资料:Python、JAVA、C,C++、机器人编程、PLC,入门到精通~
- 我的OpenCV4学习之旅(1)-OpenCV4初步了解
- 32位和64位CPU操作系统的区别
- 胜负无定数,敢搏成七分
- 夏にありがとう(向夏天致谢)-因幡晃
- hdu 4417 Super Mario
- 关于使用Navicat,Mysql Workbench,PowerDesigner根据mysql数据库生成ER(实体联系图)的解决方案的总结
- Vue Video.js播放m3u8视频流格式(video+videojs-contrib-hl)
- python蜂鸣器天空之城频率_用python来一首钢琴solo天空之城
- 【杰理AC695X】7脚屏PWM控制亮度
- ALTER TABLESPACE COALESCE
- CMMI的五个级别及其特征简述
- Jetson nano 摄像头二维码识别 Opencv zbar QT
- 西部网盘 如何去掉硬盘wd drive unlock
热门文章
- HDU-6386 Age of Moyu (想法+迪杰斯特拉)
- ADB实用命令(配合bat实现自动手机自动操作,如打卡、签到)
- linux 原城关机,中标普华Linux操作系统成功解决方案
- 近日移动硬盘和硬盘盒的选购
- 本机dns服务器地址
- DIY个人智能家庭网关—— python篇之获取路由器外网地址
- All - 博文总纲
- mount查看linux分区大小,【128】Linux 中磁盘空间查询df、du和分区fdisk和挂载mount
- linuxprobe 第0章
- H5跳回小程序的wx.miniProgram.navigateTo不起效果,无法跳转页面,已解决