繁体   English   中英

无法使用 C 套接字再次发送消息

[英]Unable to send the message again using C socket

我创建了一个 ClientSocket 和一个 ServerSocket 类来简化功能。 在发送数据时,首先我发送一个 16 字节的标头,其中包含消息长度,然后是消息。 但是我在第二次将数据从客户端发送到服务器时遇到了问题。 起初它正确发送标头和消息,但之后我在从客户端读取标头时从ServerSocket::get_message read()获得 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;
    }

该代码在使用套接字时表现出两个最常见的错误:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM