我使用fork()在C中编写一个ftp服务器来处理多个客户端。该 创建零件和绑定零件如下:
//create socket
int createSocket()
{
int listenfd;
if ((listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
printf("Error socket(): %s(%d)\n", strerror(errno), errno);
exit(1);
}
printf("socketfd is: %d\n", listenfd);
return listenfd;
}
int bindSocketToServer(int listenfd, int port)
{
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = port;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenfd, (struct sockaddr*)&addr, sizeof(addr)) == -1)
{
printf("Error bind(): %s(%d)\n", strerror(errno), errno);
return -1;
}
//It is normal here.
pirntf("It is still normal here.\n");
return 1;
}
pasvPort = 30000;
pasvFilefd = createSocket();
while(1)
{
printf("start.\n");
if(bindSocketToServer(pasvFilefd, pasvPort) > 0)
{
printf("going to break.\n");
break;
}
else
pasvPort += 1;
printf("error.\n");
}
printf("Listening port%d", pasvPort); //It can be printed.
当我启动服务器并在主进程中侦听端口21时,这些工作正常。但是,当我试图处理&#pas;'命令并将套接字绑定到新端口,如下所示(在fork()创建的另一个进程中),进程终止,我不知道原因。
编辑:那是我如何使用fork()。在serveOneClient()中我处理了#pas;'命令。
pid = fork();
if(pid < 0)
{
printf("Error fork(): %s(%d)\n", strerror(errno), errno);
continue;
}
else if(pid == 0)
{
close(listenfd);
serveOneClient(connfd);
printf("serving one over.\n");
close(connfd);
return 0;
}
else
close(connfd);