这些通过套接字发送/接收字符串的函数有什么问题?
What is wrong with these functions for sending/receiving a string over a socket?
我试图写两个方法发送和接收一个套接字字符串。这是为了清理Windows的遗留代码,它使用了到处都是的send
和recv
,所以我想把它放到函数中来清理一下。你可以在下面看到我的想法。不幸的是,一旦我在代码中像这样使用这个函数:
std::string buffer = receiveStringFromSocket();
和
rc = sendStringToSocket(buffer);
我的代码被锁住了,甚至没有碰到断点。
谁能告诉我我做错了什么?我有一个困难的时间调试这个,因为我不是很熟悉C/c++。错误可能在代码库的其他地方。sendStringToSocket :
int sendStringToSocket(std::string sendString)
{
char sendBuffer[1024];
memset(sendBuffer, 0, sizeof(sendBuffer)); //Clear the buffer
//sendString.copy(sendBuffer, sendString.length());
strcpy(sendBuffer, sendString.c_str());
cout << "string buffer content:" << endl << cout.write(sendBuffer,sendString.length()) << endl;
rc = send(acceptsocket, sendBuffer, sizeof(sendBuffer)-1, 0);
return rc;
}
receiveStringFromSocket :
std::string receiveStringFromSocket()
{
char receptionBuffer[1024];
memset(receptionBuffer, 0, sizeof(receptionBuffer)); //Clear the buffer
rc = recv(acceptsocket, receptionBuffer, sizeof(receptionBuffer)-1, 0);
string str(receptionBuffer);
return str;
}
对于发送:主要问题是您不需要sendbuffer:您可以将sendString.c_str()
传递给send()
函数。使用sendbuffer带来的问题在注释中有描述。
接收:必须检查recv()
的返回值。谁也说不准网络会出什么问题。
组合:在TCP中(假设你正在使用)不能保证每个send-call的字节数与每个recv-call接收的字节数相同。您必须实现一些检查,以查看是否接收到所有需要的字节(最简单的:发送并检查空字节)。对于小于50字节的字符串,这可能不会被注意到,但在某些时候,您将丢失字符串的一部分。
主要问题是send和recv都不能保证发送/接收的数据与您期望的大小相同。所以你需要基于这个事实的函数。例如:
void sendBuffer( const char *buff, size_t size )
{
for( size_t sent = 0; sent != size; ) {
int rc = send( socket, buff + sent, size - sent );
if( rc <= 0 ) { // handle error here
}
sent += static_cast<size_t>( rc );
}
}
你需要一个类似的接收端。有了这样的函数,可以更容易地在字符串之前发送数据大小,它减少了数据使用并简化了代码:
uint32_t size = str.length();
sendBuffer( reinterpret_cast<char *>( &size ), sizeof( size ) );
sendBuffer( str.data(), size );
接收端相似。
虽然如果你决定或必须仍然发送字符串作为固定长度填充缓冲区1023字节长,这个函数可以用来,因为它是。
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何从void函数输出字符串
- 使用用户定义函数的字符串反转
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 在c++构造函数中使用随机字符串生成器
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- C++:如何使函数只返回作为列表一部分的字符串
- 如何在C++中的同一函数中使用字符串和双精度
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 对函数 PlaySound 使用字符串变量
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 构造函数字符串参数未设置窗口标题
- C++默认构造函数:字符串参数与字符串参数()
- 使用函数C++字符串输入
- c++模板函数字符串类型不匹配