Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Мусор при получении данных


Автор: SoulSeeker 21.11.2008, 17:42
Есть сервер. При попытке отослать на него что-нибудь происходят разные вещи, а именно: при подключении виндовским telnet'ом при наборе текст отсылается по одному символу при каждом нажатии, если то же самое сделать через putty, то строка отсылается по нажатии ентер, но вдогонку ей летит еще три сообщения с непонятным мусором. Как быть в такой ситуации?

Код:

Код

#include <iostream>
#include <string.h>
#include <string>
#include <winsock.h>
#pragma hdrstop
#pragma comment(lib, "Ws2_32.lib")

#define SERVER_GREETS   "You were connected to localhost. Welcome."
#define SERVER_BUY        "You were disconnected from localhost. Buy."
#define SERVER_PORT        1234

using namespace std;
 
int main ()
{
    string s;
    int err;
    WSAData WsData;
    if (err=WSAStartup(WsData.wVersion, &WsData)){
        cout << "Error";
        return 0;
    }
    SOCKET ServerSocket=socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in SA;
    SA.sin_family=AF_INET;
    SA.sin_addr.S_un.S_addr=INADDR_ANY;
    SA.sin_port=htons(SERVER_PORT);
    bind(ServerSocket, (sockaddr*)&SA, sizeof(SA));
    listen(ServerSocket, SOMAXCONN);
    SOCKET AcceptSocket;
    cout << "Wating for connection..." << endl;
    while ((AcceptSocket=accept(ServerSocket, 0, 0))!=INVALID_SOCKET){
        cout << "connected...\n";
        send(AcceptSocket, SERVER_GREETS, strlen(SERVER_GREETS), 0);
        char RecvData[32]={' '};
        int recvResult=0;
        do{
            recvResult = recv(AcceptSocket, RecvData, 32, 0);
            cout << "Look! I've got a message: " << RecvData << endl;
        }while (recvResult);
        
        send(AcceptSocket, SERVER_BUY, strlen(SERVER_BUY), 0);
        cout << "Disconnected" << endl;
        cout << "Wating for connection..." << endl;
        closesocket(AcceptSocket);

    }
}


Автор: J0ker 21.11.2008, 19:18
Цитата(SoulSeeker @  21.11.2008,  17:42 Найти цитируемый пост)
Как быть в такой ситуации?

внимательно ознакомиться с работой функции recv
так-же учесть, что телнет - это протокол

Автор: Alca 24.11.2008, 14:44
Код

cout << "Look! I've got a message: " << std::string(RecvData, 32) << endl;

Автор: xVirus 18.1.2009, 17:50
Цитата(SoulSeeker @ 21.11.2008,  17:42)
Есть сервер. При попытке отослать на него что-нибудь происходят разные вещи, а именно: при подключении виндовским telnet'ом при наборе текст отсылается по одному символу при каждом нажатии, если то же самое сделать через putty, то строка отсылается по нажатии ентер, но вдогонку ей летит еще три сообщения с непонятным мусором. Как быть в такой ситуации?

Код:

Код

#include <iostream>
#include <string.h>
#include <string>
#include <winsock.h>
#pragma hdrstop
#pragma comment(lib, "Ws2_32.lib")

#define SERVER_GREETS   "You were connected to localhost. Welcome."
#define SERVER_BUY        "You were disconnected from localhost. Buy."
#define SERVER_PORT        1234

using namespace std;
 
int main ()
{
    string s;
    int err;
    WSAData WsData;
    if (err=WSAStartup(WsData.wVersion, &WsData)){
        cout << "Error";
        return 0;
    }
    SOCKET ServerSocket=socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in SA;
    SA.sin_family=AF_INET;
    SA.sin_addr.S_un.S_addr=INADDR_ANY;
    SA.sin_port=htons(SERVER_PORT);
    bind(ServerSocket, (sockaddr*)&SA, sizeof(SA));
    listen(ServerSocket, SOMAXCONN);
    SOCKET AcceptSocket;
    cout << "Wating for connection..." << endl;
    while ((AcceptSocket=accept(ServerSocket, 0, 0))!=INVALID_SOCKET){
        cout << "connected...\n";
        send(AcceptSocket, SERVER_GREETS, strlen(SERVER_GREETS), 0);
        char RecvData[32]={' '};
        int recvResult=0;
        do{
            recvResult = recv(AcceptSocket, RecvData, 32, 0);
            cout << "Look! I've got a message: " << RecvData << endl;
        }while (recvResult);
        
        send(AcceptSocket, SERVER_BUY, strlen(SERVER_BUY), 0);
        cout << "Disconnected" << endl;
        cout << "Wating for connection..." << endl;
        closesocket(AcceptSocket);

    }
}

Это особенности работы клиентов, telnet виндовский отсылает каждый символ при нажатии,так уж он устроен,а putty только по нажатию энтера.А вот что там за мусор летит,не понятно,посмотреть бы что именно там приходит,может служебные символы какие.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)