c - 绑定(bind)服务器套接字: : Address already in use. UDP C编程时出错

标签 c linux sockets

我在创建第二个套接字时遇到问题

这是部分代码

int serverSock;
int clientSock ,newSock;
struct sockaddr_in clientInfo ;
struct sockaddr_in server;
struct addrinfo;
int serverPort;
int sockLength;
char destIP[MAXSIZE];
int destPort;

错误发生在这个函数中,特别是在绑定(bind)中

int createSocket(int port){
    sockLength=sizeof(struct sockaddr_in); // get struct size
    if(( serverSock=socket(AF_INET,SOCK_DGRAM,0)) ==-1) // create the socket
        perror("\nError in Creating socket ");

    memset(&server,0, sizeof(server)); // initialize the socket information
    server.sin_family=AF_INET; // ipv4
    server.sin_port=htons(port); //server port
    server.sin_addr.s_addr=INADDR_ANY; //server IP
    bzero(&server.sin_zero,8);

    if ((bind(serverSock,(struct sockaddr *)&server,sizeof(server)))==-1) // bind the socket with the information
        perror("\nError In Binding server Socket: ");

}

void main(int args, char * argv[]){

    serverPort=atoi(argv[1]);
    createSocket(serverPort); // creating the main Server socket

    printf("%s","Server Is Wating For connections....\n");
    int chkRcv=1;
    struct packet pktToSend;
    struct frame rcvFrm ,frmToSend;
    int ports[]={25011,104002,110003,105004,100705}; // array of ports;
    int portsPtr=0;


    while(1){ // while connection is ok
    printf("Server is listening to %i \n",serverSock);
        if((chkRcv=recvfrom(serverSock ,&rcvFrm,sizeof(rcvFrm),0, (struct sockaddr *)&clientInfo, &sockLength))== 0){ // receive from client
            perror("Client Disconnected......\n");               
            //break;
        }
        strcpy(destIP,rcvFrm.sourceIP);//getClietn IP
        destPort=rcvFrm.pkt.sourcePort;//getClietn port

        char tempData[MAXSIZE];

        if(rcvFrm.type=='R'){
            sprintf(tempData,"%i",ports[portsPtr]);//get new port num
            portsPtr=portsPtr+1; // increment pointer
            pktToSend=createPkt(serverPort,destPort,tempData);
            frmToSend=createFrm(4,'A',0,sourceIP,destIP,pktToSend);

            if((sendto(serverSock,&frmToSend, sizeof(frmToSend),0,(struct sockaddr *)&clientInfo, sockLength))==-1){ //send ACK packet
                perror("\nerror in sending-1 CONF packer: ");
            }//send

            printf("ACK Sent \n");
            fork(); // Here I am creating a new socket to be used with the client and leave the main socket free for other clients
            printf("PORT %i: \n",ports[portsPtr-1]);
            createSocket(ports[portsPtr-1]); // error occurs when call this function. 

        }   

    }//while
}

所以,问题是当服务器接收到if(rcvFrm.type=='R')(新客户端) 我想创建一个新的套接字用于与该客户端的连接,并将主套接字留给其他客户端使用。 尝试创建新套接字时出现错误 “绑定(bind)服务器套接字时出错::地址已在使用中”

我正在使用 fork(),因此它应该创建代码的副本并将其应用到不同的内存位置。我正在尝试创建具有不同端口号的套接字。为什么我会收到错误消息?

最佳答案

我发现了问题

        fork(); // Here I am creating a new socket to be used with the client and leave the main socket free for other clients
        printf("PORT %i: \n",ports[portsPtr-1]);
        createSocket(ports[portsPtr-1])

在这种情况下, parent 和 child 都试图在同一个端口上创建新的套接字!!!!

解决方法:

pid_t  pid;

pid = fork();
if (pid == 0) //child
 createSocket(ports[portsPtr-1]); 

> fork() returns a zero to the newly created child process.

谢谢

关于c - 绑定(bind)服务器套接字: : Address already in use. UDP C编程时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36359493/

相关文章:

比较数组元素并尝试将不同的元素添加到其他数组不起作用?

linux - 在终端中显示分支的问题

windows - 为 Windows 编译 Linux 应用程序 (C)

java - 套接字连接不会超时

从 C 中的 union 复制数据

c - C 中的通用数据类型的任何库?

c - 如果程序以 exec 运行则没有颜色输出

c++ - 小数据传输时套接字发送/接收返回 0

java - 如何在Apache Pulsar中集群切换而没有重复数据

将枚举变量转换为枚举类型