原帖如下
http://topic.csdn.net/u/20081119/01/6215bca0-fad9-4e23-82f2-b0d9831976f5.html?seed=1196383371#replyachor问题整理一下,在这里再问问
、、、、、、、、、、、、、
MSDN找的 触发FD_WRITE的条件: 
1,When WSAAsyncSelect called, if a send or sendto is possible. 
2,After connect or accept called, when connection established. 
3,After send or sendto fail with WSAEWOULDBLOCK, when send or sendto are likely to succeed. 
4,After bind on a connectionless socket. FD_WRITE may or may not occur at this time (implementation- dependent). In any case, a connectionless socket is always writeable immediately after a bind operation. 、、、、、、、 
我认为第四点可以解释我的第一个问题。 客户端调用connect,就有执行隐式绑定端口,因此触发了 FD_WRITE(而是否触发是要看实现环境,我用VC6,windows )。同时 
In any case, a connectionless socket is always writeable immediately after a bind operation. 
我理解是绑定后就可以发送数据,虽然该socket也许没有真 正建立连接,因此我的第二个C发送数据就GetLastError为 0. 
等下这下测试,强制绑定C,然后WSAAsyncSelect指定相关 相应事件,接着发送数据试试看。、、、、、、、、、、、、、、
FD_CONNECT其实不能说明连接建立,connect会触发FD_CONNECT,但是处在异步模式下connect而经常会有WSAEWOULDBLOCK。 引用 1 楼 cnzdgs 的回复:
FD_CONNECT 

解决方案 »

  1.   


    FD_WRITE触发自然不能说明是connect成功了.因为有多种触发FD_WRITE的条件,connect成功只是其中的一个条件.检查connect是否成功,主要是FD_CONNECT消息被触发,然后再检查返回的值是成功还是失败.
      

  2.   

    In any case, a connectionless socket is always writeable immediately after a bind operation.
    非阻塞的是立即可写,但是会可能返回WSAEWOULDBLOCK错误码
      

  3.   

    In any case, a connectionless socket is always writeable immediately after a bind operation. 
    我理解是绑定后就可以发送数据,虽然该socket也许没有真 正建立连接,因此我的第二个C发送数据就GetLastError为 0. 
    等下这下测试,强制绑定C,然后WSAAsyncSelect指定相关 
    相应事件,接着发送数据试试看。 、、、、、、、
    当时写错了,只是bind并发送数据,并不知发送到哪,这个测试不能做,哈哈
      [3]FD_WRITE事件触发条件: 
      1.第一次connect()或accept()后(即连接建立后) 
      2.调用send()返回WSAEWOULDBLOCK,并且直到发送缓冲区准备好(为空)后 
      注意:当前一次调用send()没有返回WSAEWOULDBLOCK时,如果缓冲区准备好了,也不会触发FD_WRITE的 其说法与《windows网络编程》中不矛盾: 
    F D W R I T E通知出现情况 
    使用c o n n e c t或W S A C o n n e c t,一个套接字首 次建立了连接。 
    ... 
      

  4.   

    谢谢WinEggDropFD_WRITE触发自然不能说明是connect成功了.因为有多种触发FD_WRITE的条件,connect成功只是其中的一个条件.检查connect是否成功,主要是FD_CONNECT消息被触发,然后再检查返回的值是成功还是失败.、、、、、、、
    这个我要测试一下,我的程序已经指定了FD_CONNECT消息,但是连接建立成功后并没有触发它,同时一切socket操作正常。最近在忙别的事,等过后一定要测试一下。、、、、、、、
    谢谢大家关注,同时有什么意见还可以说说。
      

  5.   

    FD_WRITE表示你的socket对应的数据池有数据到达(包括报告等)应该是这样的。好久没搞了
      

  6.   

    In any case, a connectionless socket is always writeable immediately after a bind operation. 
    我理解是绑定后就可以发送数据,虽然该socket也许没有真
    我觉的好像不能发数据吧,要是TCP的话在连接的时候要进行握手协议,握手协议没有完成,发送窗口会建立吗?如果发送窗口没有建立,可以发吗?请高手来确认一下
      

  7.   

    记得前人有说过 fd_write 的产生是,你的发送缓冲区里有足够的数据要发送了。当然是比较大,如果只有少量的数据,还是直接用send吧ret = select(maxfd,&read_fds,&write_fds,NULL,&timeout_val);...if((clisocket != svrsocket) && (FD_ISSET(clisocket,&write_fds)))
    {
        if (pSess->readyToSend == TRUE) 
       {
            int n = send(pSess->socket, pSess->buffSend, strlen(pSess->buffSend), 0) ;
            if (n != strlen(pSess->buffSend))
           {
               printf("send erro\n");
           }
           else
           {
             Clear_BUFFSEND(pSess);
           }
           pSess->readyToSend = FALSE;
        }
    }你可以另外的地方,把要发送的socket加入到数据集里头,FD_SET(SOCK, &write_fds); OK!www.wantsoft.com (隐形者源码交流)上面有些例子
      

  8.   

    to tingtj 记得前人有说过 fd_write 的产生是,你的发送缓冲区里有足够的数据要发送了。当然是比较大,如果只有少量的数据,还是直接用send吧、、、、、
    其实调用send也会触发FD_WRITE,我就是这么做的。
      

  9.   

    to king_query In any case, a connectionless socket is always writeable immediately after a bind operation. 、、、、、
    这句的确费解