当前位置: 技术问答>linux和unix
Linux下的网络编程问题
来源: 互联网 发布时间:2015-05-04
本文导语: TCP/IP通信问题中,一个服务器端程序是如何实现以下功能的: 程序一直处于监听状态的,当有客户请求的时候立即收信,收信成功发送消息给客户端! | 不太明白你说的:子进程进行多次收信是什么...
TCP/IP通信问题中,一个服务器端程序是如何实现以下功能的:
程序一直处于监听状态的,当有客户请求的时候立即收信,收信成功发送消息给客户端!
程序一直处于监听状态的,当有客户请求的时候立即收信,收信成功发送消息给客户端!
|
不太明白你说的:子进程进行多次收信是什么意思,你想达到什么目的,我这里再给你贴一份我写的多进程的代码,你可以看看。关于子进程怎么退出,就直接exit就可以了。然后在父进程里面设置父进程的信号处理函数,子进程退出时会给父进程发送SIGCHlD信号,然后就设置这个信号的处理函数,在处理函数中用wait收集僵尸进程就可以了。这样就能够保证父进程可以继续监听而不用直接用wait来阻塞的等待子进程退出了。
#include
#include
#include
#include
#include
#include
#include
#include
int port=8000;
void sig_handler(int arg);
void sig_handler(int arg)
{
printf("enter sighandlern");
pid_t child;
child=wait(NULL);
printf("child exit has pid :%dn",child);
return;
}
int main()
{
struct sockaddr_in sin;
struct sockaddr_in pin;
int sock_descriptor;
int temp_sock_descriptor;
int address_size;
char buf[16384];
int i,len;
int child;
pid_t parent;
sigset_t oldset;
sigset_t newset;
struct sigaction action;
sigemptyset(&newset);
action.sa_handler=sig_handler;
action.sa_mask=newset;
//action.sa_flags=SA_ONESHOT;
struct sigaction oldact;
sigaction(SIGCHLD,&action,&oldact);
//sigemptyset(&newset);
//sigaddset(&newset,SIGCHLD);
//sigprocmask(SIG_BLOCK,&newset,NULL);
//sigprocmask(0,NULL,&oldset);
if(sigismember(&oldset,SIGCHLD))
{
printf("SIGCHLD is a member of oldset!n");
}
sock_descriptor=socket(AF_INET,SOCK_STREAM,0);
if(sock_descriptor
#include
#include
#include
#include
#include
#include
#include
#include
int port=8000;
void sig_handler(int arg);
void sig_handler(int arg)
{
printf("enter sighandlern");
pid_t child;
child=wait(NULL);
printf("child exit has pid :%dn",child);
return;
}
int main()
{
struct sockaddr_in sin;
struct sockaddr_in pin;
int sock_descriptor;
int temp_sock_descriptor;
int address_size;
char buf[16384];
int i,len;
int child;
pid_t parent;
sigset_t oldset;
sigset_t newset;
struct sigaction action;
sigemptyset(&newset);
action.sa_handler=sig_handler;
action.sa_mask=newset;
//action.sa_flags=SA_ONESHOT;
struct sigaction oldact;
sigaction(SIGCHLD,&action,&oldact);
//sigemptyset(&newset);
//sigaddset(&newset,SIGCHLD);
//sigprocmask(SIG_BLOCK,&newset,NULL);
//sigprocmask(0,NULL,&oldset);
if(sigismember(&oldset,SIGCHLD))
{
printf("SIGCHLD is a member of oldset!n");
}
sock_descriptor=socket(AF_INET,SOCK_STREAM,0);
if(sock_descriptor