求教各位大虾。
我的代码:
SOCKET client;
SOCKADDR_IN in,to,sender;
BOOL optval=TRUE;
CHAR lpBuffer[1024];
int length;
CHAR  szErr[256] = "";

int  dwSenderSize;
fd_set fdread;
int ret=0;
struct timeval tv={60,0};
time_t time1,time2; if ((client=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET) {
TRACE("clientsocket fail!");
}
in.sin_family=AF_INET;
in.sin_addr.s_addr=INADDR_ANY;
in.sin_port=htons(LocalPort);      //本地端口
if (bind(client,(LPSOCKADDR)&in,sizeof(in))) {
TRACE("clinet bind fail");
closesocket(client);
}
if (setsockopt(client,SOL_SOCKET,SO_BROADCAST,(char*)&optval,sizeof(optval))==
SOCKET_ERROR) {
TRACE("client setopt fail");
closesocket(client);
}
to.sin_family=AF_INET;
to.sin_addr.s_addr=INADDR_BROADCAST;
to.sin_port=htons(SRVPORT);       //服务器端口
         
         FM_PROBESRV_REQ Prober_Req;     //要发送的结构
Prober_Req.MsgHead.nMsgType=TM_PROBESRV_REQ;
Prober_Req.MsgHead.nMsgLength=sizeof(FM_PROBESRV_REQ);
if ((length=sendto(client,(char*)&Prober_Req,sizeof(FM_PROBESRV_REQ),0,(LPSOCKADDR)&to,
sizeof(SOCKADDR)))==SOCKET_ERROR){
closesocket(client);
TRACE("send fail");
}
dwSenderSize=sizeof(sender);
time(&time1);
//上面发送探测服务器的广播帧,服务器收到后回复响应帧,大家不必理会
//下面使用select模式接受服务器响应帧,问题是ret=0,MSDN说ret=0是超时,我改动tv值还是不行
    while(TRUE){

FD_ZERO(&fdread);
FD_SET(client,&fdread);
if ((ret==select(0,&fdread,NULL,NULL,&tv))==SOCKET_ERROR) {
wsprintf(szErr, "select failed; %d", WSAGetLastError());
TRACE(szErr);
}

if (ret>0&&FD_ISSET(client,&fdread)){
ZeroMemory(lpBuffer,sizeof(lpBuffer));
if((length=recvfrom(client,lpBuffer,1024,0,(LPSOCKADDR)&sender,&dwSenderSize))==
    SOCKET_ERROR){
    TRACE("recv fail ");
}
}
LP_PROBESRV_RSP ProbeSrv_Rsp=(LP_PROBESRV_RSP)lpBuffer;
if (TM_PROBESRV_RSP==ProbeSrv_Rsp->MsgHead.nMsgType) {
svrhost.nUserCount=ProbeSrv_Rsp->nUserCount;
svrhost.ServerIP=ProbeSrv_Rsp->ulIPAddr;
strcpy(svrhost.szServerInfo,ProbeSrv_Rsp->szServerInfo);
Hostarray.Add(svrhost);
}
time(&time2);
// AfxMessageBox(time2);
if (1000<(time2-time1)) {
break;
}

}