Отправка массива через сокеты - PullRequest
0 голосов
/ 30 января 2011

Я пытаюсь отправить массив, используя send():

char* packet = new char[3];
packet[0] = 0;
packet[1] = 1;
packet[2] = 2;

И я пытаюсь напечатать это так:

char temp[3]; Recv(temp, 3);
for(unsigned int i = 0; i < 3; i++) {
    cout << temp[i] << endl;
}

Но я получаю только 2 странных персонажа на экране. В чем может быть проблема? Я использую send(packet, 3).

Код сервера:

class Server {
    WSAData wsadata;
    int desc;
    int remoteSocket;
    SOCKADDR_IN server;
public:
    Server() {
        if (WSAStartup(MAKEWORD(1, 1), &wsadata) != 0 )
        {
            cout << "Error creating socket" << endl;
            exit(1);
        }
        wsadata.wVersion = 5;
    }
    ~Server() {
        WSACleanup();
    }
    void Initialize() {
        memset(&server, 0, sizeof(server));

        server.sin_family = AF_INET;
        server.sin_addr.s_addr = INADDR_ANY; // Where to start server?
        server.sin_port = htons(9898); // Port
    }
    void Socket() {
        desc = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (desc == -1) {
            cout << "Error in Socket()" << endl;
        }
    }
    void Bind() {
        if ((::bind(desc, (LPSOCKADDR)&server, sizeof(server))) == -1) {
            cout << "Error in Bind()" << endl;
        }
    }
    void Listen() {
        if ((::listen(desc, 5)) == -1) {
            cout << "Error in Listen()" << endl;
        }
    }
    void Accept() {
        SOCKADDR_IN sock;
        int intsock = sizeof(sock);
        remoteSocket = ::accept(desc, (LPSOCKADDR)&sock, &intsock);
        if (remoteSocket == -1) {
            cout << "Error in Accept()" << endl;
        }
        HandleConnection();
    }
    void HandleConnection() {
        cout << "You are connected !!!" << endl;
        char temp[3];
        Recv(temp, 3);
        for(unsigned int i = 0; i < 3; i++) {
            if (temp[i] == '2')
                cout << "I got a 2";
        }
    }
    void Send(const char* buffer, int size) {
        if ((::send(remoteSocket, buffer, size, 0)) < 0) {
            cout << "Error in Send()" << endl;
        }
    }
    void Recv(char* buffer, size_t size) {
        size_t n = 0;
        n = ::recv(remoteSocket, buffer, size, 0);
    }

};

int main() {
    Server s;
    s.Initialize();
    s.Socket();
    s.Bind();
    s.Listen();
    while(1) {
        s.Accept();
    }
    return 0;
}

Код клиента:

class Client {
    int desc;
    SOCKADDR_IN client;
    WSAData wsadata;
public:
    Client() {
        if (WSAStartup(MAKEWORD(1, 1), &wsadata) != 0) {
            cout << "Error creating socket" << endl;
            exit(1);
        }
        wsadata.wVersion = 5;
    }
    ~Client() {
        WSACleanup();
    }
    void Initialize() {
        memset(&client, 0, sizeof(client));
        client.sin_family = AF_INET;
        client.sin_addr.s_addr = inet_addr("127.0.0.1");
        client.sin_port = htons(9898);
    }
    void Socket() {
        desc = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (desc == -1) {
            cout << "Error in Socket()" << endl;
        }
    }
    void Connect() {
        if ((::connect(desc, (LPSOCKADDR)&client, sizeof(client))) > 0) {
            cout << "Error in Connect()" << endl;
        }
    }
    void Send(const char* buffer, int size) {
        int n;
        if ((n = ::send(desc, buffer, size, 0)) < 0) {
            cout << "Error in Send()" << endl;
        }
    }
    void Recv(char* buffer, size_t size) {
        size_t n = 0;
        n = ::recv(desc, buffer, size, 0);
        cout << n;
    }
};

int main() {
    Client c;
    c.Initialize();
    c.Socket();
    c.Connect();
    char packet[3];
    packet[0] = '0';
    packet[1] = '1';
    packet[2] = '2';
    c.Send(packet, 3);
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 30 января 2011

Когда вы используете couture для печати символов, он обрабатывает их как символы, а не числовые значения.Поскольку вы отправили 0, 1 и 2, все из которых являются значениями ASCII низкого порядка, система может отображать их с любыми глифами или, возможно, вообще без них.В этом случае я бы предположил, что символы соответствуют нулевому символу для нуля (который не будет отображаться вообще) и символам мусора для двух других.

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

1 голос
/ 30 января 2011

Я думаю, вы хотите, чтобы 1 2 3 было напечатано на экране.Если так, то вы должны сделать это:

packet[0] = '0'; //note the single quote!
packet[1] = '1';
packet[2] = '2';

Вы заметили разницу?

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