8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

套接字数据流仅适用于有限数量的文件描述符/数据块

ollo182 2月前

27 0

我正在尝试在 Windows 7 计算机上使用 C++ 中的套接字传输几块数据(每个数据块代表一幅图像)以及以下代码:int main() { std::string _ipaddress = \'...

我正在尝试在 Windows 7 计算机上使用 C++ 中的套接字传输几块数据(每个数据块代表一幅图像)以及以下代码:

int main() {
    std::string _ipaddress = "192.168.0.1"; 
    int dport = 6342;
    
    SOCKADDR_IN dtarget;
    dtarget.sin_family = AF_INET;
    dtarget.sin_port = htons(dport);
    dtarget.sin_addr.s_addr = inet_addr(_ipaddress.c_str());

    SOCKET _data_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (connect(_data_sock, (SOCKADDR*)&dtarget, sizeof(dtarget)) == SOCKET_ERROR) {
        return 1;
    }

    for (int i = 0; i < 100000; i++) {
        fd_set read_flags, write_flags;
        FD_ZERO(&read_flags);
        FD_ZERO(&write_flags);
        FD_SET(_data_sock, &read_flags);

        struct timeval waitd;
        waitd.tv_sec = 5;
        int sel;
        sel = select(_data_sock + 1, &read_flags, &write_flags, (fd_set*)0, &waitd);

        if (FD_ISSET(_data_sock, &read_flags)) {
            FD_CLR(_data_sock, &read_flags);

            int readCount = 0;
            int nread = 0;
            int chunkSize = 8576;
            char* chunkBuf = (char*)calloc(chunkSize, 1);
            do {
                if ((nread = recv(_data_sock, chunkBuf + readCount, chunkSize - readCount, 0)) != SOCKET_ERROR) {
                    readCount += nread;
                };
            } while (nread != 0 && readCount < chunkSize && nread != SOCKET_ERROR);
            // do something with chunkBuf
        }
    }
    return 0;
}

基本上,程序首先连接 SOCKET _data_sock 上述代码中的 , for 然后进入循环。 fd_set 在循环内声明、设置和清零 ,随后 recv() 用于接收缓冲区中的下一个数据块 chunkBuf .

该代码对于前大约 30000 个块(它并不总是完全相同的数字,但接近 30000)运行良好,然后突然开始无法接收进一步的数据。

我寻找了可能的解释并发现文件描述符的数量是有限的,但是,我无法通过将声明拉出循环来解决问题。

有人知道如何采用代码才能接收无限数量的数据块吗?

帖子版权声明 1、本帖标题:套接字数据流仅适用于有限数量的文件描述符/数据块
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由ollo182在本站《sockets》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @UlrichEckhardt 我仍在开发机器上使用 Windows 7。与手头的问题不太相关。

返回
作者最近主题: