SOCKET Socket;
volatile bool stop = false;
// Рабочий поток, разгребаем принятое...
UINT threadLAN(LPVOID foo)
{
fd_set fds;
struct timeval timeout;
while(!stop)
{
timeout.tv_sec = 0;
timeout.tv_usec = 100;
FD_ZERO(&fds);
FD_SET(pDlg->Socket, &fds);
int rc = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout);
if(rc > 0)
{
char rbuf[1024];
SOCKADDR_IN clientaddr;
int len = sizeof(clientaddr);
int sz = recvfrom(pDlg->Socket, rbuf, 1024, 0, (sockaddr *) &clientaddr, &len);
if(sz == /* проверка на размер полученных данных */)
{
/* разгребаем данные в rbuf[] */
}
}
}
return 0;
}
// Инициализация...
bool ok = true;
WSADATA wd;
WSAStartup(1, &wd);
Socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(Socket == -1)
{
MessageBox(L"Error creating UDP socket");
ok = false;
}
SOCKADDR_IN UDPserveraddr;
memset(&UDPserveraddr,0, sizeof(UDPserveraddr));
UDPserveraddr.sin_family = AF_INET;
UDPserveraddr.sin_port = htons(5520 /* Номер порта */);
UDPserveraddr.sin_addr.s_addr = INADDR_ANY; /* Приём с любого адреса, в т.ч. широковещательные */
int len = sizeof(UDPserveraddr);
if(bind(Socket, (SOCKADDR *) &UDPserveraddr, sizeof(SOCKADDR_IN)) < 0)
{
MessageBox(L"Error binding UDP socket");
ok = false;
}
if(ok)
{
AfxBeginThread(threadLAN, NULL);
}