[英]error in binding port “Address already in use” TCP socket programming in unix
[英]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]);
謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.