当前位置:  技术问答>linux和unix

socket与多线程/进程编程的问题。

    来源: 互联网  发布时间:2016-03-11

    本文导语:  想设计一个服务器,对于每一个客户端的连接都分配一个线程或者进程。 今天写了一些测试功能用的小程序(假设有2个客户端),有些问题想请教大家。 1.在主进程中(也就是main函数) 初始化socket一直到listen, 然...

想设计一个服务器,对于每一个客户端的连接都分配一个线程或者进程。
今天写了一些测试功能用的小程序(假设有2个客户端),有些问题想请教大家。

1.在主进程中(也就是main函数) 初始化socket一直到listen, 然后在进程/线程中 accept,
可以正确接收客户端信息,想请问为什么线程中accept后的客户端client_fd是不同的,而进程却是相同的。

sockfd = socket(...);

....

listen( sockfd, .. );

pid = fork();

if( pid == 0) {
   
    client_fd = accept( ... );

    ....
 
}else if( pid > 0 ) {

    client_fd = accept( ... );

    ....
}
// client_fd 是相同的。

而如果用线程的话,则得到的是不同的。 为什么?

2. 如果把 sokcet 初始化 一直到listen 分别放入2个进程/线程中,则总会有一个客户端的信息收不到,在accept处被一直阻塞。为什么?



|
fd是per process的概念。当child process fork出来时,它拥有的fd table是其父进程的一个copy,根据unix分配fd的原则,即总是分配一个最小的空余fd号,所以所有子进程里接受new connection,分配的fd都一样,都是他们父进程空闲的那个最小值。

同样的道理,如果利用线程的话,则是在自己所在的process里找最小的那个空闲值,所以每个新的都会增大1。

|
1. 同楼上

2. 同一个socket,可以对应多个句柄,而实际上的对应的内核中是同一个socket对象

多进程同时监听同一个socket,虽然由于是多个进程空间中,socket句柄是两个,但是内核中的socket对象是一个

所以同时只能有一个进程响应

多线程同时监听一个socket,进程中的socket句柄是同一个,对应的内核中的socket对象也是一个,同时也只能有一个线程响应

|
第一个问题:解释一下线路和进程的概念,假设程序是一个房子,SOCKET连接就是椅子,即文件client_fd就是椅子,如果有两个SOCKET连接的话,就有两把椅子,你所说的client_fd的值就是椅子摆放的位置,假设椅子都是从房子中间向两把摆。
那么如果用进程的方式处理的话,就相当于再复制了一个房子,两个房子的摆设是一模一样的,那么自然两个房子中间同样的位置都有这么一把椅子,也就是说当需要摆设椅子的时候,两个房子中的椅子都可以摆到房子的中间,所以其值是一模一样的。
但是如果用线程的话,就相当于只在一个房子中摆椅子,打一把椅子可以摆在房子中间,但是第二把、第三把都必须摆设到其它不同的位置,所以显示出来的值就不一样了!
第二个问题:最简单的解决方法是在

listen( sockfd, .. ); 
pid = fork(); 

if( pid == 0) { 
    
    client_fd = accept( ... ); 

    .... 
  
}else if( pid > 0 ) { 

    client_fd = accept( ... ); 


这段代码的外围加上一个while循环来包其来就可以了。实际真正的理解你就需要查看一下SOCKET数据了,建议你找以下Unix下面的C语音编程书籍看一看

|
楼主想设计一个服务器,最好是父进程专门管监视子进程的状态(用wait方法),然后子进程中创建线程,用于接收用户请求,并维护每个客户端的socket,最好用select模型,对了,一定要有延迟处理

    
 
 

您可能感兴趣的文章:

  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • 如果两个线程操作同一个Socket,一个线程recv,另一个send。这样会不会导致程序莫名其妙的退出
  • 多线程socket申请有无可能产生冲突?
  • socket 多线程编程
  • 多线程和socket结合
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • socket实现多文件并发传输,求助多线程实现问题?
  • 请问关于多线程SOCKET的问题
  • 多线程socket程序莫名其妙接收到SIGALRM信号问题。
  • 多线程中socket的问题
  • socket read阻塞:一个线程关闭另一个线程错误
  • 请问关于socket客户端因事件启动新线程的问题.高手请进
  • 一个关于socket线程池问题
  • 多线程close() socket套接字的问题
  • socket+多进程+多线程
  • socket+多进程+多线程 iis7站长之家
  • 关于linux下多线程socket通讯的问题
  • Unix domain socket可用于同一个进程中的不同线程么?
  • 多余SOCKET服务器来说,用哪种线程安全锁性能最高?
  • socket通讯时如何为线程池分配Recv任务?
  • 求教一个关于子进程与父进程socket描述符的一个问题
  • 多进程socket编程问题
  • 这个socket程序的服务进程开始服务后,为什么总是两个进程?
  • 当进程处于socket读阻塞模式中,外部SIGNAL发生,此时信号相应响应函数可否进行socket写?
  • 怎么让多个进程共用一个socket
  • 如何使用另外进程的socket
  • 进程信号是不是也是socket?
  • 进程和socket的问题
  • 请问如何判断从raw socket发出的包是哪个进程发送的?
  • unix下,多进程socket 服务器问题
  • socket发送端、接收端同一机器,kill掉接收端进程,发送端也被kill?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • IOS开发之socket网络编程(基于SimpleNetworkStreams的c/s程序)
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现
  • socket 编程时,write的写入的数据大于socket缓冲区,会有什么结果??
  • Linux下使用openssl api编程socket编程,为什么要编译啊?
  • 关于文件操作和Socket网络编程!
  • linux下socket编程问题!
  • socket编程 中的bind问题
  • socket编程--htons
  • 急!!请教关于linux socket编程的一个问题!!
  • 急!关于SOCKET编程,在线等待!
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • 问一个socket编程问题,急~~~
  • 求教!为何在socket编程中调recv函数无法阻塞?
  • 请教一个socket编程问题
  • 求助!!linux下socket编程
  • socket编程,使用recvfrom()函数监听问题。
  • sco unix下socket编程的问题,请大家帮忙
  • socket编程中的问题,请各位大侠指教!
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3