首页 > 解决方案 > 即使我正在使用 select(),read() / recv() 函数会卡住吗?

问题描述

我一直在学习套接字,我知道您可以通过线程或使用 select() 函数来处理客户端,对吗?

据我了解,如果您致电:

select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

该函数指示哪个指定的文件描述符已准备好读取、准备好写入或有错误条件未决,因此如果我然后调用:

read(int fildes, void *buf, size_t nbyte);或者recv(int sockfd, void *buf, size_t len, int flags);

该函数将被卡住,直到至少在指定的文件描述符之一上找到要读取或接收的内容,或者直到需要传递的信号到达,并且该信号在timeout中到达,对吗?

好吧,即使我正在使用 select() 和特定的超时,read() / recv() 函数是否会无限期地卡住?

因为我正在尝试实现一个能够发送和接收消息和图像的客户端,所以它显然正确地发送了文件,但是在接收到图像之后,程序一直在 read() 中等待。

一旦调用了select()并且已经确定将接收到图像,这是负责接收图像的函数

void receive_image(int sock, FILE *fp_write){
    char buffer[256];
    char byte;

    fp_write = fopen("archivoRecibido.bmp","wb");
    enviarConfirmacion(sock);
    enviarMD5SUM(sock);

    while(read(sock, &byte, sizeof(byte)) > 0){
        fwrite(&byte,sizeof(byte),1,fp_write);
    }
    fclose(fp_write);
    puts("***PERFECT***");
}

我对我的知识有疑问的事情是理论上文件不应该关闭也不应该接收图像,但事实并非如此,图像被正确接收,发生的情况是我无法返回主循环发送另一条消息,因为我认为它卡在阅读中。

标签: csocketsselect

解决方案


推荐阅读