簡體   English   中英

綁定服務器套接字時出錯:地址已在使用中。 UDP C 編程

[英]Error In Binding server Socket: : Address already in use. UDP C programming

我在創建第二個套接字時遇到問題

這是代碼的一部分

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

錯誤發生在這個函數中,特別是在綁定中

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() ,因此它應該從代碼中創建一個副本並將其應用於不同的內存位置。 我正在嘗試創建具有不同端口號的套接字。 為什么我收到錯誤消息?

我發現了問題

        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() 向新創建的子進程返回零。

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM