windows - 接收socket命令

标签 windows tcp sockets send recv

我正在使用套接字以 TCP 流模式将数据从本地机器发送到远程。 本地端的代码是:

// ----------- Local
send(sd, pData, iSize, 0);  // send data

数据的大小大约是1Mb,所以socket可能会把它分成几个包。 当我在远程端接收数据时,我必须单独接收数据,然后将它们组合在一起。 远程端的代码是:

// ----------- Remote : Receiving data
int         iSizeThis(0);// size of a single separated data
static int  iSizeAcc(0);//size of the total data I have already got.
static int  iDataSize(0);// size of the original data.

// Get size
if (iDataSize <= 0)
{
    if ( (iSizeThis = recv(cli_sd, (char*)&iDataSize, 4, MSG_PEEK)) == 0) {
        ....
    } else if (iSizeThis == SOCKET_ERROR) {
        ....
    } else {
        // Allocates memory
        if (iDataSize > 0)
            pData = realloc(pData, iDataSize);
    }

} else if (iSizeAcc < iDataSize){

    // Get data.
    // The size of the data is about 1Mb, so socket will divide it to several packets.
    // I have to recieve the data separately, and then combine them together.

    iSizeThis = recv(cli_sd, ((char*)pData) + iSizeAcc, iDataSize - iSizeAcc, 0);

    iSizeAcc += iSizeThis;

    //{// If I uncomment this block, the recieving order will be reversed. Why?????
    //  static int i(0);
    //  std::ostringstream oss;
    //  oss << i++ << "\n\n";
    //  oss << "iSizeThis : " << iSizeThis << "\n";
    //  oss << "iSizeAcc : " << iSizeAcc << "\n";
    //  oss << "iDataSize : " << iDataSize << "\n";
    //  ::MessageBoxA(this->GetSafeHwnd(), oss.str().c_str(), "---", 0);
    //}

    // If all the fragment are combined into pData, the save it to a file.
    if (iSizeAcc >= iDataSize){
        // Save to file
        FILE * pFile;
        pFile = fopen ("CCC.dat","wb");
        if (pFile != NULL){
            fwrite ( ((char*)pData)+4 , 1 , iDataSize-4 , pFile );
            fclose (pFile);
        }

        iSizeAcc = 0;
        iDataSize = 0;
    }
}

奇怪的是。如果我取消注释远程端的消息 block ,接收顺序将被颠倒。 因此,远程数据的结果顺序不正确。

为什么? (我怎样才能得到每个片段的正确顺序?)

提前致谢。

最佳答案

当 MessageBoxA 函数正在执行时,它会将消息发送到您的窗口。无论您的线程是否期待它们,MessageBoxA 都会将它们发送给您。

关于windows - 接收socket命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1622974/

相关文章:

r - 已知在 windows xp 上运行的最新版本的 R 是什么?

angular - PrimeNG 数据表未在 Angular 2 应用程序中显示

c - C 语言的 Windows 套接字编程

java BufferedReader 适用于 windows 而不是 mac

java - C服务器未接收java/android客户端消息

ruby - 在 linux 上运行 ruby​​ 规范时出现未初始化的常量错误,而不是在 windows 上

windows - 批量删除文本文件中的重复行

java - 服务器如何获取客户端的IP和端口号TCP?

c - TCP 操作超时

C++ recv() 问题