Передача текста по сети
Пытаюсь разобраться с передачей текста по сети, создал сервер который принимает соединение от клиента и выводит посланные клиентом сообщения на консоль. Проблема в том что после передачи сообщения на консоль сервера выводится мусор, если цепляюсь к серверу например телнетом то сообщения нормально отображаются. Единственное моё предположение что дело может быть в кодировке или в чём то подобном Код сервера:
#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)
Весь код не смотрел — возможно есть и другие ошибки.