c - 即使我正在使用 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***");
}
我对我的知识有疑问的事情是理论上文件不应该关闭也不应该接收图像,但事实并非如此,图像被正确接收,发生的情况是我无法返回主循环发送另一条消息,因为我认为它卡在阅读中。
解决方案
推荐阅读
- java - 只是 JTextField 中的数字
- javascript - 如何在同一页面上多次添加相同的轮播?
- python - 错误:包“Unidecode”需要不同的 Python:2.7.18 不在“>=3.5”中
- image - 无论图像大小如何,图像始终只需 5 秒即可加载 (MAMP)
- python - 错误:azure_cosmosdb_container 类型中缺少强制属性值
- c - 为什么包含守卫不需要反斜杠是多行的?
- r - IR,如何自动汇总数字列。谢谢
- kotlin - Kotlin 'where' 关键字与嵌套接口
- php - AJAX - PHP - 上传两个输入文件
- javascript - nodejs Promise.all()在承诺过程后不起作用