我在创建第二个套接字时遇到问题
这是代码的一部分
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()
,因此它应该从代码创建副本并将其应用于不同的内存位置。我正在尝试使用不同的端口号创建套接字。为什么我收到错误?
答案 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.
由于