Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变量中的字符串在通过套接字发送之前发生更改_C++_Sockets_Network Programming - Fatal编程技术网

C++ 变量中的字符串在通过套接字发送之前发生更改

C++ 变量中的字符串在通过套接字发送之前发生更改,c++,sockets,network-programming,C++,Sockets,Network Programming,我有以下场景,一个双套接字连接(一个用作服务器,另一个用作到客户端的连接) 我在服务器套接字上接收到一个命令,并根据该命令生成一个字符串,然后通过另一个套接字发送给客户机 如果命令到达的速度不是太快,那么这种方法非常有效,但是如果我在短时间内多次收到命令“test123”,那么下一条要发送的消息的一部分就会被保存到我正在构建的字符串中 我正在对我可以通过以下方式接收的命令进行排序: if (command == "test123"){ command_send =

我有以下场景,一个双套接字连接(一个用作服务器,另一个用作到客户端的连接)

我在服务器套接字上接收到一个命令,并根据该命令生成一个字符串,然后通过另一个套接字发送给客户机

如果命令到达的速度不是太快,那么这种方法非常有效,但是如果我在短时间内多次收到命令“test123”,那么下一条要发送的消息的一部分就会被保存到我正在构建的字符串中

我正在对我可以通过以下方式接收的命令进行排序:

if (command == "test123"){
                command_send = "asdf123";

                buf = string_a + "," + command_send + "," + string_b + "\n";
        }
else if (command == "123test"){
                command_send = "123asdf";

                buf = string_a + "," + command_send + "," + string_b + "\n";
        }
诸如此类,还有一些其他的,如果你正在跟进

然后我将字符串转换为char*:

const char *msg_s = buf.c_str();
发送消息:

bytes_sent_s = send(socketfd_s, msg_s, len_s, 0)
在命令测试123被发送10次的情况下,我的BUF包含了第一个命令的一部分,在中间,命令的一部分应该在以后发送。然后我要发送的字符串看起来像“stringa,asdf123,asdf,stringb”或类似的东西


我做错了什么

问题不在于发送部分,而在于接收部分。我正在检查接收到的字符串,直到换行符出现,现在它工作了


我还使用boost实现了异步通信。

使用本地缓冲区(在这里,本地意味着没有全局缓冲区,没有成员缓冲区,但包围范围最小),并传递缓冲区(可能是std::vector和move semantics),在调用
buf.c_str()
和实际调用
send()之间会发生什么
?字符串
buf
是否有任何更改?如果没有,那么为什么不直接在
send()
调用中使用
c_str()
?为什么要将其分配给
常量char*
?您描述的内容表明您正在异步处理传入的命令,并且每次都重新使用相同的缓冲区。当出站数据仍忙于发送时,您会过早地覆盖缓冲区内容。因此,要么停止异步处理命令(读取命令,然后发送命令,然后读取命令,然后发送命令,等等),要么为每个命令分配一组新的缓冲区,对它们进行排队(以便它们串行发送,不会重叠),并在使用完后释放它们。@PaulMcKenzie,不,缓冲区没有任何改变,我也试着按照你建议的方式发送,但没有区别。@RemyLebeau我认为这就是问题所在,你是对的。您能给我一个简短的例子,说明我如何为每个命令分配一组新的缓冲区,以及如何对它们进行排队吗?我对C++很陌生