Передача текста по сети

Пытаюсь разобраться с передачей текста по сети, создал сервер который принимает соединение от клиента и выводит посланные клиентом сообщения на консоль. Проблема в том что после передачи сообщения на консоль сервера выводится мусор, если цепляюсь к серверу например телнетом то сообщения нормально отображаются. Единственное моё предположение что дело может быть в кодировке или в чём то подобном Код сервера:

#include <iostream>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <vector>
#include "f_dump.hpp"
#include <arpa/inet.h>
#include <fstream>
using namespace std;
 
void f_writeFile(const char *data_buffer){
    setlocale(LC_ALL, "Russian");
    ofstream fs;
    fs.open("chat_history.log", ofstream::app);
    if(!fs.is_open())
        cout<<"Error open"<<endl;   
    fs << data_buffer<<"\n" ;
    int test=5;
    fs.close();
 
}
 
string f_readFlile(string *cmd_history){
    string history;
    setlocale(LC_ALL, "Russian");
        ifstream fs;
        fs.open("chat_history.log", ofstream::app);
    if(!fs.is_open())
                cout<<"Error open"<<endl;
    
    return history;
 
}
 
int main(){
    int sockfd, new_sockfd, yes=1, snd, rcv;
    const int PORT = 7890;
    char buf[1024];
    struct sockaddr_in host_addr, client_addr;
    socklen_t sin_size;
    vector <char> send_msg={'X'};
 
 
 
    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0))!=-1)
        cout << "sockfd create......" << sockfd << endl;
 
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))!=-1)
        cout << "setsockopt accepted......" << setsockopt << endl;
 
    host_addr.sin_family=AF_INET;
    host_addr.sin_port=htons(PORT);
    inet_aton("192.168.173.37", &host_addr.sin_addr);
    
    cout<<inet_ntoa(host_addr.sin_addr)<<endl;
    memset(&(host_addr.sin_zero), '\0', 8);
    
    if (bind(sockfd, (struct sockaddr *)&host_addr, sizeof(struct sockaddr))!=-1)
        cout << "bind addr_iface and num_port..." << bind << endl;
 
    if (listen(sockfd, 5)!=-1)
        cout << "waiting connections......" << listen << endl;
 
    while(1)
    {
        sin_size=sizeof(struct sockaddr_in);
        new_sockfd=accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
        if (new_sockfd!=-1)
            cout << "connecting......" << endl << "incoming connection" << endl;
        send(new_sockfd, "Hy, welcome to grcc.com!!! O_0", 19, 0); cout<<send<<endl;
        rcv=recv(new_sockfd, &buf, 1024, 0);
        while (rcv>0)
        {
            printf("RECV: %d байтов\n", rcv);
            dump(buf, rcv);
            f_writeFile(buf); //write history in file
            rcv=recv(new_sockfd, buf, 1024, 0);
            //cout << recv(new_sockfd, &buf, 1024,0) << endl;
        }
 
 
 
        close (new_sockfd);
    }
}

Код клиента:

#include <iostream>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <vector>
#include <arpa/inet.h>
#include "f_dump.hpp"
using namespace std;
 
string f_recv(int sockfd, int new_sockfd){
    char buf[1024];
    new_sockfd=recv(sockfd, buf, 30, 0);
    for (int i=0; i<=30; i++)
        return(buf);    
    cout << endl;
}
 
bool f_send(int sockfd, int new_sockfd, string message){
    bool flag;
    new_sockfd=send(sockfd, &message, message.size()-1, 0);
    if (new_sockfd > 0)
        return(flag=1);
    else
        return(flag=0);
}
 
 
 
int main(){
    int sockfd, new_sockfd, yes=1, snd, rcv;
    const int PORT = 7890;
    char buf[1024];
    struct sockaddr_in host_addr, client_addr, dest_srv_addr;
    socklen_t sin_size;
    vector <char> send_msg={'F'};
    string message;
    bool flag_send; 
 
    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0))!=-1)
        cout << "sockfd create......" << sockfd << endl;
 
    //if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))!=-1)
    //  cout << "setsockopt accepted......" << setsockopt << endl;
 
    client_addr.sin_family=AF_INET;
    client_addr.sin_port=htons(PORT);
    inet_aton("192.168.173.37", &client_addr.sin_addr);
 
    cout<<inet_ntoa(client_addr.sin_addr)<<endl;
 
    memset(&(host_addr.sin_zero), '\0', 8);
    
    new_sockfd=connect(sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr));
    if (new_sockfd)
    {
        perror("error");
        exit(1);
    }
 
 
 
    while (1)
    {
 
        
    //  cout << f_recv(sockfd, new_sockfd) << endl;
 
        getline(cin, message);
        flag_send = f_send(sockfd, new_sockfd, message);
        if (flag_send > 0)
        {
            cout << "Message sent!" << endl;
        }   
        flag_send = 0;  
    }
 

    /*while (1) 
    {
        rcv=read(new_sockfd, buf, 1024);
        for(int i=0; i<=rcv; i++)
        cout<<rcv;
        send(new_sockfd, "Hy", 2, 0);
        while(rcv>0)
        {
            printf("RECV: %d байтов\n", rcv);
            dump(buf, rcv);
            rcv=recv(new_sockfd, &buf, 1024, 0);
        }
        close(new_sockfd);
    }*/
        
        
     
}

Код f_dump

void dump(const char *data_buffer, const unsigned int lenght) {
unsigned char byte;
unsigned int i, j;
for(i=0; i<lenght; i++)
{
    byte=data_buffer[i];
    printf("%02x ", data_buffer[i]);

    if (((i%16)==15) || (i==lenght-1))
    {
        for(j=0; j<15-(i%16); j++)
            printf("  ");
        printf ("| ");
        for (j=(i-(i%16)); j<=i; j++)
        {
            byte=data_buffer[j];
            if ((byte>31) && (byte<127))
                printf("%c", byte);
            else
                printf(".");
        }
        printf("\n");
    }
}

}


Ответы (1 шт):

Автор решения: Fat-Zer

Проблема в том, что клиент отправляет мусор:

bool f_send(int sockfd, int new_sockfd, string message){
   bool flag;
   new_sockfd=send(sockfd, &message, message.size()-1, 0);

Здесь отправляется не содержимое строки, а первые байты объекта класса std::string. Очевидно, подразумевалось что-то такое:

send(sockfd, message.c_str(), message.size(), 0)

Весь код не смотрел — возможно есть и другие ошибки.

→ Ссылка