Linux C 网络_绑定套接字函数

编程入门 行业动态 更新时间:2024-10-24 22:28:00

Linux C 网络_<a href=https://www.elefans.com/category/jswz/34/1769902.html style=绑定套接字函数"/>

Linux C 网络_绑定套接字函数

在创立了套接字之后需要将本地地址和套接字绑定在一起,此时可以调用 bind 函数。

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数 sockfd 是使用 socket 函数创建的套接字对应的套接字描述符,addr 是本地地址,addrlen 是套接字对应的地址结构长度;如果 bind 函数执行成功,则返回 0,否则返回 -1。

在网络通信中服务器和客户端都可以使用 bind 函数来设置套接字地址,通常来说有以下5种模式:

  • 服务器指定套接字地址的公认端口号,不指定IP地址,服务器调用函数bind时,如果设置套接字的IP地址为特殊的INADDR ANY, 表示它愿意接收来自任何网络设备接口的客户端连接,这是服务器最经常使用的绑定方式。
  • 服务器指定套接字地址的公认端口号和IP地址,服务器调用函数bind时,如果设置套接字的 IP 地址为某个本地 IP 地址,则表示服务器只接收来自对应于这个 IP 地址的特定网络设备接口的客户端连接。如果这台机器只有一个网络设备接口,则这和第一种情况是没有区别的,但当这台机器有多个网络设备接口时,我们可以用这种方式来限制服务器的接收范围。
  • 客户端指定套接字地址的连接端口号,在一般情况下,客户端不用指定自己的套接字地址的端口号,当客户端调用函数 connect 进行 TCP 连接时,系统会自动为它选择一个未用的端口号,并且用本地的 IP 地址来填充套接字地址中的相应项,但在有的情况下,客户端需要使用特定端口号。
  • 指定客户端的 IP 地址和连接端口号,表示客户端使用指定的网络设备接口和端口号进行通信。
  • 指定客户端的 IP 地址,表示客户端使用指定的网络设备接口进行通信,系统自动为客户端选择一个未用的端口号。一般情况下,只有在主机有多个网络设备接口时使用。
C/SIPport说明
服务器INADDR_ANY非 0 值指定服务器的公认端口号
服务器本地 IP 地址非 0 值指定服务器的 IP 地址和公认端口号
客户端INADDR_ANY非 0 值指定客户端的连接端口号
客户端本地 IP 地址非 0 值指定客户端的 IP 地址和连接端口号
客户端本地 IP 地址0指定客户端的 IP 地址

在编写客户端程序时,通常不要使用固定的客户端端口号,除非是在必须使用特定端口的情况下,因为固定客户机端口号会带来一些不便, 例如:

  • 服务器执行主动关闭操作:服务器最后进入 TIME_WAIT 状态。当客户机再次与这个服务器进行连接时,仍使用相同的客户机端口号,于是这个连接与前次连接的套接字对完全相同,但是因为前次连接处于 TIME_WAIT 状态,并未消失,所以这次连接请求被拒绝,函数 connect 以错误返回。
  • 客户端执行手动关闭操作:客户端最后进入 TIME_WAIT 状态,当立刻再次执行这个客户机程序时,客户机将继续与这个固定客户机端口号绑定,但因为前次连接处于 TIME_WAIT 状态,并未消失,系统会发现这个端口号仍被占用,所以这次绑定操作失败,函数 bind 以错误返回。

【例2】使用 bind 函数绑定套接字
应用代码定义了一个 IPv4 的套接字地址数据结构变量 addr,首先使用 socket 函数创建一个套接字,然后使用 bzero 函数将结构变量 addr 的值清空,分别设置结构体的各个分量,最后调用函数将这个变量绑定到刚刚创建的套接字上。

实例的应用代码如下:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>#define PORT 5555    //定义端口号int main(int argc, char *argv[])
{int sockfd;     //定义套接口描述符struct sockaddr_in addr;   //定义 IPv4 套接口地址数据结构 addr int addr_len = sizeof(struct sockaddr_in);   if(sockfd = socket(AF_INET, SOCK_STREAM,0) < 0)   //建立一个 socket{printf("创建套接字失败!\n");return 1;}bzero(&addr, sizeof(struct sockaddr_in));  //清空表示地址的结构体变量addr.sin_family = AF_INET;    //设置 addr 的成员信息addr.sin_port = htons(PORT);addr.sin_addr.s_addr = htonl(INADDR_ANY);  //IP地址设为本机IPif(bind(sockfd, (struct sockaddr *)(&addr), sizeof(strut sockaddr))<0){printf("绑定端口失败!");return 1;}return 0;
}

该程序没有输出。

更多推荐

Linux C 网络_绑定套接字函数

本文发布于:2023-07-28 16:29:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1250172.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:绑定   函数   网络   Linux

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!