2016-04-01 4 views
2

Ich habe Problem mit einem zweiten Sockel zu schaffenFehler beim Binding Server Socket:: Adresse wird bereits verwendet. UDP C Programmierung

Dieser Teil des Codes ist

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

Der Fehler wird in dieser Funktion spezifisch in 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 
} 

So geschieht, die Problem ist, wenn der Server empfängt if(rcvFrm.type=='R') (neuer Client) Ich möchte einen neuen Socket für die Verbindung mit diesem Client verwendet werden und lassen Sie den Hauptanschluss frei für andere Clients. Ich erhalte eine Fehlermeldung beim Versuch einen neuen Socket erstellen „Fehler bei der Bindung Server-Socket:: Adresse bereits in Verwendung“

ich fork() verwende, so sollte es sich um eine Kopie bilden den Code zu erstellen und es in verschiedenen gelten Speicherorte. Und ich versuche, den Socket mit unterschiedlicher Portnummer zu erstellen. Warum bekomme ich einen Fehler?

+0

Verwendung "setsockopt" ... siehe man setsockopt .. – Shiv

+0

Töte alle Prozesse, die diese Buchse (lokal) verwenden. Suchen Sie mit 'netstat -tulpn' ... –

+0

Die Eingabeaufforderung gibt Ihnen die Antwort - herauszufinden, warum es bereits verwendet wird. Manchmal muss man aber zur Seite schauen. Ich stoße oft darauf, wenn ein früherer Programmlauf abgestürzt ist, aber nach dem Einbinden eines Sockets weiterhin existiert, besonders bei der Verwendung von Eclipse. Auch (wie von Maciej erwähnt, Netstat ist dein Freund. – CarlH

Antwort

1

fand ich das Problem

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

in diesem Fall beide Eltern und Kind versuchen, neue Buchse auf dem gleichen Port erstellen !!!!

Lösung:

pid_t pid; 

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

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

Dank

Verwandte Themen