Recvfrom и Wireshark - PullRequest
       26

Recvfrom и Wireshark

1 голос
/ 27 апреля 2019

Я общаюсь с сервером, отправляю сообщение с сокетом (sock_raw ..), все отлично, клиент (я), отправляю сообщение, сервер получает правильное сообщение, но когда серверу нужно отправитьэто мне (клиенту), клиент не получает нужную информацию с помощью recv from.

Я получаю это при двух вызовах server-> client:

buffer = [E] | len_buffer = [2]
buffer = [E] | len_buffer = [2]

Но мойбуфер должен быть равен этим данным и иметь такой размер:

Первый вызов (шестнадцатеричные данные с 10 байтами) enter image description here

И Второй вызов (данные в шестнадцатеричном формате с 2 байтами) enter image description here

Вот как я используюФункция recvfrom (t-> sock - это сокет fd сервера, t-> msg_recv - буфер, созданный для получения сообщения от сервера, а t -> _ recv - структура sockaddr * для получения):

if (recvfrom(t->sock, t->msg_recv, sizeof(t->msg_recv), 0, \
    (struct sockaddr *)&t->_recv, \
    (socklen_t[1]){sizeof(struct sockaddr_in)}) < 0) {
        perror("recvto()");
        exit(84);
    }

Barmar - это результат отправки сообщения Wireshark:

enter image description here

Вот кодsend и recvfrom по одной функции:

int len = 0;
    if (sendto(t->sock, t->buffer, t->ip->tot_len, 0,
               (struct sockaddr *)&t->_sin, sizeof(t->_sin)) < 0) {
      perror("sendto()");
      exit(84);
    }
    if ((len = recvfrom(t->sock, t->msg_recv, sizeof(t->msg_recv), 0, \
    (struct sockaddr *)&t->_recv, \
    (socklen_t[1]){sizeof(struct sockaddr_in)})) < 0) {
        perror("recvto()");
        exit(84);
    }

1 Ответ

0 голосов
/ 27 апреля 2019

Буфер не является строкой, это двоичные данные, поэтому вы не должны печатать его с %s.

Вам нужно получить длину буфера при вызове recvfrom. Затем используйте цикл, который печатает каждый байт в формате %02X.

len = recvfrom(t->sock, t->msg_recv, sizeof(t->msg_recv), 0, \
    (struct sockaddr *)&t->_recv, \
    (socklen_t[1]){sizeof(struct sockaddr_in)});
if (len < 0) {
        perror("recvto()");
        exit(84);
}
for (int i = 0; i < len; i ++) {
    printf("%02X ", t->msg_recv[i]);
    if (i % 16 == 15) {
        printf("\n");
    } else if (i % 16 == 7) {
        printf(" ");
    }
}
printf("\n");
...