网络文件传输

获取文件名

opendir

头文件:  #include <sys/types.h>

                #include <dirent.h>

DIR *opendir(const char *name);

返回值

The opendir() and fdopendir() functions return a pointer to the  directory  stream.   On  error, NULL is returned, and errno is set appropriately.

readdir

头文件:#include <sys/types.h>   

    #include <dirent.h>

struct dirent *readdir(DIR *dirp);

返回值:成功则返回下个目录进入点. 有错误发生或读取到目录文件尾则返回NULL.

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
int main(int argc , char* argv[])
{
        DIR * dir;
        struct dirent * ptr;
        int i;
        dir = opendir("/etc");
        while((ptr = readdir(dir)) != NULL)
        {
                printf("d_name : %s\n", ptr->d_name);
        }
        closedir(dir);
        return 0;
}

 执行结果

d_name : .
d_name : ..
d_name : login.defs
d_name : .pwd.lock
d_name : network
d_name : selinux
d_name : ubuntu-advantage
d_name : deluser.conf
d_name : alsa

读写函数

int recv(int sockfd,void *buf,int len,int flags)

int send(int sockfd,void *buf,int len,int flags)

这两个函数和read,write函数非常相似,只是多了一个参数,当最后一个参数为零时二者等同。

最后一个参数有以下几个:

| MSG_DONTROUTE | 不查找表 |

| MSG_OOB | 接受或者发送带外数据 |

| MSG_PEEK | 查看数据,并不从系统缓冲区移走数据 |

| MSG_WAITALL | 等待所有数据 |

————————————————————————————————————————

MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP.目的主机在本地网络上面,没有必要查找表.这个标志一般用网络诊断和路由程序里面.

MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的.

MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清除系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志.

MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回.使用这个 标志的时候recv回一直阻塞,直到指定的条件满足,或者是发生了错误. 1)当读到了指定的字节时,函数正常返回.返回值等于len 2)当读到了文件的结尾时,函数正常返回.返回值小于len 3)当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)

memset()

函数原型是extern void *memset(void *buffer, int c, int count)       

        buffer:为指针或是数组,

        c:是赋给buffer的值,

        count:是buffer的长度.

这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer))

Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;

例:char a[100];memset(a, '/0', sizeof(a));

 void bzero(void *s, int n);        //此函数也有此功能
例: struct sockaddr_in serveraddr;
        bzero(&serveraddr,sizeof(serveraddr));

showdown

shutdown关闭部分全双工传输

#include <sys i socket.h>
int shutdown (int sockfd, int howto) ;

sockfd :套接字描述符
how :关闭的方式
SHUT_RD 0
SHUT_WR 1sHUT_RDWR 2
向一个写端已经关闭的套接字写数据,内核会给进程发送STGPIPE信号,接收方的读端立刻返回0从一个读端己经关闭的套接字读数据,read会立刻返回

接受:
read, recv. recvfrom , recvmsg

发送:
vrite, send, sendto , sendmsg

TCP:
read, recv , recvfrom , reacvmsg

write, send,sendto , sendmsg

udp :
recvfrom.recvmsg

sendto, sendnsg

(3)信号驱动工/o模型(udp)部署信号处理函数
step l: signal( sIGIO, signal_handler) ;
step 2: fcntl(fd,F_SETOWN,getpid () );//设置接受sIGTo信号的进程
step 3: flag = fcntl(fd, F_GETFL)//先获取文件标志
step 4: flag = flag l o_AsYNC; //将o_AsYNC标志加入flag
step 5: fcntl (fd, F_SETFL, flag) ://设置文件标志
优点:优化了等待I/O就绪阶段(异步)
缺点:数据搬运阶段没有优化

lsof (list dpen file)列举出当前系统所打开的文件
(1)lsof会访问内核打开的各种文件所以需要root用户身份去运行
sudo lsof
(2) lsof -p <pid>显示指定进程打开的文件
(3) lsof filename显示指定文件在哪些进程中被打开
(4)lsof -d fd显示所有文件描述符是fd的进程
lsof -d 5
( 5 ) lsof -i:端口号
        lsof -i TCP
        lsof -i ip地址
(6)当内存中还有进程打开你意外删除的文件的时候,可以使用lsof恢复
lsof l grep filename              //查看打开这个文件的进程
cd /proc/ 4068/fd                 //切换到/ proc文件系统
cat fd > filename                 //将删除的文件从内存倒回磁盘cwd
current working directory;
Lnn                        library references(AIX) ;
err                          FD information error isee NAME column) ;
jld                           jail directory (FreeBSD) ;
ltx                           shared library text (code and data) ;
Mxx                        hex memory-mapped type nurmber xx.
m86                        Dos Merge mapped file;
mem                       memory-mapped file;
rmmap                    memory-mapped device;
pd                           parent directory;
rtd                           root directory;
tr                             kernel trace file iopenBSD) ;
txt                            program text icode and data) ;
v86                          VP/ix mapped file;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值