- 论坛徽章:
- 0
|
当服务器送出广播信息后客户端可以正常的接收到该信息,但是客户端接受地址中的IP地址和端口号都时始终是零,这是为什么?服务器代码如下。
int ESMAIOService::StartService()
{
int so_broadcast = 1;
struct timeval revtimeout;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1)
{
cerr<< "Error: socket( )"<< endl;
return -1;
}
memset(&bc_addr, 0, sizeof(bc_addr));
bc_addr.sin_family = AF_INET;
bc_addr.sin_port = htons(m_SearchPort);
bc_addr.sin_addr.s_addr = inet_addr(m_Addr);
// set socket option - enable broadcasting
if (setsockopt(sockfd, SOL_SOCKET,SO_BROADCAST, &so_broadcast,sizeof(so_broadcast)))
{
cerr << "error : setsockopt(..SO_BROADCAST..)" << endl;
return -1;
}
revtimeout.tv_sec = 3;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &revtimeout, sizeof(revtimeout));
cout<<"Broadcast port "<<m_SearchPort<<endl;
pthread_create(&SearchThread,NULL,SearchLogin,(void*)this);
return 1;
}
ESMAIOService * cs = static_cast<ESMAIOService*>;(a_para);
char test[] = "welcome in cs---------------\n";
struct sockaddr_in from;
int len=0;
int searchTimes = 10;;
struct in_addr ServAddr;
char pServerAddr[20];
CONTROL_CMD_HEAD head;
SEARCH_SERVER_REQUEST request;
SEARCH_SERVER_RESPOND respond;
request.data.CmdHead = htons(CMD_SEARCH_SERVER_REQUEST);
request.data.State = 0;
request.data.User_ID = 0;
request.data.Check = 0;
for( int i=0; i<searchTimes; i++)
{
if (sendto(cs->;sockfd,&test,sizeof(test),0,(struct sockaddr*)&cs->;bc_addr,sizeof(struct sockaddr_in))==-1)
//if (sendto(cs->;sockfd,&request,sizeof(request),0,(struct sockaddr*)&cs->;bc_addr,sizeof(struct sockaddr_in))==-1)
{
cout<<"Broadcast error!"<<endl;
return NULL;
}
cout<<"begin recve head"<<endl;
memset(&from, 0, sizeof(from));
from.sin_family = AF_INET;
from.sin_port = htons(cs->;m_SearchPort);
from.sin_addr.s_addr = htonl(INADDR_ANY);
if (recvfrom(cs->;sockfd,(void*)&(head),sizeof(head),0,(struct sockaddr*)&from,(socklen_t*)&len)==-1)
{
cout<<"recv head error!"<<endl;
sleep(60);
continue;
}
cout<<"end recve head"<<endl;
if (head.CmdHead == ntohs(CMD_SEARCH_SERVER_RESPOND))
{
if (recvfrom(cs->;sockfd,(void*)&(respond.ServerAddr),sizeof(respond.ServerAddr),0,(struct sockaddr*)&from,(socklen_t*)&len)==-1)
{
cout<<"recv server addr error!"<<endl;
continue;
}
memset(&ServAddr,0,sizeof(ServAddr));
ServAddr.s_addr = respond.ServerAddr;
strcpy((char*)pServerAddr,inet_ntoa(ServAddr));
if (recvfrom(cs->;sockfd,(void*)&(respond.ServerPort),sizeof(respond.ServerPort),0,(struct sockaddr*)&from,(socklen_t*)&len)==-1)
{
cout<<"recv server port error!"<<endl;
continue;
}
respond.ServerPort = ntohs(respond.ServerPort);
cout<<"IP:"<<pServerAddr<<" Port:"<<respond.ServerPort<<endl;
if (recvfrom(cs->;sockfd,(void*)&(respond.WorkModel),sizeof(respond.WorkModel),0,(struct sockaddr*)&from,(socklen_t*)&len)==-1)
{
cout<<"recv WorkModel error!"<<endl;
continue;
}
respond.WorkModel = ntohs(respond.WorkModel);
if (respond.WorkModel == SERVER_OPEN_MODEL) //开放模式
{
}
else if (respond.WorkModel == SERVER_CLOSE_MODEL) //关闭模式
{
}
} //if (head.CmdHead == ntohs(CMD_SEARCH_SERVER_RESPOND))
else
{
sleep(60);
continue;
};
} //for( int i=0; i<searchTime; i++)
cout<<"-------------Can't search login server!--------------"<<endl;
}
客户端代码:
void * ESMALoginService::ClientNotify(void * a_Para)
{
ESMALoginService * cs = static_cast<ESMALoginService*>;(a_Para);
struct hostent *h;
char host[100];
gethostname(host, 100);
if ((h = gethostbyname(host)) == NULL)
{
printf("Error : %s!\n", hstrerror(h_errno));
return NULL;
};
//char * addr = "192.168.0.239";//inet_ntoa (*((struct in_addr *)h->;h_addr_list[0]));//
long addr = ((struct in_addr *)h->;h_addr_list[0])->;s_addr;
while(1)
{
struct sockaddr_in from;
int len=0;
unsigned short WorkModel;
CONTROL_CMD_HEAD head;
SEARCH_SERVER_RESPOND respond;
if (recvfrom(cs->;sockfd,(void*)&head,sizeof(head),0,(struct sockaddr*)&from,(socklen_t*)&len) == -1)
{
cout<<"recv head error!"<<endl;
continue;
}
cout<<"Recvie IP:"<<inet_ntoa(from.sin_addr)<<" Recive Port:"<<ntohs(from.sin_port)<<endl;
if (ntohs(head.CmdHead) == CMD_SEARCH_SERVER_REQUEST)
{
cout<<"IP:"<<inet_ntoa (*((struct in_addr *)h->;h_addr_list[0]))<<" Port:"<<cs->;m_ListenPort<<endl;
respond.Head.CmdHead = htons(CMD_SEARCH_SERVER_RESPOND);
respond.Head.State = htons(0);
respond.Head.User_ID = htons(0);
respond.Head.Check = htonl(ntohl(head.Check) + 1);
respond.ServerAddr = htonl(addr);//htonl(inet_addr(addr));
respond.ServerPort = htons(cs->;m_ListenPort);
WorkModel = cs->;GetServerWorkModel();
if (WorkModel == -1)
{
cout<<"GetServerWorkModel error!"<<endl;
continue;
}
respond.WorkModel = htons(WorkModel);
/*struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(cs->;m_ListenPort);
serv_addr.sin_addr.s_addr = inet_addr("192.168.0.239" ;*/
if (sendto(cs->;sockfd,(void*)&respond,sizeof(respond),0,(struct sockaddr*)&from,len) == -1)
{
cout<<"send SEARCH_SERVER_RESPOND error!"<<endl;
continue;
}
} // if (ntohs(head.ComdHead) == CMD_SEARCH_SERVER_REQUEST)
} // while
}
int main()
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1)
{
cerr<< "Error: socket( )"<< endl;
return -1;
}
// set up server address
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(m_ListenPort);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)))
{
cerr << "error : bind" << endl;
return -1;
}
cout<<"listen udp port:"<<m_ListenPort<<endl;
pthread_create(&ClientThread,NULL,ClientNotify,(void*)this);
return 1;
}
客户端输出如下:
Recvie IP:0.0.0.0 Recive Port:0
IP:127.0.0.1 Port:5001
send SEARCH_SERVER_RESPOND error! |
|