Socket Server指定监听端口和IP

Socket Server指定监听端口和IP

  TCP/IP进行网络编程时,会用到socket相关函数,各个函数的详细介绍在这里:
https://www.cnblogs.com/liedElxa/p/10795398.html

需求描述

  考虑到一种场景,在一个多网卡的服务器上,比如有10.0.0.1、10.0.0.2、10.0.0.3三个网卡都在使用,我们想做一个监听8080号端口的服务器,而且只有客户访问10.0.0.1:8080才会响应,访问10.0.0.2:8080或10.0.0.3:8080均不会收到回复。
  在进行TCP/IP网络编程过程中,一般在对serv_adr进行绑定时,使用serv_adr进行绑定。

解决方式

serv_adr结构体定义如下:

struct sockaddr_in {

  short int sin_family; 		/* 通信类型 */

  unsigned short int sin_port; /* 端口 */

  struct in_addr sin_addr; 	/* Internet 地址 */

  unsigned char sin_zero[8]; 	/* 与sockaddr结构的长度相同*/

};

而band()函数的定义如下:

// 将一个地址和端口信息address绑定到一个socket连接上
int bind(int socket,sockaddr * address,uint addrlen);
	// socket:之前创建的socket
	// sockaddr:一个用来存放Ip地址和端口号的结构体
	// addrlen:上述结构体的长度
	// 返回值:为-1表示失败,若端口被占用,会从新绑定一个随机端口(仍返回失败)
	// 地址绑定为0表示绑定本机所有IP,即INADDR_ANY(0.0.0.0)表示任何可绑定的地址

  所以,我们可以通过设置serv_adr结构体的s_addr值实现指定IP(10.0.0.1)的绑定,然后再调用bind()函数,之后的逻辑不变。

	memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    /* INADDR_ANY表示不管是哪个网卡接收到数据,只要目的端口是SERV_PORT,就会被该应用程序接收到 */
    //serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_addr.s_addr =  inet_addr("10.0.0.1");
    serv_adr.sin_port = htons(8080);
    //分配地址接受数据,不限制数据传输对象
    if (bind(serv_sock, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) == -1)
        error_handling("bind() error");

之后的编程流程不变。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python示例代码,用于循环监听端口并接收客户端连接请求: ```python import socket HOST = 'localhost' # 监听IP地址,默认为本机地址 PORT = 8888 # 监听端口号 BUFSIZ = 1024 # 缓冲区大小,用于接收客户端数据 # 创建一个 socket 对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定监听的地址和端口server_socket.bind((HOST, PORT)) # 开始监听端口,最大连接数为5 server_socket.listen(5) print('等待客户端连接...') while True: # 接收客户端连接请求 client_socket, addr = server_socket.accept() print('客户端已连接:', addr) # 接收客户端发送的数据,并返回响应数据 while True: data = client_socket.recv(BUFSIZ) if not data: break print('收到客户端数据:', data.decode()) client_socket.send(('你发送的数据是:' + data.decode()).encode()) # 关闭客户端连接 client_socket.close() ``` 在以上代码中,我们首先创建了一个 socket 对象,并使用 `bind()` 方法将其绑定到要监听的地址和端口号上。接着,我们使用 `listen()` 方法开始监听端口,并通过一个无限循环不断接收客户端连接请求。每当有新的客户端连接时,我们就会创建一个新的 socket 对象,并使用 `accept()` 方法接收客户端连接。然后,我们通过一个内部的循环来接收客户端发送的数据,并返回响应数据。当客户端关闭连接时,我们就会跳出循环并关闭客户端 socket 对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值