通过套接字发送数据意外中止

时间:2016-02-25 10:34:53

标签: c++ sockets tcp

我正在尝试通过tcp套接字将数据发送到服务器。这背后的想法是一个非常简单的聊天程序。 我试图发送的字符串如下所示:

1:2:e9e633097ab9ceb3e48ec3f70ee2beba41d05d5420efee5da85f97d97005727587fda33ef4ff2322088f4c79e8133cc9cd9f3512f4d3a303cbdb5bc585415a00:2:xc_[z kxc_[z kxc_[z kxc_[==

正如你所看到的,我认为这里有一些不可打印的字符是个问题。 要发送此数据,我使用以下代码段。

bool tcp_client::send_data(string data)
{
    if( send(sock , data.c_str(), strlen(data.c_str()) , 0) < 0)
    {
        perror("Send failed : ");
        return false;
    }
    return true;
}

经过几分钟的尝试后,我出现了,data.c_str()切断了我的字符串。 结果是:

1:2:e9e633097ab9ceb3e48ec3f70ee2beba41d05d5420efee5da85f97d97005727587fda33ef4ff2322088f4c79e8133cc9cd9f3512f4d3a303cbdb5bc585415a00:2:xc_[z

我认为我的字符串中存在某种空序列,这对c_str()函数来说是一个问题。

有没有办法像我上面提到的那样发送整个字符串而不切断它?

感谢。

2 个答案:

答案 0 :(得分:1)

  

有没有办法像我上面提到的那样发送整个字符串而不切断它?

怎么样:

send(sock , data.c_str(), data.size() , 0);

答案 1 :(得分:1)

只有两种理智的方法可以通过流套接字发送任意数据(例如字符数组):

  1. 在服务器上:发送数据后关闭套接字(如ftp,http 0.9等)。在客户端上 - 读取直到套接字在循环中关闭。

  2. 在服务器上:为具有固定长度大小的数据添加前缀(现在人们通常使用64位整数作为大小,注意endiannes)。在客户端上 - 首先读取大小(在循环中!),然后读取数据,直到读取size个字节(在循环中)。

  3. 其他所有事情迟早都会适得其反。