У меня есть «неверный аргумент sendto ()», когда я отправляю второе сообщение с моим кодом сокетов - PullRequest
0 голосов
/ 24 июня 2019

Я пытался написать класс на C ++ для отправки сокетов на сервер и прослушивания его ответа.

Мой код работает хорошо, но я все еще хочу подключиться к серверу, поэтому я пишу класс, чтобы у объекта все еще было соединение.

# включает "client.h"

/*
    Simple tcp client
*/
#include <stdio.h>;    //printf
#include <string.h>; //memset
#include <stdlib.h>; //exit(0);
#include <arpa/inet.h>;
#include <sys/socket.h>;

#define SERVER 2;
#define BUFLEN 512    //Max length of buffer
#define PORT 10000    //The port on which to send data

//int sendToServer(__u8 [BUFLEN],__u8 * );

class ClientSocket{
    private:
        struct sockaddr_in si_other;
        int s, i, slen=sizeof(si_other);

        char buf[BUFLEN];

    public:
        void connectTo();
        void die(char *s){
            perror(s);
            exit(1);
        }

        int sendToServer(u_int8_t [BUFLEN],u_int8_t *);
};


 client.cpp

void ClientSocket::connectTo(){
    if ((this->s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1){
        this->die("socket");
    }

    memset((char *) &si_other, 0, sizeof(this->si_other));
    this->si_other.sin_family = AF_INET;
    this->si_other.sin_port = htons(PORT);

    if (inet_aton("127.0.0.1", &si_other.sin_addr) == 0) {
        fprintf(stderr, "inet_aton() failed\n");
        exit(1);
    }

    if(connect(this->s,(struct sockaddr *) &this->si_other,sizeof(this->si_other)) == -1)
    {
        die("connect()");
    }
}

int ClientSocket::sendToServer(u_int8_t messageBin[BUFLEN],u_int8_t * msgTx){
    char message[BUFLEN];

    for (size_t k = 0; k < BUFLEN; k++) {
        message[k] = (char) messageBin[k];
    }

    //send the message
    if (sendto(this->s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen)==-1)
    {
        die("sendto()");
    }

    //receive a reply and print it
    //clear the buffer by filling null, it might have previously received data
    memset(this->buf,'\0', BUFLEN);
    //try to receive some data, this is a blocking call
    if (recvfrom(this->s, this->buf, 512, 0,(struct sockaddr *) &si_other,(socklen_t*) &slen) == -1)
    {
        die("recvfrom()");
    }

    printf("Message recieve by server: ");
    puts(buf);
    printf("\n");

    for (size_t k = 0; k < BUFLEN; k++) {
        msgTx[k] = (u_int8_t) this->buf[k];
    }

    return 1;
}

Хорошо работает для первого сообщения, но у меня появляется ошибка "sendto () Недопустимый аргумент" при отправке второго сообщения.

1 Ответ

0 голосов
/ 24 июня 2019

Я нашел решение:

Функции sendto и recvfrom не предназначены для TCP-соединения.

Я использую send и recv, и теперь он работает правильно.

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