Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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

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++;套接字recv未接收到正确的字节数? 我对C++非常陌生,但我正在努力学习TCP套接字编码的一些基础知识。无论如何,我能够发送和接收消息,但我想用数据包的长度作为数据包的前缀(就像我在过去制作的C#应用程序中所做的那样),因此当我的窗口获得FD#u READ命令时,我有以下代码来读取数据包的前两个字节,用作短int char lengthBuffer[2]; int rec = recv(sck, lengthBuffer, sizeof(lengthBuffer), 0); short unsigned int toRec = lengthBuffer[1] << 8 | lengthBuffer[0]; 字符长度缓冲区[2]; int rec=recv(sck,lengthBuffer,sizeof(lengthBuffer),0); 短无符号int toRec=lengthBuffer[1]_C++_Sockets - Fatal编程技术网

C++;套接字recv未接收到正确的字节数? 我对C++非常陌生,但我正在努力学习TCP套接字编码的一些基础知识。无论如何,我能够发送和接收消息,但我想用数据包的长度作为数据包的前缀(就像我在过去制作的C#应用程序中所做的那样),因此当我的窗口获得FD#u READ命令时,我有以下代码来读取数据包的前两个字节,用作短int char lengthBuffer[2]; int rec = recv(sck, lengthBuffer, sizeof(lengthBuffer), 0); short unsigned int toRec = lengthBuffer[1] << 8 | lengthBuffer[0]; 字符长度缓冲区[2]; int rec=recv(sck,lengthBuffer,sizeof(lengthBuffer),0); 短无符号int toRec=lengthBuffer[1]

C++;套接字recv未接收到正确的字节数? 我对C++非常陌生,但我正在努力学习TCP套接字编码的一些基础知识。无论如何,我能够发送和接收消息,但我想用数据包的长度作为数据包的前缀(就像我在过去制作的C#应用程序中所做的那样),因此当我的窗口获得FD#u READ命令时,我有以下代码来读取数据包的前两个字节,用作短int char lengthBuffer[2]; int rec = recv(sck, lengthBuffer, sizeof(lengthBuffer), 0); short unsigned int toRec = lengthBuffer[1] << 8 | lengthBuffer[0]; 字符长度缓冲区[2]; int rec=recv(sck,lengthBuffer,sizeof(lengthBuffer),0); 短无符号int toRec=lengthBuffer[1],c++,sockets,C++,Sockets,TCP套接字是基于流的,而不是数据包(我假设您使用TCP,因为在UDP中发送数据包的长度没有任何意义)。一次接收的字节数与发送的字节数没有多大关系。例如,您可以发送10个字节,但接收器可以接收1+2+1+7或任何组合。您的代码必须处理这个问题,能够部分接收数据并在获得足够数据时做出反应(这就是为什么发送数据包长度的原因)。TCP套接字是基于流的,而不是数据包(我假设您使用TCP,因为在UDP中发送数据包长度没有任何意义)。一次接收的字节数与发送的字节数没有多大关系。例如,您可以发送10个字节,但

TCP套接字是基于流的,而不是数据包(我假设您使用TCP,因为在UDP中发送数据包的长度没有任何意义)。一次接收的字节数与发送的字节数没有多大关系。例如,您可以发送10个字节,但接收器可以接收1+2+1+7或任何组合。您的代码必须处理这个问题,能够部分接收数据并在获得足够数据时做出反应(这就是为什么发送数据包长度的原因)。

TCP套接字是基于流的,而不是数据包(我假设您使用TCP,因为在UDP中发送数据包长度没有任何意义)。一次接收的字节数与发送的字节数没有多大关系。例如,您可以发送10个字节,但接收器可以接收1+2+1+7或任何组合。您的代码必须处理这个问题,能够部分接收数据并在获得足够数据时做出反应(例如,这就是为什么发送数据包长度)。

流式套接字:

套接字通常以流式方式使用:您将接收发送的所有数据,但不一定一次接收所有数据。您也可以接收一些数据

因此,您发送长度的方法是有效的:一旦收到长度,您就可以加载一个缓冲区,如果需要的话,通过连续读取,直到您得到预期的所有内容。因此,您必须循环接收,并定义如何处理接收到的额外字节的策略

数据语法(面向数据包)套接字:

如果你的应用程序是面向数据包的,你可以考虑创建一个DATAGAMME套接字,通过请求或<代码> SockUE()/代码>,SockJoDigg,或者更好的SockSysQPosiket套接字类型。p> 二进制大小数据的风险:


请注意,您发送和接收尺码数据的方式似乎是不对称的。因此,如果在CPU/体系结构不相同的机器之间进行发送和接收,则存在重大风险。您可以找到一些关于如何命名代码平台/endian独立的提示

流式套接字:

套接字通常以流式方式使用:您将接收发送的所有数据,但不一定一次接收所有数据。您也可以接收一些数据

因此,您发送长度的方法是有效的:一旦收到长度,您就可以加载一个缓冲区,如果需要的话,通过连续读取,直到您得到预期的所有内容。因此,您必须循环接收,并定义如何处理接收到的额外字节的策略

数据语法(面向数据包)套接字:

如果你的应用程序是面向数据包的,你可以考虑创建一个DATAGAMME套接字,通过请求或<代码> SockUE()/代码>,SockJoDigg,或者更好的SockSysQPosiket套接字类型。p> 二进制大小数据的风险:


请注意,您发送和接收尺码数据的方式似乎是不对称的。因此,如果在CPU/体系结构不相同的机器之间进行发送和接收,则存在重大风险。您可以找到一些关于如何命名代码平台/endian独立的提示

因为您无法假设有多少数据可用,所以需要不断地从套接字读取数据,直到获得所需的数据量。像这样的方法应该会奏效:

ssize_t rec = 0;
do {
    int result = recv(sck, &lengthBuffer[rec], sizeof(lengthBuffer) - rec, 0);
    if (result == -1) {
        // Handle error ...
        break;
    }
    else if (result == 0) {
        // Handle disconnect ...
        break;
    }
    else {
        rec += result;
    }
}
while (rec < sizeof(lengthBuffer));
ssize\u t rec=0;
做{
int result=recv(sck,&lengthBuffer[rec],sizeof(lengthBuffer)-rec,0);
如果(结果==-1){
//处理错误。。。
打破
}
否则如果(结果==0){
//把手断开。。。
打破
}
否则{
rec+=结果;
}
}
而(rec
因为您无法假设有多少数据可用,所以您需要不断地从套接字读取数据,直到获得所需的数据量。像这样的方法应该会奏效:

ssize_t rec = 0;
do {
    int result = recv(sck, &lengthBuffer[rec], sizeof(lengthBuffer) - rec, 0);
    if (result == -1) {
        // Handle error ...
        break;
    }
    else if (result == 0) {
        // Handle disconnect ...
        break;
    }
    else {
        rec += result;
    }
}
while (rec < sizeof(lengthBuffer));
ssize\u t rec=0;
做{
int result=recv(sck,&lengthBuffer[rec],sizeof(lengthBuffer)-rec,0);
如果(结果==-1){
//处理错误。。。
打破
}
否则如果(结果==0){
//把手断开。。。
打破
}
否则{
rec+=结果;
}
}
而(rec
要查找发送和接收的字节数,还是只查找可发送的字节数?可能是帮助或不是基于问题-只是可能是一个重复的根据有多少其他类似的问题。一个TCP套接字在阻塞模式下的“正确字节数”是一个或多个。请参阅手册页。您的期望是没有根据的。您想查找正在发送和接收的字节数,还是只查找要发送的可用字节数?可能是帮助或不是基于问题-只是可能是一个重复的根据有多少其他类似的问题。一个TCP套接字在阻塞模式下的“正确字节数”是一个或多个。请参阅手册页。你的期望是没有根据的。
数据长度在UDP中没有任何意义
什么?对,我明白了,这就是我使用这种方法的原因。抱歉,如果我不清楚(我使用数据包来指代完整的数据段,即使这不是TCP的正确术语)。我感到困惑的是,为什么recv只读取奇数字节,而从不读取整个缓冲区的大小。我发送的数据长度只有15个字节(前两个是长度),我的缓冲区是tw