Использую в своей программе (MS VC++) UDP broadcast. Тестирую между настольным компом (Win7) и нетбуком (XP). Они объединены в сеть посредством вайфай: у нетбука встроенный, а в комп воткнут свисток, который работает в режиме точки доступа. Проблема в том, что если отправлять сообщение с компа на нетбук, то оно не доходит. Обратно работает. И если объединить устройства в сеть витой парой через роутер — также работает в обе стороны. Видимо, проблема именно в таком подключении через свисток. Можно ли как-то это обойти?
Вот код отправки:
void SendBroadcast(char * message) {
SOCKET s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s == -1) {
printf("Error in creating socket");
return;
}
char opt = 1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&opt, sizeof(char));
SOCKADDR_IN brdcastaddr;
memset(&brdcastaddr,0, sizeof(brdcastaddr));
brdcastaddr.sin_family = AF_INET;
brdcastaddr.sin_port = htons(MY_PORT);
brdcastaddr.sin_addr.s_addr = INADDR_BROADCAST;
int len = sizeof(brdcastaddr);
char sbuf[1024];
//Заполнение sbuf здесь
sendto(s, sbuf, (int)strlen(sbuf), 0, (sockaddr*)&brdcastaddr, len);
closesocket(s);
}
А это код приема:
DWORD WINAPI BroadcastProcess(LPVOID arg) {
SOCKET broadcastServerSock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(broadcastServerSock == -1) {
printf("Error in creating socket");
return 0;
}
SOCKADDR_IN UDPserveraddr;
memset(&UDPserveraddr,0, sizeof(UDPserveraddr));
UDPserveraddr.sin_family = AF_INET;
UDPserveraddr.sin_port = htons(MY_PORT);
UDPserveraddr.sin_addr.s_addr = INADDR_ANY;
int len = sizeof(UDPserveraddr);
if(bind(broadcastServerSock, (SOCKADDR*)&UDPserveraddr,sizeof(SOCKADDR_IN)) < 0) {
printf("ERROR binding in the server socket");
return 0;
}
char rbuf[1024];
SOCKADDR_IN clientaddr;
len = sizeof(clientaddr);
while(true) {
int received=recvfrom(broadcastServerSock,rbuf, 1023, 0, (sockaddr*)&clientaddr, &len);
if(received>0) {
rbuf[received]='\0';
char *p = inet_ntoa(clientaddr.sin_addr);
int serverportno = ntohs(clientaddr.sin_port);
MessageBoxA(g_hWnd,rbuf,"",MB_OK);
}
}
return 0;
}