分析EOF究竟是什么
2015-01-26 06:58
246 查看
EOF仅仅是一种状态或者说条件,需要触发。read调用遇到文件结尾,触发该条件,结果将返回0。针对EOF,对于标准输入设备,普通文件,管道文件,网络套接字文件是read如何触发呢?下面程序将说明:
server.c 是socket套接字服务端,目的为了网络套接字文件是read如何触发测试用的。
###########################server.c##############################
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
int main()
{
int connfd;
struct sockaddr_in servadd;
int sockfd=socket(AF_INET, SOCK_STREAM, 0);
bzero(&servadd, sizeof(servadd));
servadd.sin_family=AF_INET;
servadd.sin_port=htons(9999);
servadd.sin_addr.s_addr=inet_addr("192.168.60.136");
socklen_t len = sizeof(servadd);
socklen_t Reuseaddr = 1;
setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &Reuseaddr, sizeof(Reuseaddr ) );
bind(sockfd, (const struct sockaddr *)&servadd, len);
listen(sockfd,8);
while( (connfd = accept(sockfd,(struct sockaddr *)&servadd, &len)) >0)
{
printf("##########################\n");
write(connfd,"abc",3);
}
return 0;
}
############################test.c############################
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <strings.h>
#define MAXSIZE 256
#define FNAME "test"
int main()
{
char buf[MAXSIZE];
int ret,pipefd[2];
ret= read(0,buf,MAXSIZE);
printf("standart input ret:%d\n",ret);
int fd = open(FNAME,O_RDONLY|O_CREAT);
ret= read(fd,buf,1);
printf("regular file ret:%d\n",ret);
close(fd);
FILE *fp = fopen(FNAME, "r");
ret = fread(buf,1,1,fp);
printf("regular file ret:%d\n",ret);
fclose(fp);
pipe(pipefd);
close(pipefd[1]);
ret = read(pipefd[0],buf,1);
printf("pipe file ret:%d\n",ret);
int sockfd=socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in servadd;
bzero(&servadd,sizeof(servadd));
servadd.sin_family = AF_INET;
servadd.sin_port = htons(9999);
servadd.sin_addr.s_addr=inet_addr("192.168.60.136");
connect(sockfd, (struct sockaddr *)&servadd, sizeof(servadd));
ret = read(sockfd,buf,3);
perror("err1");
ret = read(sockfd,buf,3);
printf("socket file ret2:%d\n",ret);
perror("err2");
}
测试过程:
1.运行下列命令
#gcc server.c -o server
#gcc test.c -o test
#./server
#./test
输入ctrl+d键
standart input ret:0
regular file ret:0
regular file ret:0
pipe file ret:0
socket file ret1:3
err1: Success
#killall server
触发socket EOF
socket file ret2:0
err2: Success
2.分析
#man read
RETURN VALUE
On success, the number of bytes read is returned (zero indicates end of file)
可见返回值为:0,已经触发了EOF,具体如何触发,参见程序.
server.c 是socket套接字服务端,目的为了网络套接字文件是read如何触发测试用的。
###########################server.c##############################
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
int main()
{
int connfd;
struct sockaddr_in servadd;
int sockfd=socket(AF_INET, SOCK_STREAM, 0);
bzero(&servadd, sizeof(servadd));
servadd.sin_family=AF_INET;
servadd.sin_port=htons(9999);
servadd.sin_addr.s_addr=inet_addr("192.168.60.136");
socklen_t len = sizeof(servadd);
socklen_t Reuseaddr = 1;
setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, &Reuseaddr, sizeof(Reuseaddr ) );
bind(sockfd, (const struct sockaddr *)&servadd, len);
listen(sockfd,8);
while( (connfd = accept(sockfd,(struct sockaddr *)&servadd, &len)) >0)
{
printf("##########################\n");
write(connfd,"abc",3);
}
return 0;
}
############################test.c############################
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <strings.h>
#define MAXSIZE 256
#define FNAME "test"
int main()
{
char buf[MAXSIZE];
int ret,pipefd[2];
ret= read(0,buf,MAXSIZE);
printf("standart input ret:%d\n",ret);
int fd = open(FNAME,O_RDONLY|O_CREAT);
ret= read(fd,buf,1);
printf("regular file ret:%d\n",ret);
close(fd);
FILE *fp = fopen(FNAME, "r");
ret = fread(buf,1,1,fp);
printf("regular file ret:%d\n",ret);
fclose(fp);
pipe(pipefd);
close(pipefd[1]);
ret = read(pipefd[0],buf,1);
printf("pipe file ret:%d\n",ret);
int sockfd=socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in servadd;
bzero(&servadd,sizeof(servadd));
servadd.sin_family = AF_INET;
servadd.sin_port = htons(9999);
servadd.sin_addr.s_addr=inet_addr("192.168.60.136");
connect(sockfd, (struct sockaddr *)&servadd, sizeof(servadd));
ret = read(sockfd,buf,3);
perror("err1");
ret = read(sockfd,buf,3);
printf("socket file ret2:%d\n",ret);
perror("err2");
}
测试过程:
1.运行下列命令
#gcc server.c -o server
#gcc test.c -o test
#./server
#./test
输入ctrl+d键
standart input ret:0
regular file ret:0
regular file ret:0
pipe file ret:0
socket file ret1:3
err1: Success
#killall server
触发socket EOF
socket file ret2:0
err2: Success
2.分析
#man read
RETURN VALUE
On success, the number of bytes read is returned (zero indicates end of file)
可见返回值为:0,已经触发了EOF,具体如何触发,参见程序.
相关文章推荐
- 分析:社交网站究竟应该靠什么赚钱
- 从jvm来看,scala中的@究竟是个什么鬼?@模式匹配符号(scala 词法分析 语法分析 常用)
- [案例分析] 打造值得信任的个人品牌究竟靠什么?
- 从源码角度分析java 的 sleep()和wait()究竟有什么区别?
- iOS Block源码分析系列(一)————2分钟明白Block究竟是什么?
- 创业内外部环境综合分析:创业究竟需要什么?
- 究竟什么是web2.0?
- 究竟随笔和文章有什么不同?
- EJB3,我们究竟得到了什么 (1)
- 大学究竟给我们带来了什么
- 博客究竟能做什么?
- BREW究竟是什么-BREW本质之我见[转]
- [原创]什么是软件缺陷分析?
- EJB3,我们究竟得到了什么 (2)
- BREW究竟是什么-BREW本质之我见
- 究竟什么网站是一个WEB2.0的网站
- 日志文件分析都是分析什么?
- "=="和equals方法究竟有什么区别?
- [原创]一百多个变量、二十多个函数到底作了什么?[google map代码分析之二]
- 从Blog到播客,手机里究竟发生了什么?[转]