php socket fread,linux下使用fread读socket套接字的注意点
linux总所周知,一切皆文件。因此我们在读写文件时觉得fread,recv这些可以随便用。下面看看有哪些注意事项呢。
因为C库的文件处理函数较多,处理起来很灵活。所以在处理套接字时可以用fdopen函数把linux下的文件描述符转为一个C库的FILE文件指针来进行读写操作。
fread的返回值
我们知道在recv出错时会返回-1,但fread的返回值则不是这样,它不返回-1。fread/fwrite返回读到的字节数,返回的字节数小于希望读的字节数,则表明发生了错误或者读到了文件尾。要使用ferror()和feof来判断究竟发生了什么。
那么对于一个读的接口应该按下面这个模板来写,以处理文件读写发生的异常情况int read_data(FILE *fp, int len)
{ int total_len = len; int read_len = 0; int rtn_len = 0; char buffer[RECV_BUF] = {0}; while(total_len)
{
read_len = MIN(total_len, RECV_BUF);
rtn_len = fread(buffer, sizeof(char), read_len, fp); if(rtn_len
{ if(ferror(fp))
{ if(errno == EINTR) /* 信号使读操作中断 */
{ /* 不做处理继续往下走 */;
} else if(errno == EAGAIN || errno == EWOULDBLOCK) /* 发生了超时 */
{
lprintf(MSG_ERROR, "socket recvice timeout: %dms\n", RCV_SND_TIMEOUT);
total_len -= rtn_len;
lprintf(MSG_DEBUG, "read len: %d\n", rtn_len); break;
} else /* 其他错误 */
{
lprintf(MSG_ERROR, "fread error: %m\n"); break;
}
} else /* 读到文件尾 */
{
lprintf(MSG_ERROR, "socket closed by peer\n");
total_len -= rtn_len;
lprintf(MSG_DEBUG, "read len: %d\n", rtn_len); break;
}
} // lprintf(MSG_DEBUG, " %s\n", buffer);
total_len -= rtn_len;
lprintf(MSG_DEBUG, "read len: %d\n", rtn_len);
} if(total_len != 0)
{
lprintf(MSG_ERROR, "we need to read %d bytes, but read %d bytes now\n",
len, len - total_len); return -1;
}
}
fgets可以和recv混用吗
从目前的测试来看不可以!例如我在处理http通信时,我想用fgets来解析http的头,而后面的数据部分则使用recv来读,测试发现recv收到的数据前面少了一截。这该如何解释呢?fgets在读数据时为提高性能,从socket的接收缓冲区一次性读了很多数据到自己的缓冲区,然后返回给用户一行数据,下一次读数据则优先从C库自己的缓冲区拿数据。但是下一次你用recv来读数据了,因此它从socket的接收缓冲区读到的数据就少了一截。
fread读数据时超时的表现是什么
fread本身不支持超时设置,只可以设置阻塞非阻塞。但fread的FILE指针是通过socket转过来,而socket是可以设置接收发送超时的,所以使用fread接收socket数据时也就具有超时的属性。但表现和recv超时不太一样。
例如设置10s超时,我想recv 1000个字节,10s超时后recv会立马返回-1.而我想fread 1000个字节,你可能会看见在fread这儿不止卡10s,因为fread会尽量读满1000个字节再返回。在C库实现中,如果10s内,能收到数据,就读到自己缓冲区,然后接着收数据,直到读满1000个字节再返回。如果在10s内读不到数据那么就返回实际读到的数据,并把错误代码设置为EAGAIN。
所以假如设置10s超时,用fread读8个字节,而对端每9s发送一个字节,那么fread将卡72s然后成功返回。
php socket fread,linux下使用fread读socket套接字的注意点相关推荐
- linux下使用fread读socket套接字的注意点
linux下使用fread读socket套接字的注意点 linux总所周知,一切皆文件.因此我们在读写文件时觉得fread,recv这些可以随便用.下面看看有哪些注意事项呢. 因为C库的文件处理函数较 ...
- 【网络编程入门】使用socket在Linux下实现即时通信软件
使用socket在Linux下实现即时通信软件 在前一篇文章中讲到了如何使用winsock:[网络编程入门]在C++中使用Windows TCP Sockets,也算是勉强入门了吧,接下来自己写一下在 ...
- python 图形化socket编程_Python黑帽编程2.8 套接字编程
Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...
- Socket编程-应用编程接口(API)--套接字(及其函数介绍)
文章目录 Socket编程-应用编程接口(API)--套接字 网络程序设计接口 应用编程接口 API 几种典型的应用编程接口 Socket编程-Socket API概述 Socket API 套接字就 ...
- linux下父子进程共享socket,多进程共享socket(Linux,Win32)
您可以共享一两个(或多个插座)在Linux进程和甚至是Windows. 在Linux(或POSIX类型的操作系统),用fork()将导致叉孩子有父母的所有的文件描述符的副本. 就算是没有关闭将继续共享 ...
- linux 进程 读写锁,linux 下实现高性能读写锁(read/write lock)
前一篇文章分析了Windows slim read/write lock的工作原理.我们知道它的设计相当精妙,于是我们可以借鉴它的思路来设计linux下的读写锁. 在这个读写锁的设计上,需要注意的是l ...
- Linux进程最大socket数,Linux下高并发socket最大连接数所受的各种限制(详解)
1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...
- linux flash擦除命令,Linux下flash操作读、写、擦除步骤
描述 1. 背景介绍 在板上,ZYNQ PL部分通过EMC连接一片NOR FLASH,地址空间如下: 可以看到NOR FLASH的起始地址为0x80000000,这是物理地址,可以把数据存放在以该地址 ...
- Linux下有关可读可写可执行权限rwx:.sh:权限不够
在某天之前,我运行Linux下的.sh文件,都是采用./xxx.sh的方式. 突然有一天,我发现这个方式运行不了了...提示我 然后,我才知道,原来文件夹还是有权限的... 所以,请教了一下公司大神, ...
最新文章
- ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了
- Python 技术篇-使用pygame库播放音乐没有声音问题解决办法
- 区块链100讲:据说,80%的人都搞不懂哈希算法
- ICCV 2019 开源论文 | 基于元学习和AutoML的模型压缩新方法
- 2022年保险行业展望
- mysql-数据库操作-连接-创建-删除-修改编码-查询-切换
- 程序员最想得到的十大证件
- 你的PCB地线走的对吗?为什么要有主地?
- 腾讯测试发型的那个软件,全栈发型设计软件
- git remote: error: hook declined to update
- tibco linux安装手册,TIBCO Admin 5.11.1 安装及Domain建立 (Linux)
- 在Chrome、Firefox、IE、360等多种浏览器中实现二代证阅读功能
- 如何辨别u盘是否为缩水,并恢复u盘真实容量
- 拆掉思维里的墙:亲身经历后才能明白?
- 打开cmd命令提示不能输入命令
- 推荐系统实践读书笔记-04利用用户标签数据
- mac系统ssh可视化工具zoc的简单使用
- 智能家居带动路由器换代潮 中高端市场大门已敞开
- python中sha1 md5等用法
- 学习如何做好网站关键词的诊断工作