**************同步阻塞socket代码***********************
         SOCKADDR_IN   saServer;
LPHOSTENT   lphostent;
WSADATA   wsadata;
SOCKET   hsocket;
int   nRet; char dest[1024];
if(WSAStartup(winsock_version,&wsadata))
printf("can't open"); lphostent=gethostbyname(host_name);
if(lphostent==NULL)
printf("lphostent is null");
saServer.sin_family = AF_INET;
saServer.sin_port = htons(1234);
saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list); hsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
nRet = connect(hsocket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
if (nRet == SOCKET_ERROR)
{  
printf("can't connect");
closesocket(hsocket);
return;
}
else
{
printf("connected with %s\n",host_name);
} nRet = send(hsocket, hostname, strlen(hostname), 0);
if(!nRet)
{
AfxMessageBox(L"发送请求失败!");
closesocket(hsocket);
return ;
}
nRet = recv(hsocket,(LPSTR)dest,sizeof(dest),0);
closesocket(hsocket);
*****************************************************************请问如果要用select做超时处理,以上代码应该怎么改?

解决方案 »

  1.   

    http://www.chinaeda.cn/show.aspx?id=11970&cid=48
    简单的socket+select使用
      

  2.   

    不好意思,我不是学这个的,因为临时要用,没办法,上面我给的代码已经调试通过了,只需要加个select处理超时问题,有谁能在我给的代码上帮忙改动改动,来实现这个功能? 先谢谢了
      

  3.   

    《WINDOWS网络编程技术》书籍第8章有介绍这方面的内容,也有代码。
      

  4.   

    SOCKADDR_IN  saServer; 
    LPHOSTENT  lphostent; 
    WSADATA  wsadata; 
    SOCKET  hsocket; 
    int  nRet; char dest[1024]; 
    if(WSAStartup(winsock_version,&wsadata)) 
    printf("can't open"); lphostent=gethostbyname(host_name); 
    if(lphostent==NULL) 
    printf("lphostent is null"); 
    saServer.sin_family = AF_INET; 
    saServer.sin_port = htons(1234); 
    saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list); hsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    nRet = connect(hsocket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN)); 
    if (nRet == SOCKET_ERROR) 
    {  
    printf("can't connect"); 
    closesocket(hsocket); 
    return; 

    else 

    printf("connected with %s\n",host_name); 
    }fd_set fdRead, fdWrite;
    FD_ZERO(&fdRead);
    FD_ZERO(&fdWrite);
    FD_SET(hsocket, &fdRead);
    FD_SET(hsocket, &fdWrite);
    struct timeval tm;
    tm.tv_sec = 100; // 设置100秒为超时时间while(true)
    {
    if(nRet = select(0, &fdRead, &fdWrite, NULL, &tm) == SOCKET_ERROR)
    {
    // 出错处理
    }

    if(nRet > 0)
    {
    if(FD_ISSET(hsocket, fdWrite))
    {
    nRet = send(hsocket, hostname, strlen(hostname), 0); 
    if(!nRet) 

    AfxMessageBox(L"发送请求失败!"); 
    closesocket(hsocket); 
    return ; 

    }

    if(FD_ISSET(hsocket, fdRead))
    {
    nRet = recv(hsocket,(LPSTR)dest,sizeof(dest),0); 
    closesocket(hsocket); 
    return;
    }

    }
    }
      

  5.   

    请教#5楼,上面的超时是针对阻塞方式吗。在阻塞方式下如何防止send函数不返回导致线程停顿?谢谢