日期:2014-05-16  浏览次数:20606 次

linux下socket编程 server端的问题
使用socket编程实现2个设备之间通信,采用TCP方式,阻塞方式,其中一方做server。在工作时一个设备通过网口向server发送一些信息,server经过处理后再发回给该设备。对server端的要求是程序能够一直运行,不中断。
    在编写server程序时是按照如下流程编写的:
        socket();
        bind();
        listen();
        accept();
          recv();
          send();

在实际使用时发现问题如下:
首先,客户端一旦连接server以后应该能随意发送信息,所以server中的recv和send应该能反复执行,所以我在程序中加入了while(1),位置如下:
        socket();
        bind();
        listen();
        accept();
while(1)
          {recv();
          send();}
但这样的问题是当客户端的程序关闭时,server端的程序也中断了,退回到了操作系统的界面,如果要继续工作必须再次手动运行server端的程序。
而如果为了保证程序不退出,将while(1)的位置改变,如下:
  socket();
        bind();
        listen();
while(1)
        {accept();
          recv();
          send();}
那么当server收发一次以后,如果客户端不退出重连,那么server端的程序将一直阻塞到accept()处,无法工作。
有没有办法实现一次连接后,server端程序可以收发任意次,并且当客户端退出的时候,server端程序不中断,能自动返回到accept()处等待下一次连接。

------解决方案--------------------
pid_t pid;
socket();
bind();
listen();
while(1)
{
if (accpet() < 0)
perror();
else
if ((pid = fork) < 0)
perror();
else if (pid == 0) /* Child */
{
while(1)
{
...
}
exit(0);
}
}
}

不过, 子进程将成为一个僵尸进程, 建议用signal抓取SIGCHLD, 在处理函数中调用waitpid(pid);