Проблема с простым клиентским / серверным приложением UDP - PullRequest
0 голосов
/ 04 декабря 2010

Хорошо.Итак, у меня есть простая клиентская программа, отправляющая изображения по UDP на указанный IP-адрес.При указанном IP-адресе серверная программа прослушивает и должна получать изображения.

Когда я пробую обе программы на локальном хосте (то есть они обе работают на 127.0.0.1), она работает, и сервер получает изображения.Когда я пытаюсь разместить клиентские и серверные программы на разных компьютерах в одной сети, он не работает.

147.232.24.163 - это IP-адрес сервера, 147.232.24.150 - это IP-адрес клиента.* Вот моя клиентская программа:

  // Initialize UDP.    
  struct sockaddr_in server;    
  int n_sent;
  int socketId = socket(AF_INET, SOCK_DGRAM, 0);    
  if (socketId < 0)    
  {    
    cout << "Problem creating socket." << endl;    
  }    
  server.sin_family = AF_INET;    
  server.sin_addr.s_addr = inet_addr("147.232.24.163");    
  // Establish the server port number - we must use network byte order!    
  server.sin_port = htons(42001);

  for ( int iter = 0; iter < 60; iter++ )    
  {
      // load image into jpegBuf

      n_sent = sendto(socketId, reinterpret_cast<char*> (&jpegBuf[0]), jpegBuf.size(), 0, (struct sockaddr*) &server, sizeof(server));    
      if (n_sent < 0) {    
        cout << "Problem sending data." << endl;    
      }    
  }

  close(socketId);

Вот моя серверная программа:

int main()
{
    int bufferSize = 1024000;
    int iSockFd = -1;
    int iLength = 0;
    struct sockaddr_in servAddr, cliAddr;
    char buff[bufferSize];
    iSockFd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    memset(&servAddr, 0, sizeof(servAddr));
    memset(&cliAddr, 0, sizeof(cliAddr));

    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr("147.232.24.163"); 
    servAddr.sin_port = htons(42001);
    int cliAddrLen = sizeof(struct sockaddr_in);
    int bindRet = bind(iSockFd, (struct sockaddr*)&servAddr, sizeof(servAddr));
    cout << "Bind returned " << bindRet << endl;

    int i = 0;
    while (true)
    {
        int iRcvdBytes=recvfrom(iSockFd, buff, bufferSize, 0, 
        (struct sockaddr*)&cliAddr, (socklen_t*)&cliAddrLen);

        if (0 == i % 5)
        {
            cout << "Received " << iRcvdBytes << " bytes from the client" << endl;
        }


        i++;
    }
    close(iSockFd);
    return 0;
}

Есть идеи, почему она не работает?Я не получаю никаких сообщений об ошибках.

1 Ответ

2 голосов
/ 05 декабря 2010

Это не решение, но ваш код должен проверять iRcvdbytes на наличие ошибок так же, как отправляющий код проверяет результат sendto.

Возврат 0 означает, что сокет был закрыт изящно (если он ориентирован на соединение - это не должно применяться), SOCKET_ERROR означает ошибку (по крайней мере, в WinSock2).

Сокет на стороне отправки должен быть создан с IPPROTO_UDP, а не с 0. Это может определенно вызвать вашу ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...