2015-08-09 2 views
2

У меня возникают проблемы с отправкой строки по сети TCP, где строка отправляет дополнительные символы, которые не были введены.Отправка строки по сети с использованием сокетов в C++

Например, когда я введите следующую строку ...

я получаю следующий результат на приемном конце.

Ниже приведен код, который я использую для отправки строки.

string input; 
printf("Please input what you want to send...\n"); 
printf(">"); 
cin >> input; 

const char* ch = (const char*)&input; 
int lengthOfBytes = sizeof(input); 

for (int i = 0; i < lengthOfBytes; i++) 
{ 
    n = send(socket_d, &*ch, 10, 0); 
} 

//Reading in characters. 
if (ch == (const char*)'\r') 
{ 
    cout << "\n"; 
} 

И вот код, используемый для получения строки.

int n; 
int count = 0; 
char byte; 
n = recv(socket_d, &byte, 1, 0); 
if (n <= 0) 
{ 
    if (WSAGetLastError() != WSAEWOULDBLOCK) 
    { 
     cout << "Terminated " << WSAGetLastError() << "\n"; 
     return; 
    } 
} 
else 
{ 
    cout << (char) byte; 
    if ((char) byte == '\r') 
     cout << "\n"; 
} 

Что я делаю неправильно при отправке строки по сети?

ответ

4

Вы выполняете почти все неправильно при отправке строки. ch не является указателем на символы строки. lengthOfBytes - это не длина символов строки. Пойдите и исследуйте основы использования класса string.

0
const char* ch = (const char*)&input; 
int lengthOfBytes = sizeof(input); 

Вы должны исправить выше фрагмент кода следующим образом:

int lengthOfBytes = input.length()+1; 
char * ch = new char [lengthOfBytes ]; 
std::strcpy (ch, input.c_str()); 
6

Вы совершенно неправильно поняли, как получить доступ к строковым данным из std::string объекта. Вы должны использовать методы std::string::data() и std::string::size(), чтобы получить строку данных сама по себе, как это:

Отправитель:

std::string input; 

std::cout << "Please input what you want to send...\n"; 
std::cout << "> "; 

cin >> input; 

n = send(socket_d, input.data(), input.size(), 0); 

// check for errors here.. 

У меня нет окна, чтобы мой код клиента не может быть идентичен тому, что нужно, но это может быть что-то немного, как это:

приемник:

std::string s; 

int n; 
char buf[256]; 

while((n = recv(socket_d, buf, sizeof(buf), 0)) > 0) 
    s.append(buf, buf + n); 

if(n < 0) 
{ 
    std::err << std::strerror(errno) << '\n'; 
    return 1; // error 
} 

// use s here 

std::cout << "received: " << s << '\n'; 
Смежные вопросы