如何在服务器上使用分叉子进程重用打开的客户端连接(TCP/IP 套接字)
How to reuse open client connection with forked child process on the server (TCP/IP Socket)
我希望客户端使用 TCP/IP 套接字连接与服务器通信。当服务器端接受连接时,将创建子进程。这个子进程读取并处理传入的数据。我想,当我在打开的连接上从客户端进行后续写入时,如果 doSomething 进程已经退出,服务器端将再次进行分叉。然而发生的事情是,第二个客户端写入(TEST2)写入套接字并且:
a) 写入表明没有错误,但服务器没有收到任何东西
或者
b) 异常断管
我有这样的伪代码:
Client socket side:
{
socketFD = socket(AF_INET, SOCK_STREAM, 0);
connect(socketFD, (struct sockaddr *) &serv_addr, sizeof(sockaddr));
write(socketFD, “TEST1”, strlen(“TEST1”));
…….
write(socketFD, “TEST2”, strlen(“TEST2”)); // error: Broken pipe
.....
close(sfd);
}
服务器套接字端:doSomething 在分叉的子进程上 运行:
void doSomething(int socket)
{
int n;
const int bufferSize = 1025;
char buffer[1025];
bzero(buffer,bufferSize);
n = read(sock,buffer,bufferSize-1);
}
“TEST2”的写入将失败,并显示消息“broken pipe”。这可能是因为 doSomething 已经完成。问题是:
- 在 doSomething 接收并处理完所有 (TEST1) 数据后,如何让分叉(子)进程 doSomething 继续监听?
- 如果我让 doSomething 持续监听,如果客户端关闭连接,我如何停止 doSomething?
void doSomething(int socket)
{
int n;
char buffer[1024];
do
{
//Normally your process will be blocked here until it receives some data from the client.
//The socket must be under the blocking mode;
n = read(sock,buffer,sizeof(buffer));
...do something with the buffer;
}while(n>0);
}
我希望客户端使用 TCP/IP 套接字连接与服务器通信。当服务器端接受连接时,将创建子进程。这个子进程读取并处理传入的数据。我想,当我在打开的连接上从客户端进行后续写入时,如果 doSomething 进程已经退出,服务器端将再次进行分叉。然而发生的事情是,第二个客户端写入(TEST2)写入套接字并且:
a) 写入表明没有错误,但服务器没有收到任何东西 或者
b) 异常断管
我有这样的伪代码:
Client socket side:
{
socketFD = socket(AF_INET, SOCK_STREAM, 0);
connect(socketFD, (struct sockaddr *) &serv_addr, sizeof(sockaddr));
write(socketFD, “TEST1”, strlen(“TEST1”));
…….
write(socketFD, “TEST2”, strlen(“TEST2”)); // error: Broken pipe
.....
close(sfd);
}
服务器套接字端:doSomething 在分叉的子进程上 运行:
void doSomething(int socket)
{
int n;
const int bufferSize = 1025;
char buffer[1025];
bzero(buffer,bufferSize);
n = read(sock,buffer,bufferSize-1);
}
“TEST2”的写入将失败,并显示消息“broken pipe”。这可能是因为 doSomething 已经完成。问题是:
- 在 doSomething 接收并处理完所有 (TEST1) 数据后,如何让分叉(子)进程 doSomething 继续监听?
- 如果我让 doSomething 持续监听,如果客户端关闭连接,我如何停止 doSomething?
void doSomething(int socket)
{
int n;
char buffer[1024];
do
{
//Normally your process will be blocked here until it receives some data from the client.
//The socket must be under the blocking mode;
n = read(sock,buffer,sizeof(buffer));
...do something with the buffer;
}while(n>0);
}