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?
Verwendung "setsockopt" ... siehe man setsockopt .. – Shiv
Töte alle Prozesse, die diese Buchse (lokal) verwenden. Suchen Sie mit 'netstat -tulpn' ... –
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