C/绑定多个套接字[在不同的网络端口上]

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

我想在不同的端口上绑定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 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!!!现在它正在工作。我应该删除该问题吗?!