linux 文件socket(socket下载)
大家好,如果您还对linux 文件socket不太了解,没有关系,今天就由本站为大家分享linux 文件socket的知识,包括socket下载的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
linux下socket如何传输一个目录以及目录下的子文件子目录
socket编程,需要一个服务器端和一个客户端
传输文件夹的话可以在服务器端进行发送在客户端进行接收
方法是,在指定端口建立侦听,比如8888,使用的协议可以是tcp/ip或者udp/ip
udp是种无链接不可靠的协议,建议传输文件还是使用tcp协议
客户端通过connect函数连接服务器端后就可进行数据传输
其实文件传输本质就是数据传输,我们在服务器端只需要使用opendir函数“打开”文件夹
再使用readdir函数遍历文件夹即可,将所有读到的文件名进行判断,比如判断该文件是否为文件夹,或者是否会特殊文件,比如软链接,socket文件,管道文件等等,如果是文件夹则进行该文件夹进行递归(即进入该文件夹后施行前面相同的方法,以此类推下去,直到读取完所有的文件夹),并将该文件夹名称发送给客户端,客户端接收到该文件夹名称后使用mkdir函数创建一个文件夹,如果为一般文件将该文件名和所在目录发送到客户端,客户端创建该文件(如果是多级文件夹则客户端则进入文件夹)读取该文件(fopen或者open),可以一边读取文件内容一边将读取的内容发送给客户端,客户端则将接收到的内容写入到文件即可
这里需要注意的就是服务器端与客户端需要规划好一定的规则,也就是需要建立一个简单的服务器与客户端通信的协议
比如最简单的我们使用文件类型:文件名来表明传输的数据的意义
服务器端在检查文件夹内的文件时通过不同的文件类型来制定不同的标签,客户端通过检测这些标签来确定下一步的操作
比如服务器检测到一个文件夹则会发送文件夹:该文件夹的名称
客户端在接收到该数据后进行解析,解析到冒号前的文件类型为文件夹则创建一个冒号后的文件夹名称(这里文件夹名称包括多级目录,我们也可以设置的更完善点,比如文件类型:文件夹:文件夹:文件夹,最后一个文件夹名称则为客户端需要创建的文件夹,前面的则是该文件夹所在的绝对路径)
有了这种简明的协议就可以更好地完成socket文件夹复制工作
linux socket文件描述符与地址端口怎么关联的
socket跟他绑定也是为了统一接口。
所以网络相关的调用,如connect, bind等等,第一步基本上就是通过文件描述符找到对应的内核socket结构,然后在进行对应的操作。
SYSCALL_DEFINE2(listen, int, fd, int, backlog)
{
struct socket*sock;
int err, fput_needed;
int somaxconn;
/*通过文件描述符获得 kernel socket结构,并且增加此结构的引用计数*/
sock= sockfd_lookup_light(fd,&err,&fput_needed);
if(sock){
/*进行检测,看看是否满足系统设计的需求,功能上不重要*/
somaxconn= sock_net(sock->sk)->core.sysctl_somaxconn;
if((unsigned)backlog> somaxconn)
backlog= somaxconn;
/*检测此调用是否安全*/
err= security_socket_listen(sock, backlog);
/*执行具体的listen操作,TCP啊,或者是其他网络协议等等,这个ops是在socket时候绑定的*/
if(!err)
err= sock->ops->listen(sock, backlog);
/*减少kernel socket的引用计数*/
fput_light(sock->file, fput_needed);
}
return err;
}
上面就是一个典型的调用listen的内核操作。
在socket层内核完成的就是一个interface功能,或许也可以叫做桥接模式(bridge pattern)。
这就是我对socket及Linux文件描述符的理解。
Linux中通过Socket文件描述符寻找连接状态介绍
Proc虚拟文件系统下面有许多数字命名的子目录,这些数字表示系统当前运行的进程号;
其中/proc/N/fd目录下面保存了打开的文件描述符,指向实际文件的一个链接。如下:
复制代码代码如下:
[root@XXXXXXX_10_1_17_138 song_test]# ll/proc/25465/fd
total 0
lrwx------ 1 root root 64 Apr 14 09:36 0->/dev/pts/4(deleted)
lrwx------ 1 root root 64 Apr 14 09:36 1->/dev/pts/4(deleted)
lrwx------ 1 root root 64 Apr 14 09:36 10-> socket:[2289128790]
lrwx------ 1 root root 64 Apr 14 09:36 100-> socket:[2305227922]
lrwx------ 1 root root 64 Apr 14 09:36 101-> socket:[2305224138]
lrwx------ 1 root root 64 Apr 14 09:36 102-> socket:[2305233625]
lrwx------ 1 root root 64 Apr 14 09:36 103-> socket:[2305215571]
lrwx------ 1 root root 64 Apr 14 09:36 104-> socket:[2305243589]
lrwx------ 1 root root 64 Apr 14 09:36 105-> socket:[2305394065]
lrwx------ 1 root root 64 Apr 14 09:36 106-> socket:[2305394002]
我们想查看101 Socket文件描述符的链接状态该怎么看呢?聪明的注意到后面有个数字【2305224138】,这个数字又是哪儿来的呢?看客请往下看。
在/proc/net/tcp目录下面保存了所有TCP链接的状态信息。
复制代码代码如下:
[root@XXXXXXX_10_1_17_138 song_test]# cat/proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 8A11010A:7DC8 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 764789417 1 ffff881051dfcb40 99 0 0 10-1
1: 8A11010A:0369 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 737748331 1 ffff88106af8f7c0 99 0 0 10-1
51: 8A11010A:FAF4 9C01010A:0CEA 06 00000000:00000000 03:00000938 00000000 0 0 0 2 ffff8810516c01c0
52: 8A11010A:21CD 0964010A:2227 01 00000000:00000000 00:00000000 00000000 0 0 2305224138 2 ffff8801402f55c0 23 3 30 10-1
53: 8A11010A:FB8A 9C01010A:0CEA 06 00000000:00000000 03:000012A8 00000000 0 0 0 2 ffff8810516c04c0
54: 8A11010A:73E5 4511010A:0050 06 00000000:00000000 03:00000EA8 00000000 0 0 0 2 ffff88106898a880
55: 8A11010A:89AD F300010A:1F90 08 00000000:00000001 00:00000000 00000000 0 0 2305271480 1 ffff880869b59740 23 3 0 10-1
187: 8A11010A:0ACB 8811010A:1F90 06 00000000:00000000 03:0000028E 00000000 0 0 0 2 ffff881050e9ccc0
188: 8A11010A:FB6C 9C01010A:0CEA 06 00000000:00000000 03:000010CB 00000000 0 0 0 2 ffff88104fd8dd80
看上数字【2305224138】没有,就是这儿来的,到此我们可以找出链接的IP、PORT链接四元组【8A11010A:21CD 0964010A:2227】这个地方是用十六进制保存的,换算成十进制方式【10.1.17.138:8653 10.1.100.9:8743】;
去网络连接状态里面看一下:
复制代码代码如下:
[root@XXXXXXX_10_1_17_138 song_test]# netstat-ntp
Active Internet connections(w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.1.17.138:64428 10.1.1.156:3306 TIME_WAIT-
tcp 0 0 10.1.17.138:64244 10.1.1.156:3306 TIME_WAIT-
tcp 0 166 10.1.17.138:8653 10.1.100.9:8743 ESTABLISHED 25465/./index_searc
tcp 0 0 10.1.17.138:64394 10.1.1.156:3306 TIME_WAIT-
tcp 0 0 10.1.17.138:29669 10.1.17.69:80 TIME_WAIT-
tcp 0 0 10.1.17.138:46336 10.1.17.68:80 TIME_WAIT-
tcp 0 0::ffff:10.1.17.138:8080::ffff:10.1.17.136:27247 TIME_WAIT-
回到开始的问题:101 Socket文件描述符代表的是本地【10.1.17.138:8653】到【10.1.100.9:8743】的一条TCP连接!