在linux环境下基于TCP/IP架构实现文件传输——2、程序封装总结

在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%s\n",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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值