На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Создать на сокетах Windows аналог работы сервера в RAD Studio , Надо переписать передачу от сервера в RAD Studio используя сокеты Windows.
      В RAD Studio есть такой код:
      ExpandedWrap disabled
        IdUDPServer5->SendBuffer("192.168.2.253",4002,RawToBytes(LightSend, 11));


      IdUDPServer5 - это компонент сервера в RAD Studio.
      Надо в VC++ 2012 года реализовать аналог этого оператора, чтобы передавать слиенту данные. Я прошёлся поиском по форуму, нашел ссылку на пример. Все работает, но там сначала сервер принимает функцией recvfrom, в которую приходит адрес клиента, а потом по этому адресу передает данные клиенту. А надо без приема передать данные. Я поправил сервер, теперь он передает. Но клиент для приема у меня не получается.
      Я пробовал следующий код:
      ExpandedWrap disabled
        #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.
      Что я делаю не правильно?
      Сообщение отредактировано: Oleg2004 -
        Логика работы UDP-клиент/сервера простая.
        Сервер UDP ждет входящее сообщение от клиента, находясь в бесконечном цикле recvfrom()
        Во входном сообщении для стека TCP/IP самое главное - это полученный от клиента IP-адрес. Именно туда и будет идти ответ.
        Но это при взаимодействии клиент/сервер.
        Если входящего сообщения нет,т.е. не клиент является инициирующей стороной, то и ответа от сервера нет.
        По вашей идее вам нужно взаимодействие не клиент/сервер, а сервер/клиент, причем клиент тоже висит на recvfrom(), т.е по сути является вариантом сервера. Это вполне реальный сценарий. В этом случае просто серверу надо передать адрес клиента программным способом.
        Т.е. у вас просто другой протокол общения, и его надо именно так и организовать.
        И в данном случае на клиенте придется сделать bind() к локальному адресу, иначе пакеты не найдут адресат.
        Сообщение отредактировано: Oleg2004 -
          Интересно, спасибо!
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0186 ]   [ 16 queries used ]   [ Generated: 6.12.24, 16:14 GMT ]