socket使用标准IO流分离
fd和标准IO相互转换
fd->FILE*
FILE * fdopen(int fd,const char *mode);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <me.h>
int main(void)
{
FILE *fp;
int fd = open("news.txt",O_RDWR);
if (fd == -1)
{
fputs("file open error",stdout);
return -1;
}
fp = fdopen(fd,"w");
fputs("Network C programming \n",fp);
fclose(fp);
return 0;
}FILE*->fd
int fileno(FILE *fp);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <me.h>
int main(void)
{
FILE *fp;
int fd = open("news.txt",O_RDWR);
if (fd == -1)
{
fputs("file open error",stdout);
return -1;
}
printf("First file descriptor: %d \n",fd);
fp = fdopen(fd,"w");//fd转FILE*
fputs("TCP/IP SOCKET programming \n",fp);
printf("Second file descriptor: %d\n",fileno(fp)); // FILE* 转 fd
fclose(fp);
return 0;
}
回声服务端客户端使用标准IO
server.c
1 |
|
client.c
1 |
|
一个fd通过fdopen形成的2个FILE*(分别是”r” 和 “w”)想调用fclose传递EOF形成半关闭状态是否可行?
serv.c
1 |
|
clnt.c
1 |
|
运行后发现fclose后唯一fd关闭导致socket也关闭了
被关闭的原因是只有一个fd对应socket,fclose关闭导致fd关闭
dup复制fd
int dup(int fd);
实现关于标准IO流的半关闭
通过复制一个fd后,每一个FILE
*
对应一个fd,但是即使fclose关闭一个FILE*后,唯一的一个fd也能同时IO,那么要先设置socket,使其先半关闭(shutdown发送EOF进入半关闭)然后在fclose关闭FILE*
1 |
|
来自<<TCP/IP 网络编程 尹圣雨>>
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!