我正在尝试通过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()函数来说是一个问题。
有没有办法像我上面提到的那样发送整个字符串而不切断它?
感谢。
答案 0 :(得分:1)
有没有办法像我上面提到的那样发送整个字符串而不切断它?
怎么样:
send(sock , data.c_str(), data.size() , 0);
答案 1 :(得分:1)
只有两种理智的方法可以通过流套接字发送任意数据(例如字符数组):
在服务器上:发送数据后关闭套接字(如ftp,http 0.9等)。在客户端上 - 读取直到套接字在循环中关闭。
在服务器上:为具有固定长度大小的数据添加前缀(现在人们通常使用64位整数作为大小,注意endiannes)。在客户端上 - 首先读取大小(在循环中!),然后读取数据,直到读取size
个字节(在循环中)。
其他所有事情迟早都会适得其反。