当前位置: 技术问答>linux和unix
linux下socket编程 server端的问题
来源: 互联网 发布时间:2016-02-04
本文导语: 使用socket编程实现2个设备之间通信,采用TCP方式,阻塞方式,其中一方做server。在工作时一个设备通过网口向server发送一些信息,server经过处理后再发回给该设备。对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()处等待下一次连接。
在编写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()
socket();
bind();
listen();
while(1)
{
if (accpet()