这是我一个线程函数里的代码:
__try{
SOCKADDR_IN target;
target.sin_family = AF_INET;
target.sin_port = htons (PORT);
target.sin_addr.s_addr = htonl(i);
mysocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(mysocket == INVALID_SOCKET){
__leave;
}//设置socket为非阻塞模式,ul=1.
iErr = ioctlsocket(mysocket,FIONBIO,(unsigned long*)&ul);
if(iErr == SOCKET_ERROR)
__leave;
connect(mysocket,(struct sockaddr *)&target,sizeof(target));
FD_ZERO(&w);
FD_SET(mysocket,&w);
iErr=select(0, 0, &w, 0, &timeout);
if(iErr == SOCKET_ERROR || iErr == 0)//如果不可写,则退出
__leave;
else{//可写则发送数据
iErr = send(mysocket,SendBuff,SendBuffLen,0);
if(iErr == SOCKET_ERROR)
__leave;
}
FD_ZERO(&r);
FD_SET(mysocket,&r);
iErr=select(0, &r, 0, 0, &timeout);
if(iErr == SOCKET_ERROR || iErr == 0){//如果不可读则退出
__leave;
}
else{//可读则接受数据
printf("123");
iErr = recv(mysocket,RecvBuff,RecvBuffLength,0);
if(iErr == SOCKET_ERROR)
__leave;
}
ptr=strstr(RecvBuff,szSign); 
if(ptr!=NULL)
printf("response:%s\n",RecvBuff);
}
__finally{
ReleaseSemaphore(hSemaphore,1,&PreviousCount);
closesocket(mysocket);
}     第2次select的时候老是出错,也就是printf("123");老是打不出来,跟的时候明明到了这句话这。
      程序的意思就是扫描一个网段的80端口,并发送数据,接受回显,老是出错,别人的源码放我这跑就好好的,基本都是一样 的,为什么我的老错呢?高手帮忙看下。谢谢。

解决方案 »

  1.   

    单步跟踪的时候printf("123");这句话运行了,不报错,程序一直停了,要不我把代码给你,你帮我看下?
      

  2.   

    看起来像是timeout的问题,你的timeout是怎么初始化的?要不先把select中最后参数给NULL试试。
      

  3.   

            timeout.tv_sec = iConnTimeout;
    timeout.tv_sec = 0;
             iConnTimeout是从键盘输入的,我设置为2,
      

  4.   

    你先换NULL试试。
    另外,在可能出错的地方加入判断,如果出错就GetLastError,并用MessageBox把错误码显示出来。没法直接调试时经常用这种办法。
      

  5.   

    好象改成NULL,程序就好了,为什么啊????  相当不理解。
      

  6.   

    就是超时了,你的timeout时间给的不够长。NULL表示无限制等待。