如何使用c++;从客户端到服务器 我用C++中的Winsock编写服务器客户端应用程序,用于逐行发送文件,发送大字符串时遇到问题。线路尺寸非常大

如何使用c++;从客户端到服务器 我用C++中的Winsock编写服务器客户端应用程序,用于逐行发送文件,发送大字符串时遇到问题。线路尺寸非常大,c++,winsock,C++,Winsock,为了通过服务器从客户端获取消息,我使用下面的代码 int result; char message[200]; while (true) { recv(newSd, (char*)&message, sizeof(message), 0); cout << "The Message from client: " << message << ";"; } int结果; 字符消息[200]; while(true) { recv(ne

为了通过服务器从客户端获取消息,我使用下面的代码

int result;
char message[200];

while (true)
{
    recv(newSd, (char*)&message, sizeof(message), 0);

    cout << "The Message from client: " << message << ";";
}
int结果;
字符消息[200];
while(true)
{
recv(newSd,(char*)和message,sizeof(message),0;

coutTCP是一个字节流,它对消息、行或类似的内容一无所知。当您通过TCP发送数据时,它所知道的只是原始字节,而不是字节代表什么。您的责任是在TCP之上实现一个消息协议,以某种有意义的方式对数据进行分隔,以便接收方能够知道数据何时被合并完成。有两种方法可以做到这一点:

  • 在发送实际数据之前先发送数据长度。接收器首先读取长度,然后读取长度所表示的字节数

  • 发送数据后发送唯一的终止符。确保终止符从未出现在数据中。然后,接收器可以读取,直到接收到终止符

您没有在
recv()
代码中处理它们中的任何一个,因此我怀疑您也没有在
send()
代码中处理它们中的任何一个(您没有显示)

由于您正在发送文本文件,您可以:

  • 发送文件大小,如
    uint32\u t
    uint64\u t
    (取决于文件大小),然后发送原始文件字节

  • 按原样单独发送每个文本行,在每行之后以
    CRLF
    bare LF
    换行符终止,然后在最后一行之后发送最终终止符


您还忽略了
recv()
的返回值,该值告诉您实际接收了多少字节。它可以而且通常返回的字节数少于请求的字节数,因此您必须准备多次调用
recv()
,通常是在循环中,以完全接收数据。与
send()相同

您是否考虑过使用类似于
std::vector
std::vector
的东西来代替固定大小的C型数组?您得到的结果是分段的吗?@JesperJuhl但我看到recv函数定义在下面,我必须传递一种char*.WINSOCK\u API\u链接int PASCAL recv(SOCKET,char*,int,int);不确定,当我将消息声明为字符串或vector@swamybabun,。如何发送一个大的未知字符串而不是char message[200];--另一个问题是,您不会以显示给我们的方式使用
recv
。您需要循环
recv
,直到它变为