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

并发服务器(tcp和udp)

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

    本文导语:  TCP:主线程accept,返回值保存在临时socket中,tmpSocket = accept(lSocket,&cSocket,&cSocketLen)。支线程执行具体客户的请求。 疑问:主线程中的tmpSocket会在循环中被快速的覆盖掉,所以支线程的第一条代码就是复制tmpSocket...

TCP:主线程accept,返回值保存在临时socket中,tmpSocket = accept(lSocket,&cSocket,&cSocketLen)。支线程执行具体客户的请求。
疑问:主线程中的tmpSocket会在循环中被快速的覆盖掉,所以支线程的第一条代码就是复制tmpSocket的值,从而支线程能正常运行。但是我觉得如果支线程的复制执行慢了一点点,主线程还是会把tmpSocket覆盖掉。请问我这个担忧是否多虑了?有没有更好的解决方案?

UDP:主线程recvfrom,支线程复制获得的socket处理客户信息。
疑问:这种方法我也比较担心(同上),请大家帮我参考下。还有两个UDP方案我不太懂,烦劳大家指点一下:1.selcet 2.一个接受线程+缓冲队列+多个处理线程(为什么需要缓冲队列,udp自己就有一个缓冲,何苦要自己去维护呢?)

|
while (SOCKET s = accept())    //比如这里s的值为4000,即s是个值为4000的socket
        createThread(NULL, 0, proc, (void *)s); //这里是把4000做为一个指针地址传给线程了
//对于32位系统,实际上就是在新创建的线程的栈里放了入了4个字节长度的数字4000

UINT proc(void * param)
{
    //这里的param是从栈中取得的值,还是4000,至于地址4000指向的内容是什么,不关心它,也不能使用
    SOCKET s = (SOCKET)param;  //把4000的赋值给s,于是得到了一个值为4000的socket
    //后面即可像主线程一样的对s操作
}


//当createthread执行完后,4000的值已经在线程的的栈上了
//再给s赋值,已经不影响线程的执行了
    while (SOCKET s = accept())
        createThread(NULL, 0, proc, (void *)s);


关于SOCKET s的定义我是懒省事才写成那样,写到哪都行的,当前讨论的问题都没有关系

|
如果是自定义的类型的话,就直接传地址了,每次都生成新的内存地址

struct MyStruct
{
...
};

UINT proc(void * param)
{
    MyStruct * p = (MyStruct*)param;
    ....
    delete p;  //当然,内存的释放可以用其它的办法,比如用消息等方式通知主线程回收资源
}

UINT lnstProc(void * param)
{
    while (SOCKET s = accept())
    {
        MyStruct * p = new MyStruct;
        //....
        createThread(NULL, 0, proc, (void *)p);
    }
}

|
关于tmpSocket的问题,是楼主多虑了
看下面的测试代码

[root@wwapp tmp]# cat tfork.cpp 
 
#include 
#include 
#include 
#include 
using namespace std;
 
int main()
{
        int tmp = 0; 
        for (int i = 0; i 

    
 
 

您可能感兴趣的文章:

  • 基于LINUX 线程的并发通讯服务器
  • linux并发服务器中epoll+多线程分别怎么理解?
  • 如何做并发服务器
  • 请问: 当服务器采用epoll 时,客户端连不上,但若服务器端不用epoll时,也连上并发消息,这是为什么啊
  • 谁告诉我一个简单的并发TCP服务器中,如何进行大包处理?在线等ing
  • 多线程并发服务器设计
  • 服务器并发接收文件的处理方法
  • 趋势的一道面试题:网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
  • fork 通讯服务器 并发没有实现的问题
  • Linux服务器增加并发数
  • 问高手:大型系统的并发处理服务器端是如何实现的?
  • 支持百万并发连接的comet服务器 icomet
  • 服务器并发时,代码是否也复制?
  • 求推荐Linux下利用epoll实现大规模并发服务器架构设计与实现方面的论文or书籍。
  • python高并发异步服务器核心库forkcore使用方法
  • 并发服务器设计中为啥关闭原来的socket描述符?
  • linux下的socket并发服务器的编写问题,请高手指教
  • 菜鸟求助多线程并发服务器
  • 博客 iis7站长之家
  • 测试服务器并发性能的客户端程序阻塞在 recv 函数处,大家帮忙看看什么原因?
  • 如何测试tcp协议中服务端的最大并发数?
  • linux socket 通信中服务端并发问题,很急!!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux下c/c++ boost安装及并发编程库mpi介绍
  • 在unix下,后台trf001同时并发了很多进程,请用一条命令,杀掉所有trf001并发的进程
  • [内核并发]并发数据的处理
  • PHP并发框架 PCF
  • FIFO和Socket通信的并发效率问题
  • epoll并发问题
  • C++ 并发编程指南
  • openssl并发问题
  • fedora10下支持线程的并发设置吗?
  • 并发编程语言 JR
  • 并发编程框架 Disruptor
  • 记忆并发哈希图工具 fcmm
  • C++并发编程库 Theron
  • 千万级别并发用户模拟软件 tcpburn
  • 通用并发 Java 对象池 Vibur Object Pool
  • 用RMI进行远程对象调用的时候,可不可以实现多个调用远程对象的并发操作
  • 并发开发包 Concurrency Kit
  • Apache并发限制模块 limitipconn
  • 在linux下,如何进行“互斥”和“并发”的控制?
  • socket实现多文件并发传输,求助多线程实现问题?
  • 多进程的并发系统中,肯定不会因竞争( )而产生死锁。


  • 站内导航:


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

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

    浙ICP备11055608号-3