【问题标题】:Unable to send the message again using C socket无法使用 C 套接字再次发送消息
【发布时间】:2020-11-23 21:34:19
【问题描述】:

我创建了一个 ClientSocket 和一个 ServerSocket 类来简化功能。在发送数据时,首先我发送一个 16 字节的标头,其中包含消息长度,然后是消息。但是我在第二次将数据从客户端发送到服务器时遇到了麻烦。起初它正在正确发送标头和消息,但之后我在从客户端读取标头时从read() 中的ServerSocket::get_message 获得0 字节输出。请帮帮我。

Server.cpp中的发送和接收部分

    string ServerSocket::get_message(int client_socket_fd) {
        //char *header = client_buffers[client_socket_fd].read_header;
        char *read_buffer = client_buffers[client_socket_fd].read_buffer;
        char header[16];
        memset(header, 0, sizeof(header));
        int read_result = -1;
        read_result = read(client_socket_fd, header, 16);
        cout << read_result << endl;
        if (read_result > 0){
            int read_size = stoi(string(header));
            cout << read_size << endl;
            memset(read_buffer, 0, sizeof(read_buffer));
            read_result = read(client_socket_fd, read_buffer,read_size);
            if (read_result > 0) return string(read_buffer);
        }
        cerr << "Unable to recieve message from client socket " << client_socket_fd << endl;
        return "";
    }

    int ServerSocket::_send(int client_socket_fd, string message) {
        //char *header = client_buffers[client_socket_fd].write_header;
        char *write_buffer = client_buffers[client_socket_fd].write_buffer;
        char header[16];
        memset(header, 0, sizeof(header));
        string write_size = to_string(message.length());
        copy(write_size.begin(), write_size.end(), header);
        int write_result = write(client_socket_fd, header, 16); // sending size of message

        if (write_result > 0) {
            write_result = write(client_socket_fd, message.c_str(), message.length());
        }
        if (write_result <= 0)
            cerr << "Unable to send to client socket fd : " << client_socket_fd << endl; 
        return write_result;
    }

Client.cpp中的发送和接收部分

    string ClientSocket::_recieve(){
        char read_header[16];
        memset(read_header, 0, sizeof(read_header));
        int read_result = read(socket_fd, read_header, 16);
        if (read_result >0) {
            int read_size = stoi(string(read_header));
            memset(recieve_buffer, 0, sizeof(recieve_buffer));
            read_result = read(socket_fd, recieve_buffer, read_size);
        }
        if ( read_result > 0) return string(recieve_buffer);
        cerr << "Unable to read from server." << endl;
        return "";
    }
    int ClientSocket::_send(string message) {
        char write_header[16];
        memset(write_header, 0, sizeof(write_header));
        cout << message.length() << endl;
        string s = to_string(message.length());
        copy(s.begin(),s.end(), write_header);
        int write_result = write(socket_fd, write_header, 16);
        if (write_result > 0)
            write_result = write(socket_fd, message.c_str(), message.length());
        if (write_result <=0) cerr << "Unable to send message : "<< message  << endl;
        return write_result;
    }

【问题讨论】:

    标签: c++ sockets


    【解决方案1】:

    代码显示了使用套接字时最常见的两个错误:

    1. 套接字send/writerecv/read 可能无法发送/接收请求的字节数。代码必须处理部分读取/写入才能正常工作。
    2. 接收到的套接字数据不是以零结尾的。在将接收到的数据传递给期望以零结尾的字符串(此处为std::stringstoi)的函数之前,您需要对其进行零结尾。当recv 填满整个缓冲区时,memset 无济于事,您需要为 recv 不会覆盖的空终止符保留一个额外的字节。

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 1970-01-01
      • 2018-06-05
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      相关资源
      最近更新 更多