Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.84] |
|
Сообщ.
#1
,
|
|
|
В RAD Studio есть такой код:
IdUDPServer5->SendBuffer("192.168.2.253",4002,RawToBytes(LightSend, 11)); IdUDPServer5 - это компонент сервера в RAD Studio. Надо в VC++ 2012 года реализовать аналог этого оператора, чтобы передавать слиенту данные. Я прошёлся поиском по форуму, нашел ссылку на пример. Все работает, но там сначала сервер принимает функцией recvfrom, в которую приходит адрес клиента, а потом по этому адресу передает данные клиенту. А надо без приема передать данные. Я поправил сервер, теперь он передает. Но клиент для приема у меня не получается. Я пробовал следующий код: #include <sys/types.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <winsock2.h> #pragma comment(lib, "Ws2_32.lib") int main(){ int clientSocket;///, portNum, nBytes; char buffer[100]; struct sockaddr_in serverAddr; struct sockaddr_storage serverStorage; int addr_size, serverStorage_s; /*Create UDP socket*/ WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; }; clientSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(4002); serverAddr.sin_addr.s_addr = inet_addr("192.168.2.100"); memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); addr_size = sizeof serverAddr; serverStorage_s=sizeof serverStorage; int a = recvfrom(clientSocket,buffer,8,0, (struct sockaddr *)&serverAddr, &addr_size); if (a >0) printf("Received from server: %s\n",buffer); return 0; } Но он что то не работает, наверное потому, что нет конекта, но конект, если я правильно понимаю,существует только для TCP-IP. Я смотрел функцию recv, но пример в MSDN, для нее только для TCP-IP. Что я делаю не правильно? |
Сообщ.
#2
,
|
|
|
Логика работы UDP-клиент/сервера простая.
Сервер UDP ждет входящее сообщение от клиента, находясь в бесконечном цикле recvfrom() Во входном сообщении для стека TCP/IP самое главное - это полученный от клиента IP-адрес. Именно туда и будет идти ответ. Но это при взаимодействии клиент/сервер. Если входящего сообщения нет,т.е. не клиент является инициирующей стороной, то и ответа от сервера нет. По вашей идее вам нужно взаимодействие не клиент/сервер, а сервер/клиент, причем клиент тоже висит на recvfrom(), т.е по сути является вариантом сервера. Это вполне реальный сценарий. В этом случае просто серверу надо передать адрес клиента программным способом. Т.е. у вас просто другой протокол общения, и его надо именно так и организовать. И в данном случае на клиенте придется сделать bind() к локальному адресу, иначе пакеты не найдут адресат. |
Сообщ.
#3
,
|
|
|
Интересно, спасибо!
|