Не могу сохранить адрес клиента в sourceMsgs [j] - PullRequest
0 голосов
/ 31 октября 2019

Название говорит само за себя, это может быть просто, но я довольно новичок в программировании, поэтому глупый вопрос ..

У меня есть:

printf("sourcemsg: %s", inet_ntoa(sourceMsgs[j].sin_addr));

, чтобы увидетьесли IP-адрес, который сохранен в sourceMsgs [j], является правильным, и это было так, я предполагаю, что проблема в:

nbytes = sendto(s, response , reslen, 0 , (struct sockaddr *)&sourceMsgs[i],sizeof(sourceMsgs));
            //    (uk: save the coordinates/address of the source of the received message
            //    in table sourceMsgs at index nReceivedMessages).

            //I'm pretty sure what I did here is wrong

            int j = nReceivedMessages;
            sourceMsgs[j].sin_addr = cli_addr.sin_addr;
            printf("sourcemsg: %s", inet_ntoa(sourceMsgs[j].sin_addr));
            nReceivedMessages++;
            total += receivedValue;

            printf("<Servidor> Valor recebido: %f\n", receivedValue);
            //(uk: <Server> Received value)

            if(nReceivedMessages == 1){


                timeout = 1;
                setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(DWORD));

            }

        }

    }

    sprintf(response,  "Received Messages: %f Total: %f", nReceivedMessages, total);

    int reslen = sizeof(response);

    for(i=0; i<nReceivedMessages; i++){

        //    (uk: transmit the content of variable response, the previously defined string, to
        //    all the destinations in table sourceMsgs).

        nbytes = sendto(s, response , reslen, 0 , (struct sockaddr *)&sourceMsgs[i],sizeof(sourceMsgs));

Я извиняюсь, если сообщение является чрезвычайно неполным, ноэто мой первый. Заранее спасибо за помощь

Редактировать:

Кажется, проблема действительно в передаче длины структуры (WSAError 10014). Код теперь такой:

nbytes = sendto(s, response , strlen(response), 0 , (struct sockaddr *)&sourceMsgs[i].sin_addr, sizeof(sourceMsgs[i].sin_addr));

Я не совсем уверен, что делать, но, вероятно, есть другой способ сделать:

               sourceMsgs[j].sin_addr = cli_addr.sin_addr;
               printf("sourcemsg: %s", inet_ntoa(sourceMsgs[j].sin_addr));
               nReceivedMessages++;
               total += receivedValue;

, так как я думаю, что путьЯ сделал это, но облажался.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Может быть проблема с передачей длины структуры.

nbytes = sendto(s, response, reslen, 0, (struct sockaddr *)&sourceMsgs[i], sizeof(sourceMsgs[i]));

// sizeof(sourceMsgs) gives - ( sizeof(sourceMsgs[1] or struct sockaddr_in) * (No. of messages in array) ).

Также я заметил проблему установки таймаута recv с использованием setsockopt. См. SO_RCVTIMEO для объяснения.

0 голосов
/ 31 октября 2019

Аргумент sendto должен быть указателем на структуру sockaddr, а не на структуру, которая его содержит.

nbytes = sendto(s, response , reslen, 0 , (struct sockaddr *)&sourceMsgs[i].sin_addr,sizeof(sourceMsgs[i].sin_addr));

...