概述
在linux环境下基于TCP/IP架构实现文件传输——程序封装总结
引言
以下为笔者在做基于TCP/IP架构实现文件传输任务时,用到的函数总结
1、socket阻塞变为非阻塞
//用以下方法将socket设置为非阻塞方式
int flags = fcntl(cnfd, F_GETFL, 0);
fcntl(cnfd, F_SETFL, flags | O_NONBLOCK);
//将非阻塞的设置回阻塞可以用
flags = fcntl(cnfd, F_GETFL, 0);
fcntl(cnfd, F_SETFL, flags & ~O_NONBLOCK);
***2、创建文件***
```c
//创建文件,每次·创建文件需有创建文件、读/写文件、关闭文件三部曲
fp = fopen("Abnormally interrupted file.txt","w");
if( fp == NULL )
{
perror("无Abnormally interrupted file.txt")
}
fwrite(cli_ip, 1, INET_ADDRSTRLEN, fp); //写文件
fclose(fp);//关闭文件
3、定义结构体
typedef struct
{
char Receiveinfo[128];
int FileFd;
char FileInfoOfLen[16];
char protocalpsw[16];
}whRecvFileInfo, *whptRecvFileInfo;
whptRecvFileInfo WHptRecvFileInfo;
whRecvFileInfo WHRecvFileInfo;
WHptRecvFileInfo = &WHRecvFileInfo;//这个程序可使结构体指针与结构体变量指向同一内存
4、忽略SIGPIPE信号
问题描述:
客户端断开socket连接, 服务端send 向一个失效的socket 发送数据,导致服务的进程退出。
原因分析:
在linux下写socket的程序的时候,如果尝试send或write到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。因此我们需要重载这个信号的处理方法。
解决方法:忽略这个SIGPIPE信号,
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction( SIGPIPE, &sa, 0 );//这行代码放在write或send函数之前,若write或send
改进结果:当单个客户端断开后,不会影响服务端与其他客户端的正常传输通信,当write或send到一个disconnected socket上时,会返回-1,而不是退出进程
5、休眠nanosleep
struct timespec ts, ts1;
ts.tv_nsec = 50000000; // 150ms
ts.tv_sec = 1;
nanosleep(&ts, &ts1);//该程序表示可休眠150ms
6、指针变量的内存申请与释放
typedef struct Argsrar
{
int sock;
char *a;
unsigned int fileread[TNUM];
}Arg;
Arg* ptr = (Arg*) i;
i.a = (char *)malloc(40*sizeof(char)); //为指针变量申请空间
memset(i.a,0,20*sizeof(char));
free(i.a); //当变量调用完成后,释放内存,注意不要提前释放内存
i.a = NULL;
7、字符串中取信息
字符串示例 /10.1.75.94/136647 //IP为10.1.75.94.字节长度为136647
unsigned char BUF[128];
unsigned char LEN[128];
char *tmp = NULL;
char *tm = NULL;
W = fopen("Abnormally interrupted file.txt", "r");//打开目标文件
if( W== NULL )
{
printf("文件不存在");
printf("Abnormally interrupted file.txt为空n");
return 0;
}
fread(BUF, 1, 128, W);
tmp = strrchr(BUF, '/'); //从字符串后面往前搜索,遇到第一个/,则返回从/开始后面的字符串
if(!tmp)
return -1;
memcpy(LEN , tmp+1 , strlen(tmp-1));
printf("LEN%sn",LEN); //打印结果为136647
tm= strchr(BUF, '/'); //从字符串开头处往后搜索,遇到第一个/,则返回从/开始后面的字符串
if(!tm)
return -1;
int index = tmp - tm; //指针就是地址,两地址相减可得到字符串“/10.1.75.94”的长度
memcpy(read_cli_ip , tm+1 , (index-1));
printf("read_cli_ip%s",read_cli_ip);//打印结果为10.1.75.94
最后
以上就是怡然小笼包为你收集整理的在linux环境下基于TCP/IP架构实现文件传输——2、程序封装总结的全部内容,希望文章能够帮你解决在linux环境下基于TCP/IP架构实现文件传输——2、程序封装总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复