哪位有在客户端使用select的完整例程?多谢了。

解决方案 »

  1.   

    某个socket封装类的方法
    int CWzSocket::Send(LPCSTR lpszBuf, const int nSize, const int nSecs)
    {
    assert(m_socket != NULL);
    // 如果客户方取消读,则返回值将小于nSize
    FD_SET fd = {1, m_socket};
    TIMEVAL tv = {nSecs, 0};
    if(select(0, NULL, &fd, NULL, &tv) == 0) 
    {
    return -2;//超时
    } int nBytesSent;
    if((nBytesSent = send(m_socket, lpszBuf, nSize, 0)) == SOCKET_ERROR) 
    {
    return -1;
    } return nBytesSent;
    }int CWzSocket::Receive(LPSTR lpszBuf, const int nSize, const int nSecs)
    {
    assert(m_socket != NULL);
    FD_SET fd = {1, m_socket};
    TIMEVAL tv = {nSecs, 0};
    if(select(0, &fd, NULL, NULL, &tv) == 0) 
    {
    return -2;//接收超时
    } int nBytesReceived;
    if((nBytesReceived = recv(m_socket, lpszBuf, nSize, 0)) == SOCKET_ERROR) 
    {
    return -1;
    }

    return nBytesReceived;
    }
      

  2.   

    orbit(吹泡泡的小猫) :把您这个socket封装类的全部代码给我看看吧。
      

  3.   

    http://www.vckbase.com/code/downcode.asp?id=2137
      

  4.   

    在客户端的程序为:
         #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h> #pragma comment(lib,"ws2_32.lib")
    #define DEFAULT_PORT 5150
    #define DEFAULT_BUFFER 4096int iPort = DEFAULT_PORT;
    BOOL bInterface = FALSE,
         bRecvOnly = FALSE;
    char szAddress[128];//int main(int argc,char **argv)
    int main( )
    {
    WSADATA wsd;
    SOCKET  sClient;
    int RecvRet,ret; struct sockaddr_in server;
      unsigned long ul =1;
    ///////////////////////
      struct hostent *host = NULL;
     char   szBuff[DEFAULT_BUFFER];
    fd_set fdread; TIMEVAL tm;
    tm.tv_sec = 5;
    tm.tv_usec = 0;////////////////////// if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
    {
    printf("Failed to load Winsock!\n");
    return 1;
    } sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_IP); if(sClient == SOCKET_ERROR)
    {
    printf("socket() failed:%d\n",WSAGetLastError());
    return 1;
    } server.sin_family = AF_INET;
    server.sin_port = htons(iPort);
    server.sin_addr.s_addr = inet_addr("192.168.136.102");//ip address
        
    if(server.sin_addr.s_addr == INADDR_NONE)
    {
    host = gethostbyname("192.168.136.102");
    printf("sb");
    if(host == NULL)
    {
    printf("Unable to resolve server:%s\n","192.168.136.102");
                return 1;
    }
    CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length);
    }
    if(connect(sClient,(struct sockaddr*)&server,sizeof(server)) == SOCKET_ERROR)
    {
    printf("connect()failed:%d\n",WSAGetLastError());
    return 1;
    }
    //set noblock model
       if (ioctlsocket(sClient, FIONBIO, &ul) == SOCKET_ERROR)
       {
          printf("ioctlsocket() failed with error %d\n", WSAGetLastError());
          return -1;
       }    FD_ZERO(&fdread);
    FD_SET(sClient,&fdread);
    select(0,&fdread,NULL,NULL,NULL);
        while(1)
    {
                      if(FD_ISSET(sClient,&fdread))
      {
                        RecvRet = recv(sClient,szBuff,DEFAULT_BUFFER,0);
                 if(RecvRet == 0)
             break;
                 else if (RecvRet == SOCKET_ERROR)
     {
    printf("recv()failed:%d\n",WSAGetLastError());
    break;
     }
                 szBuff[RecvRet] = '\0';
         printf("RECV :%s\n",szBuff);
      }
      }
    closesocket(sClient);
    WSACleanup();
    return 0;
    }我在服务器端发送了十次,可是我的客户端只能接受到1次后就说接受失败,错误代码为:10035。这是哪里错了?