绑定服务器套接字错误:地址已在使用中。 UDP C编程

时间:2016-04-01 14:54:04

标签: 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')(新客户端)时 我想创建一个用于与该客户端连接的新套接字,并为其他客户端保留主套接字。 尝试创建新套接字时出错 "错误绑定服务器套接字::地址已在使用"

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

1 个答案:

答案 0 :(得分:1)

我发现了问题

        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])

在这种情况下,父和子都尝试在同一个端口上创建新套接字!!!!

解决方案:

pid_t  pid;

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

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

由于