accept_linger.l_onoff = 1;  // (在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
accept_linger.l_linger = 5; // (容许逗留的时间为0秒) //设置接受超时
::setsockopt(accept_socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(timeout));
//设置关闭之后马上断开
::setsockopt(accept_socket, SOL_SOCKET, SO_LINGER,(const char*)&accept_linger,sizeof(accept_linger));
//加入到socket_set中
FD_SET(accept_socket,&socket_set);

解决方案 »

  1.   

    SO_RCVTIMEO 是阻塞模式下的接收超时;
    SO_LINGER 是另一个东西,避免主动close后端口进入TIME_WAIT状态;
      

  2.   

    非阻塞是这个样子的:
    #ifdef WIN32
        unsigned long ul = 1; 
        ioctlsocket(m_Socket, FIONBIO, &ul); 
    #else
    int flags = fcntl(s, F_GETFL, 0); 
    return fcntl(m_Socket, F_SETFL, flags | O_NONBLOCK);
    #endif
      

  3.   

    你的意思是接受超时,主动close后端口进入TIME_WAIT状态 ?需要使用SO_LINGER
      

  4.   

    阻塞和非阻塞两种方式底层其实都一样,咱们的好多VC书籍超级垃圾,可恨那些出书的人,根本就是一知半解,就瞎出书坑人。咱们的书基本上讲的都是阻塞方式,但是缺点是被阻塞了界面无法响应,跟死了一样,让人不爽。非阻塞方式是用一个while(true)来死循环,里面用于进行网络接收部分。但是这个方式是费cpu,最好的方式是建立一个线程,用阻塞方式接收网络数据,得到后用消息发送给处理线程。
    我也说说我自己的vc心得,一切皆消息,一切皆线程。
      

  5.   

    fcntl+connect //是连接非堵塞吧
      

  6.   

    http://blog.csdn.net/hmsiwtv/article/details/7952266
    不是用select实现的异步通信吗????  和你的属于俩中方法???学程序不能靠读书吧,开源的东西才是最好的学习教材。我能想起来的上一本书好像还是入门书籍。
      

  7.   

    线程同步? 大哥我问的是socket异步与同步通信呢
    阻塞模式下,即使建立单独线程,也无法优雅结束线程,所以我几乎很少用同步方式了。举例来说,断点续传文件,用户退出程序,你的接收线程还在阻塞着,怎么办呢?只好强行结束线程,可是进度状态怎么保存呢?只好在另外的线程里做,程序就变复杂了,这就是不能优雅结束线程的结果。如果是异步,循环里检查到退出标志就保存状态,退出线程,很自然。如果用同步,不知道谁有好的办法告知一下比较常见的做法还是做多线程同步,不然不好处理。
    我不明白你为何不用线程同步,是因为对同步技术不够了解吗
      

  8.   

    不管你用socket的同步或者异步方式,
    你的程序要想优雅结束,常见的做法是做多线程同步
    我这么说你是否明白我表达的意思
      

  9.   

    如果用阻塞方式,像TCP,断网的时候一阻塞就是好几十秒,不强行杀掉线程的话我很难想出怎么优雅结束。更可气的是,Android上好像还不能强行结束线程。我现在的做法就是都用异步。
      

  10.   

    android我是不了解,
    至于说断网的时候阻塞会是好几十秒,这种问题就看你要用什么策略处理
    如果在windows机制下,
    假设我们用多线程处理通信程序,
    一般来说,除了主线程之外,
    至少需要一个socket工作线程,一个数据处理线程,再加一个状态和异常处理线程(控制线程)
    控制线程可以根据用户指令,再需要的时候去管退另外两个线程,
    有必要的时候就强制关闭另外的线程。
      

  11.   

    大哥 你的实现异步的方法是select模式?对,我现在编写程序和你说的差不多,主程序基本上除了负责显示一些需要看的东西外基本都不干其他的,工作是要交给线程处理的。