WSADATA WsaData;
    SOCKET  listener;
    int err = WSAStartup (0x0202, &WsaData);
    if (err == SOCKET_ERROR)
    {
        Memo1->Lines->Add("网络初始化失败.");
        return;
    }
    if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        Memo1->Lines->Add("WSASocket() failed with error");
        return;
    }    unsigned long type=1;
    err = ioctlsocket(listener,FIONBIO,(unsigned long*)&type);
    if (err == SOCKET_ERROR)
    {
        Memo1->Lines->Add("ioctlsocket() failed with error");
        return;
    }    SOCKADDR_IN addr_Srv;
    addr_Srv.sin_family=AF_INET;
    addr_Srv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addr_Srv.sin_port=htons(9999);    err = connect(listener,(SOCKADDR *)&addr_Srv,sizeof(SOCKADDR));    //这里调用会出错
    if (err == SOCKET_ERROR)
    {
       Memo1->Lines->Add("connect() failed with error");
       return;
    }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    WSADATA WsaData;
    SOCKET  listener;
    int err = WSAStartup (0x0202, &WsaData);
    if (err == SOCKET_ERROR)
    {
        Memo1->Lines->Add("网络初始化失败.");
        return;
    }
    if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        Memo1->Lines->Add("WSASocket() failed with error");
        return;
    }
    SOCKADDR_IN addr_Srv;
    addr_Srv.sin_family=AF_INET;
    addr_Srv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addr_Srv.sin_port=htons(9999);    err = connect(listener,(SOCKADDR *)&addr_Srv,sizeof(SOCKADDR));    //这里调用会出错
    if (err == SOCKET_ERROR)
    {
       Memo1->Lines->Add("connect() failed with error");
       return;
    }
    unsigned long type=1;
    err = ioctlsocket(listener,FIONBIO,(unsigned long*)&type);
    if (err == SOCKET_ERROR)
    {
        Memo1->Lines->Add("ioctlsocket() failed with error");
        return;
    }
这样写又没有问题,晕了.如果这样的调用顺序是对的,那后面怎么写呢?

解决方案 »

  1.   

    可以用select模型异步socket的send或recv,connect,...会直接返回
    如果WSAGetLastError()==WSAEWOULDBLOCK,表示该次操作也是成功的建议LZ先看看书
      

  2.   

    err = connect(listener,(SOCKADDR *)&addr_Srv,sizeof(SOCKADDR));    //这里调用会出错
    之后这样处理:
    while (WSAEWOULDBLOCK == WSAGetLastError())
    {
        sleep(10);   // 这里,返回WSAEWOULDBLOCK错误值并非连接失败,所以你需要继续等待,直到成功

    if(0 != WSAGetLastError()) // 如果还未成功,即连接失败了
    {
        ...// 连接失败
    }
    else
    {
        ...// 连接成功
    }
      

  3.   

    while (WSAEWOULDBLOCK == WSAGetLastError()) 

        sleep(10);  // 这里,返回WSAEWOULDBLOCK错误值并非连接失败,所以你需要继续等待,直到成功 
    }这样之后就一直while,跳不出去了怎么回事谁有源码啊,服务端是正常的,用工具自带的SOCKET类可以链接发送接收信息