C/绑定多个套接字[在不同的网络端口上]
我想在不同的端口上绑定4个套接字。不知何故,我总是得到已在使用的C/绑定多个套接字[在不同的网络端口上],c,sockets,C,Sockets,我想在不同的端口上绑定4个套接字。不知何故,我总是得到已在使用的:地址的错误。对于第一个循环,caseport1它正在工作,但是在第二次运行时,我得到了上面提到的错误。如果有人能仔细看看我的代码,那就太好了 输出如下所示: thread 0 started, pc_packet_receiver sock_fd[8] sock_fd[8], fdmax[8] sock_fd[9] error: could not bind UDP socket, port2 : Address already
:地址的错误。对于第一个循环,caseport1
它正在工作,但是在第二次运行时,我得到了上面提到的错误。如果有人能仔细看看我的代码,那就太好了
输出如下所示:
thread 0 started, pc_packet_receiver
sock_fd[8]
sock_fd[8], fdmax[8]
sock_fd[9]
error: could not bind UDP socket, port2
: Address already in use
如您所见,循环中的第一个printf
将被处理两次,当为PORT2
调用bind
时,程序崩溃
sock\u fd
是一个文件描述符数组
sock\u addr\u端口[1..4]
有四种不同的struct sock\u addr
- 值
PORT1/PORT2/PORT3/PORT4
在enum[1..4]
- 最后,我想将所有
sock\u fd[I]
添加到fd\u集合中
以使用select
事先非常感谢您的帮助
for(i = 0; i < 4; i++) {
if((sock_fd[i] = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("error: could not open UDP socket\n");
exit(EXIT_FAILURE);
}
printf("\tsock_fd[%d]\n", sock_fd[i]);
switch (i+1) {
case PORT1:
bzero(&sock_addr_port1, sock_len_port1);
sock_addr_port1.sin_family = AF_INET;
sock_addr_port1.sin_port = htons(ETH_PORT1);
sock_addr_port1.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sock_fd[i], (struct sockaddr *) &sock_addr_port1, sock_len_port1) < 0) {
perror("error: could not bind UDP socket, port1\n");
exit(EXIT_FAILURE);
}
break;
case PORT2:
bzero(&sock_addr_port2, sock_len_port2);
sock_addr_port2.sin_family = AF_INET;
sock_addr_port2.sin_port = htons(ETH_PORT2);
sock_addr_port2.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sock_fd[i], (struct sockaddr *) &sock_addr_port2, sock_len_port2) < 0) {
perror("error: could not bind UDP socket, port2\n");
exit(EXIT_FAILURE);
}
break;
case PORT3:
bzero(&sock_addr_port3, sock_len_port3);
sock_addr_port3.sin_family = AF_INET;
sock_addr_port3.sin_port = htons(ETH_PORT3);
sock_addr_port3.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sock_fd[i], (struct sockaddr *) &sock_addr_port3, sock_len_port3) < 0) {
perror("error: could not bind UDP socket, port3\n");
exit(EXIT_FAILURE);
}
break;
case PORT4:
bzero(&sock_addr_port4, sock_len_port4);
sock_addr_port4.sin_family = AF_INET;
sock_addr_port4.sin_port = htons(ETH_PORT4);
sock_addr_port4.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sock_fd[i], (struct sockaddr *) &sock_addr_port4, sock_len_port4) < 0) {
perror("error: could not bind UDP socket, port4\n");
exit(EXIT_FAILURE);
}
break;
default:
break;
}
FD_SET(sock_fd[i], &read_fds);
fdmax = sock_fd[i];
printf("sock_fd[%d], fdmax[%d]\n", sock_fd[i], fdmax);
}
(i=0;i<4;i++)的{
如果((sock_fd[i]=套接字(AF_INET,sock_DGRAM,0))<0){
perror(“错误:无法打开UDP套接字\n”);
退出(退出失败);
}
printf(“\tsock\u fd[%d]\n”,sock\u fd[i]);
开关(i+1){
案例1:
bzero(和短袜地址端口1、短袜长度端口1);
sock\u addr\u port1.sin\u family=AF\u INET;
sock\u addr\u port 1.sin\u port=htons(ETH\u port 1);
sock_addr_port1.sin_addr.s_addr=htonl(INADDR_ANY);
if(绑定(sock\u fd[i],(struct sockaddr*)和sock\u addr\u端口1,sock\u len\u端口1)<0){
perror(“错误:无法绑定UDP套接字,端口1\n”);
退出(退出失败);
}
打破
案例2:
bzero(和短袜地址端口2、短袜长度端口2);
sock\u addr\u port2.sin\u family=AF\u INET;
sock_addr_port 2.sin_port=htons(ETH_port 2);
sock_addr_port2.sin_addr.s_addr=htonl(INADDR_ANY);
if(绑定(sock\u fd[i],(struct sockaddr*)和sock\u addr\u端口2,sock\u len\u端口2)<0){
perror(“错误:无法绑定UDP套接字,端口2\n”);
退出(退出失败);
}
打破
案例3:
bzero(和短袜地址端口3、短袜长度端口3);
sock\u addr\u port3.sin\u family=AF\u INET;
sock_addr_port 3.sin_port=htons(ETH_port 3);
sock_addr_port3.sin_addr.s_addr=htonl(INADDR_ANY);
if(绑定(sock\u fd[i],(struct sockaddr*)和sock\u addr\u端口3,sock\u len\u端口3)<0){
perror(“错误:无法绑定UDP套接字,端口3\n”);
退出(退出失败);
}
打破
案例4:
bzero(和短袜地址端口4、短袜长度端口4);
sock_addr_port4.sin_family=AF_INET;
sock地址端口4.sin端口=htons(ETH端口4);
sock_addr_port4.sin_addr.s_addr=htonl(INADDR_ANY);
if(绑定(sock\u fd[i],(struct sockaddr*)和sock\u addr\u端口4,sock\u len\u端口4)<0){
perror(“错误:无法绑定UDP套接字,端口4\n”);
退出(退出失败);
}
打破
违约:
打破
}
FD_集(sock_FD[i]、&read_fds);
fdmax=sock_fd[i];
printf(“sock_fd[%d],fdmax[%d]\n”,sock_fd[i],fdmax);
}
现在正在运行另一个进程,它使用的是ETH\u PORT2
。当您在命令行上运行netstat-tan
(-tn
在Windows上)时,应该能够看到这一点
谷歌搜索“哪个进程使用哪个端口”来查看如何找到进程。什么是ETH_PORT1
,ETH_PORT2
,等等?除非您将ETH_PORT2
定义为与ETH_PORT1
相同,否则应该不会有问题。不过需要注意的是:switch
语句中有很多重复的代码,只需设置要绑定的端口,然后在switch
语句之后执行实际的bind
(以及所有其他设置)。伙计们,非常感谢,我在复制某些行时犯了一个“愚蠢”的错误,当然你是对的,ETH_PORT1
和ETH_PORT2
被定义为具有相同的值:(man!!!现在它正在工作。我应该删除该问题吗?!