所以这是扩展这个LinuxHowTo page的家庭作业。我的任务是创建客户端和服务器。服务器最多可以与客户端建立5个连接,并且必须保持打开状态,以便在未满时与客户端建立新连接。一旦客户端连接并且服务器接受。我在服务器中运行fork(),然后从子服务器在服务器和客户端之间来回发送数据。
//accept function will take next connection from listen queue for processing
//or it will block the process until a connection request arrives
//third parameter identifies client can be null to accept any request from any machine
newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen);
问题是孩子使用与父母相同的端口,因此我无法再与父母建立联系。
以下是我尝试更改客户端和服务器正在进行通信的端口。
分叉后和子进程中
生成随机数> 60000作为新端口号。
将新端口号发送到客户端
关闭旧套接字
完成重新连接服务器和子服务器中套接字的过程。
但是,当我尝试从客户端连接时,我一直收到连接错误。
//call connect return 0 for success and -1 for error
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0){
fprintf(stderr,"ERROR connecting to server\n");
//remove the new file
remove(newFileName);
exit(1);
}
答案 0 :(得分:4)
只是不要在客户端中调用bind
。在客户端中调用connect
时,请指定服务器正在侦听的IP和端口。这将导致实现为每个客户端分配一个唯一的源端口。
问题是孩子使用与父母相同的端口,因此我不能再与父母建立联系。
您可以使用相同的目标端口建立许多出站连接,因为它们将具有不同的源端口。当然,服务器可以接受与同一目标端口的多个连接。