当前位置: 技术问答>linux和unix
高分求高手赐教-关于linux下进程共享TCP套接字的问题
来源: 互联网 发布时间:2015-01-11
本文导语: 需求如下:在linux环境下,有一个服务器进程,它负责新连接的接入和原有连接的释放,它根据要求创生子进程去处理事务并且由子进程向远程连接发送报文。 目前的做法基于socket:服务器进程listen,并轮询listen的...
需求如下:在linux环境下,有一个服务器进程,它负责新连接的接入和原有连接的释放,它根据要求创生子进程去处理事务并且由子进程向远程连接发送报文。
目前的做法基于socket:服务器进程listen,并轮询listen的套接字和已经连接的套接字(select),如果获得新连接就通过管道告知事务子进程,从而事务子进程可以向连接的主机发送报文;如果远程连接断开,服务器进程断开连接,并告知事务子进程,则子进程可以不再尝试向其发送。
现在遇到这样的情况:当连接在子进程创生之前建立,则子进程可以在随后根据管道中传来的套接字(文件描述符)和远程主机建立连接(即可以向此套接字write报文等);而如果远程连接在事务子进程建立之后建立,虽然通过管道可以让子进程获致新的连接套接字(描述符),但无法再用write(FD,buff,length)之类的调用向远程主机通讯(有的情况是write返回成功但远程主机无法收到,有时导致子进程崩溃)。
不知道在原有远程连接断开后,子进程是否要对这个套接字作什么特别的处理;在对新连接的套接字或者重新连接的套接字操作前要作什么特别处理。
请有这方面经验的高手指点迷津。
高分相送!!!!
目前的做法基于socket:服务器进程listen,并轮询listen的套接字和已经连接的套接字(select),如果获得新连接就通过管道告知事务子进程,从而事务子进程可以向连接的主机发送报文;如果远程连接断开,服务器进程断开连接,并告知事务子进程,则子进程可以不再尝试向其发送。
现在遇到这样的情况:当连接在子进程创生之前建立,则子进程可以在随后根据管道中传来的套接字(文件描述符)和远程主机建立连接(即可以向此套接字write报文等);而如果远程连接在事务子进程建立之后建立,虽然通过管道可以让子进程获致新的连接套接字(描述符),但无法再用write(FD,buff,length)之类的调用向远程主机通讯(有的情况是write返回成功但远程主机无法收到,有时导致子进程崩溃)。
不知道在原有远程连接断开后,子进程是否要对这个套接字作什么特别的处理;在对新连接的套接字或者重新连接的套接字操作前要作什么特别处理。
请有这方面经验的高手指点迷津。
高分相送!!!!
|
send_fd是在两个进程间发送描述符。
recv_fd是用来接收的。
clifd是流管道。fd是要发送的描述符。
recv_fd是用来接收的。
clifd是流管道。fd是要发送的描述符。
|
文件描述符不单单是表面上的一个普通的int 类型,这个int没有办法传递给另外一个进程的。
而在fork时,父进程的打开的文件和环境变量内容能够传递给子进程。因此子进程能够继承父进程在fork前打开的所有文件。
这些可以在操作系统的课程中找到。
我不敢称高手,但我觉得这个方向是错误的(在fork之后父进程用管道传递文件描述符给子进程),建议你采用其他的设计思路。
而在fork时,父进程的打开的文件和环境变量内容能够传递给子进程。因此子进程能够继承父进程在fork前打开的所有文件。
这些可以在操作系统的课程中找到。
我不敢称高手,但我觉得这个方向是错误的(在fork之后父进程用管道传递文件描述符给子进程),建议你采用其他的设计思路。