技术培训学校机构做360手机网站优化
news/
2025/10/3 19:45:41/
文章来源:
技术培训学校机构,做360手机网站优化,南昌建站,WordPress 黛米付1.1. Socket简介
套接字#xff08;socket#xff09;是一种通信机制#xff0c;凭借这种机制#xff0c; 客户端-服务器 模型的通信方式既可以在本地设备上进行#xff0c;也可以跨网络进行。
Socket英文原意是“孔”或者“插座”的意思#xff0c;在网络编程… 1.1. Socket简介
套接字socket是一种通信机制凭借这种机制 客户端-服务器 模型的通信方式既可以在本地设备上进行也可以跨网络进行。
Socket英文原意是“孔”或者“插座”的意思在网络编程中通常将其称之为“套接字”当前网络中的主流程序设计都是使用Socket进行编程的因为它简单易用它还是一个标准BSD Socket能在不同平台很方便移植比如你的一个应用程序是基于Socket编程的那么它可以移植到任何实现BSD Socket标准的平台比如LwIP它兼容BSD Socket又比如Windows它也实现了一套基于Socket的套接字接口更甚至在国产操作系统中如RT-Thread它也实现了BSD Socket标准的Socket接口。
在Socket中它使用一个套接字来记录网络的一个连接套接字是一个整数就像我们操作文件一样利用一个文件描述符可以对它打开、读、写、关闭等操作类似的在网络中我们也可以对Socket套接字进行这样子的操作比如开启一个网络的连接、读取连接主机发送来的数据、向连接的主机发送数据、终止连接等操作。
Linux系统中的套接字相关的函数注意要包含网络编程中常用的头文件
#include sys/types.h
#include sys/socket.h
1.2. socket()
函数原型
int socket(int domain, int type, int protocol);
socket()函数用于创建一个socket描述符socket descriptor它唯一标识一个socket这个socket描述字跟文件描述字一样后续的操作都有用到它把它作为参数通过它来进行一些读写操作。
创建socket的时候也可以指定不同的参数创建不同的socket描述符socket函数的三个参数分别为1. domain参数domain表示该套接字使用的协议族在Linux系统中支持多种协议族对于TCP/IP协议来说选择AF_INET就足以当然如果你的IP协议的版本支持IPv6那么可以选择AF_INET6可选的协议族具体见 AF_UNIX, AF_LOCAL 本地通信AF_INET IPv4 AF_INET6 IPv6 AF_IPX IPX - Novell 协议 AF_NETLINK 内核用户界面设备 AF_X25 ITU-T X.25 / ISO-8208 协议 AF_AX25 业余无线电 AX.25 协议 AF_ATMPVC 访问原始ATM PVC AF_APPLETALK AppleTalk AF_PACKET 底层数据包接口 AF_ALG 内核加密API的AF_ALG接口 2. type参数type指定了套接字使用的服务类型 可能的类型有以下几种 SOCK_STREAM提供可靠的即能保证数据正确传送到对方面向连接的Socket服务多用于资料如文件传输如TCP协议。 SOCK_DGRAM是提供无保障的面向消息的Socket 服务主要用于在网络上发广播信息如UDP协议提供无连接不可靠的数据报交付服务。 SOCK_SEQPACKET为固定最大长度的数据报提供有序的可靠的基于双向连接的数据传输路径。 SOCK_RAW表示原始套接字它允许应用程序访问网络层的原始数据包这个套接字用得比较少暂时不用理会它。 SOCK_RDM提供不保证排序的可靠数据报层。 3. protocol参数protocol指定了套接字使用的协议在IPv4中只有TCP协议提供SOCK_STREAM这种可靠的服务只有UDP协议提供SOCK_DGRAM 服务对于这两种协议protocol的值均为0因为当protocol为0时会自动选择type类型对应的默认协议。
当创建套接字成功的时候该函数返回一个int类型的值也就是socket描述符该值大于等于0而如果创建套接字失败时则返回-1。
1.3. bind() 函数原型
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
在套接口中一个套接字只是用户程序与内核交互信息的枢纽它自身没有太多的信息也没有网络协议地址和端口号等信息在进行网络通信的时候必须把一个套接字与一个IP地址或端口号相关联这个过程就是绑定的过程。
bind()函数用于将一个 IP 地址或端口号与一个套接字进行绑定许多时候内核会帮我们自动绑定一个IP地址与端口号然而有时用户可能需要自己来完成这个绑定的过程以满足实际应用的需要最典型的情况是一个服务器进程需要绑定一个众所周知的地址和端口以等待客户来连接作为服务器端这一步绑定的操作是必要的而作为客户端则不是必要的因为内核会帮我们自动选择合适的IP地址与端口号。 psbind()函数并不是总是需要调用的只有用户进程想与一个具体的地址或端口相关联的时候才需要调用这个函数。如果用户进程没有这个需要那么程序可以依赖内核的自动的选址机制来完成自动地址选择。 参数 sockfdsockfd是由socket()函数返回的套接字描述符。my_addrmy_addr是一个指向套接字地址结构的指针。addrlenaddrlen指定了以addr所指向的地址结构体的字节长度。
若bind()函数绑定成功则返回0若出错则为-1。
sockaddr 结构内容如下
sockaddr结构
struct sockaddr {sa_family_t sa_family;char sa_data[14];
}
咋一看这个结构体好像没啥信息要我们填写的确实也是这样子我们需要填写的IP地址与端口号等信息都在sa_data连续的14字节信息里面但这个结构对用户操作不友好一般我们在使用的时候都会使用sockaddr_in结构sockaddr_in和sockaddr是并列的结构占用的空间是一样的指向sockaddr_in的结构体的指针也可以指向sockadd的结构体并代替它而且sockaddr_in结构对用户将更加友好在使用的时候进行类型转换就可以了。
sockaddr_in结构
struct sockaddr_in {short int sin_family; /* 协议族 */unsigned short int sin_port; /* 端口号 */struct in_addr sin_addr; /* IP地址 */unsigned char sin_zero[8]; /* sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节 */
};
这个结构体的第一个字段是与sockaddr结构体是一致的而剩下的字段就是sa_data连续的14字节信息里面的内容只不过从新定义了成员变量而已sin_port字段是我们需要填写的端口号信息sin_addr字段是我们需要填写的IP地址信息剩下sin_zero 区域的8字节保留未用。
举个简单的使用实例
struct sockaddr_in server;bzero(server, sizeof(server));// assign IP, PORT
server.sin_family AF_INET;
server.sin_addr.s_addr htonl(INADDR_ANY);
server.sin_port htons(6666);// binding newly created socket to given IP and verification
bind(sockfd, (struct sockaddr*)server, sizeof(server));
参考资料
1.【野火】《i.MX Linux开发实战指南》
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926255.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!