Проблема с кодом сокета C ++ при отправке и шестнадцатеричном сообщении - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь отправить шестнадцатеричные данные на другое устройство. Компиляция не приводит к ошибкам. Но когда я запускаю функцию из терминала, ничего не происходит, но должен включиться свет. Я поставил cout на connect (), чтобы увидеть, есть ли у меня проблемы с подключением, но он отвечает 0 (так что у меня нет проблем), может быть, это как я пишу шестнадцатеричный код? Помимо кода я также вставляю командную строку, которую я выполняю с шестнадцатеричным кодом. Странно то, что если я использую любую программу, например PacketSender, с такими же параметрами, она работает.

. / Main 192.168.2.170 26810000A7

во вложении, я также добавляюснимок экрана, сделанный на PacketSender. Кроме того, я могу сказать, что если я оставлю команду recv () в коде, как только дам команду из терминала, приглашение останется в ожидании ... если вместо этого я прокомментирую recv (), как только я дамкоманда из приглашения возвращается в приглашение, но ничего не предпринимает (поэтому не включает свет). У кого-нибудь есть идеи?

введите описание изображения здесь

#include <stdio.h>
#include <errno.h>
#include <string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cstring>
#include <unistd.h>
#include <iostream>
#include <unistd.h>

using namespace std;

// per compilare gcc connect_PE.cpp -lstdc++ -o main
int main(int argc, char *argv[])
{
    int sockfd, n;
    struct sockaddr_in servaddr;

    std::string serveraddr = argv[1];

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr(serveraddr.c_str());
    servaddr.sin_port = htons(9761);

    connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    cout << connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    const std::string hex = argv[2];

    char *number = strcpy(new char[hex.length() + 1], hex.c_str());


    send(sockfd, &number, 8, 0);
    recv(sockfd, &number, 8, 0);

}

1 Ответ

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

Вы передаете адрес из number, когда вам нужно передать его значение .

Или даже лучше, просто передайте hex.data() или &hex[0] - копировать его нет смысла.

Также обратите внимание, что вы отправляете строку символов, а не чисел в шестнадцатеричной форме.
(Первый char - это не 0x26, то есть 38, но ’2’, которыйвероятно 50.)

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

...