Pergunta

Isso envia dados apenas uma vez, o que me parece irracional como está em um loop:

char* hello;
for (int i = 0; i < 10; i++) {

    hello = "Hello world!\n";
    if (UDT::ERROR == UDT::send(client, hello, strlen(hello) + 1, 0))
    {
        cout << "send: " << UDT::getlasterror().getErrorMessage();
    }

}

Não deve enviar dados 10 vezes? Eu não entendo. Aqui está todo o programa (é bastante curto):

int main()
{
    UDTSOCKET client;
    sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(9000);
    inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
    memset(&(serv_addr.sin_zero), '\0', 8);

    client = UDT::socket(AF_INET, SOCK_STREAM, 0);

    // connect to the server, implict bind
    if (UDT::ERROR == UDT::connect(client, (sockaddr*)&serv_addr, sizeof(serv_addr)))
    {
        cout << "connect: " << UDT::getlasterror().getErrorMessage();
    }

    char* hello;
    for (int i = 0; i < 10; i++) {

        hello = "Hello world!\n";

        if (UDT::ERROR == UDT::send(client, hello, strlen(hello) + 1, 0))
        {
            cout << "send: " << UDT::getlasterror().getErrorMessage();
        }

    }

    UDT::close(client);

    system("pause");
}
Foi útil?

Solução

Você verificou o código do lado do servidor. O cliente está enviando um loop para o loop, como o lado do servidor está recebendo?

Editar: em referência à sua postagem aqui. Se o código do seu servidor se parecer com isso, ele receberá apenas uma vez. O servidor está obtendo a conexão do cliente e, em seguida, mais uma vez aguarda a conexão de um cliente. Mas o cliente continua enviando um loop. É apenas um palpite que esse é o código do seu servidor, eu poderia estar errado.

while (true)
{
  UDTSOCKET recver = UDT::accept(serv, (sockaddr*)&their_addr, &namelen);

  cout << "new connection: " << inet_ntoa(their_addr.sin_addr) << ":" << ntohs(their_addr.sin_port) << endl;

  if (UDT::ERROR == UDT::recv(recver, data, 100, 0))
  {
    cout << "recv:" << UDT::getlasterror().getErrorMessage() << endl;
    //return 0;
  }
....................
....................
}

Outras dicas

Ele passa pelo loop 10 vezes ou apenas passa pelo loop uma vez?

Não estou familiarizado com a biblioteca que você está usando, mas não vi nenhum tipo de flush comando. Se passar pelo loop 10 vezes, mas enviar apenas dados uma vez, talvez seja necessário lavar.

A estrutura do cliente e do servidor não corresponde.

O cliente envia 10 vezes dentro de 1 conexão. O servidor aceita 10 conexões e lê apenas 1 tempo dentro de cada uma.

Obviamente, cada conexão é similar a um contêiner. Os dados enviados, mas não lidos após o fechamento de uma conexão, são descartados e (é claro) não são acessíveis a partir de outras conexões.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top