图解Linux UDP数据传输 (linux udp如何传输数据图解)
在互联网时代,无论是数据传输还是通信都离不开网络技术,而Linux操作系统作为一款广泛应用的操作系统,其UDP(User Datagram Protocol)数据传输也成为了网络中不可缺少的一部分。本文将通过图解的方式,让读者更好地了解Linux中UDP数据传输的原理和过程。
什么是UDP协议?
UDP协议是一种无连接的网络传输协议,它不像TCP那样需要建立连接,以链路为基础直接进行数据传递。UDP协议的特点是传输速度快,但可靠性不如TCP协议,因为它不对传输过程进行严格控制,只是将数据报从源到目的地进行简单传输。因此,很多需要快速传输数据而对可靠性要求不高的应用程序,如视频、音频等,都采用UDP协议进行传输。
UDP协议的传输方式
1. 发送端利用create_socket()函数创建套接字,设置套接字参数。
2. 发送端利用sendto()函数将UDP数据报发送给接收端。
3. 接收端利用recvfrom()函数接收UDP数据报。
4. 进程关闭套接字。
UDP数据报格式
UDP数据报头部固定占用8个字节,包含以下字段:
源端口:2个字节,表示发送端口。
目标端口:2个字节,表示接收端口。
总长度:2个字节,表示UDP数据报总长度。
校验和:2个字节,为可选项,可用于验证UDP数据报的完整性。
UDP数据报示意图:
Linux中的UDP传输
在Linux中,UDP传输也是通过socket进行实现的,其具体过程如下:
1. 创建UDP套接字
首先需要调用socket()函数创建一个套接字,指定ADDRESS_FAMI为AF_INET(IP协议族),SOCK_DGRAM为IP协议类型,最后一个参数为0,该参数由系统自动选择合适的协议。
2. 绑定套接字
创建好套接字后,需要使用bind()函数将套接字绑定到本机的IP地址和端口号上。绑定后,即可接收其他主机发送过来的UDP数据报。
3. 发送UDP数据报
使用sendto()函数向指定目标IP地址和端口号发送UDP数据报,该函数的参数包括发送端套接字、UDP数据报内容、UDP数据报长度、目标地址和端口号。
4. 接收UDP数据报
使用recvfrom()函数接收发送端发送过来的UDP数据报,该函数的参数包括接收端套接字、接收缓冲区、缓冲区长度、接收数据报来源的IP地址和端口号。
5. 关闭套接字
使用close()函数关闭套接字。
Linux UDP传输示意图:
UDP协议虽然不太可靠,但是由于其传输速度快,因此在音视频、实时游戏等应用场景中应用广泛。在Linux中,UDP传输也是通过socket进行实现的,需要进行套接字的创建、绑定、发送和接收等操作。了解UDP数据报的格式和UDP传输过程,对于网络通信和应用程序开发非常有帮助。
相关问题拓展阅读:
- UDP和Socket通信步骤
UDP和Socket通信步骤
这是在网上找到的,希望对你有所帮助。
sockets(套接数神字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);
WINDOWS环境下TCP/UDP编程步骤:
1. 基于裤毕岩TCP的socket编程是采用的流式套接字。
在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。
服务器端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:将套接字设置为监听模式等待连接请求(listen());
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:用返回的套接字和客户端进行通信(send()/recv());
6:返回,等待另一连接请求;
7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
服务器端代码如下:
#include
#include
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf;
sprintf(sendBuf,”Welcome %s to here!”,inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf;
recv(sockConn,recvBuf,50,0);
printf(“%s\n”,recvBuf);
closesocket(sockConn);
}
}
客户端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:向服务器发出胡御连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
客户端的代码如下:
#include
#include
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf;
recv(sockClient,recvBuf,50,0);
printf(“%s\n”,recvBuf);
send(sockClient,”hello”,strlen(“hello”)+1,0);
closesocket(sockClient);
WSACleanup();
}
2.基于UDP的socket编程是采用的数据报套接字。
在这个程序中,将两个工程添加到一个工作区。同时还要链接一个ws2_32.lib的库文件。
服务器端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:等待和接收数据(sendto()/recvfrom());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
服务器端代码如下:
#include
#include
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(7003);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf;
SOCKADDR addrClient;
int len=sizeof(SOCKADDR);
recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);
printf(“%s\n”,recvBuf);
closesocket(sockSrv);
WSACleanup();
}
对于基于UDP的socket客户端来说,要进行如下步骤:
1:创建一个套接字(socket);
2:向服务器发送数据(sendto);
3:关闭套接字;
代码如下:
#include
#include
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr=inet_addr(“127.0.0.1”);
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(8889);
SOCKADDR_IN addrSrv;
sendto(sockClient,”hi”,3,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
}
LINUX环境下TCP/UDP编程步骤:
TCP编程步骤:
一. 服务端:
1.socket(int domain,int type,int protocol):建立套接字;
2 .bind(int sockid,struct sockaddr *addrp,socklen_t addrlen):把本机地址和端口跟上一步建立的socket绑定在一起;
3.listen(int sockid,int qsize):监听某套接字;
4.fd=accept(int sockid,struct sockaddr *callerid,socklen_t *addrlenp):等待某套接字接收信息;
5.recv(int fd,void *buf,size_t nbytes,int flags):从套接字接收数据;
6.close(fd) 和close(sockid)
二.客户端:
1. socket():建立套接字;
2.connect(int sockid,struct sockaddr *serv_addrp,socklen_t addrlen):连接到服务器;
3. send(int sockfd,const void *buf,size_t nbytes,int flags):发送数据到服务器.
4. close(sockid);
UDP编程步骤:
一,服务端:
1. socket():同上;
2. bind():同上;
3. recvfrom(int sockfd,void*buff,size_t nbytes,int flags,struct sockaddr*from,socklen_t*addrlen):在套接字口接收数据,并且记录下接收到的数据来源;一定要注意这里的参数addrlen,它不仅是函数的输出,也是函数的输入!所以要在调用该函数之前对addrlen赋值sizeof(struct sockaddr)。否则返回的地址from将会出错!
4. close(sockfd);
二. 客户端:
1. socket();同上;
2. sendto(int sockfd,const void*buff,size_t nbytes,int flags,const struct sockaddr*to,socklen_t addrlen):往指定的地址发送数据;
3. close(sockfd);
UDP Server程序
1、编写UDP Server程序的步骤
(1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。
(2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero;
};
这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为姿凯绑定的IP地址即任何主机上的地址。
(3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。
(4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。
2、udpserv.c程序内容:
#include
#include
#include
#include
#include
#include
#define MAXLINE 80
#define SERV_PORT 8888
void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg;
for(;;)
{
len = clilen;
/* waiting for receive data */
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
/* sent data back to client */
sendto(sockfd, mesg, n, 0, pcliaddr, len);
}
}
int main(void)
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */
/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
/* bind address and port to socket */
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror(“bind error”);
exit(1);
}
do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
return 0;
}
UDP Client程序
1、编写UDP Client程序的步骤
(1)初始化sockaddr_in结构举册伍的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。
(2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。
(3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面我们说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。
(4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。正或
(5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。
(6)处理接收到的数据,这里是直接输出到标准输出上。
2、udpclient.c程序内容:
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 80
#define SERV_PORT 8888
void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)
{
int n;
char sendline, recvline;
/* connect to server */
if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1)
{
perror(“connect error”);
exit(1);
}
while(fgets(sendline, MAXLINE, fp) != NULL)
{
/* read a line and send to server */
write(sockfd, sendline, strlen(sendline));
/* receive data from server */
n = read(sockfd, recvline, MAXLINE);
if(n == -1)
{
perror(“read error”);
exit(1);
}
recvline = 0; /* terminate string */
fputs(recvline, stdout);
}
}
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in srvaddr;
/* check args */
if(argc != 2)
{
printf(“usage: udpclient \n”);
exit(1);
}
/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
if(inet_pton(AF_INET, argv, &servaddr.sin_addr)
{
printf(” is not a valid IPaddress\n”, argv);
exit(1);
}
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
return 0;
}
运行例子程序
1、编译例子程序
使用如下命令来编译例子程序:
gcc -Wall -o udpserv udpserv.c
gcc -Wall -o udpclient udpclient.c
编译完成生成了udpserv和udpclient两个可执行程序。
2、运行UDP Server程序
执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
tcp.0.0.1:631 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:.0.0.0:*
udp 0 0 0.0.0.0:8888 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:882 0.0.0.0:*
可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。
如果这时再执行./udpserv &命令,就会看到如下信息:
bind error: Address already in use
说明已经有一个服务程序在运行了。
3、运行UDP Client程序
执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:
Hello, World!
Hello, World!
this is a test
this is a test
^d
输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。
如果服务程序没有启动,而执行客户程序,就会看到如下信息:
$ ./udpclient 127.0.0.1
test
read error: Connection refused
说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果你使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。
2、如何在linux下用tcp传输文件
一. FTP 说明linux 系统下常用的FTP 是vsftp, 即Very Security File Transfer Protocol. 还有一个是proftp(Profession ftp)。 我们这里也是简单的说明下vsftp的配置。 vsftp提供3种远程码棚的昌租登录方式: (1)匿名登录方式 就是不需要用户名,密码。就能登录到服务器电脑里面(2)本地用户方式 需要帐户名和密码才能登录。而且,这个帐户名和密码,都是在你linux系统里面,已经有的用户。 (3)虚拟用户方式同样需要用户名和密码才能登录。但是和上面的区别就是,这个用户名和密码,在你linux系统中是没有的(没有该用户帐号)二. Vsftp的安装配置2.1 安装迟迅则vsftp 的安装包,可以在安装里找到。 用yum 安装过程也很简单。安装命令:yum install vsftpd2.2. 相关命令2.2.1 启动与关闭# service vsftpd startStarting vsftpd for vsftpd: # service vsftpd stopShutting down vsftpd:# service vsftpd restartShutting down vsftpd:Starting vsftpd for vsftpd: # /etc/init.d/vsftpd startStarting vsftpd for vsftpd: # /etc/init.d/vsftpd stopShutting down vsftpd:# /etc/init.d/vsftpd restartShutting down vsftpd:Starting vsftpd for vsftpd: # /etc/init.d/vsftpd statusvsftpd (pid 3931) is running…#2.2.2. 其他命令–查看vsftpd 启动状态# chkconfig –list vsftpdvsftpd:off 1:off 2:off 3:off 4:off 5:off 6:off# chkconfig vsftpd on# chkconfig –list vsftpdvsftpd:off 1:off 2:on 3:on 4:on 5:on 6:off这里看到,默认情况下从2到5设置为on了。2到5是多用户级别。 这个对应的是linux不同的运行级别。我们也可以加level 选项来指定:# chkconfig –level 0 vsftpd on # chkconfig –list vsftpdvsftpd:on 1:off 2:on 3:on 4:on 5:on 6:off我们看到0已经设置为on了。我们可以使用man chkconfig 来查看帮助:–level levels Specifies the run levels an operation should pertain to. It is given as a string of numbers from 0 to 7. For example, –level 35 specifies runlevels and 5.传统的init 定义了7个运行级(run level),每一个级别都代表系统应该补充运行的某些特定服务: (1)0级是完全关闭系统的级别 (2)1级或者S级代表单用户模式 (3)2-5 级 是多用户级别 (4)6级 是 重新引导的级别(1)查看防火墙 我一般都是把系统的防火墙关闭了。 因为开了会有很多限制。# /etc/init.d/iptables statusTable: natChain PREROUTING (policy ACCEPT)num target prot opt source destinationChain POSTROUTING (policy ACCEPT)num target prot opt source destination MASQUERADE all.168.122.0/24 !192.168.122.0/Chain OUTPUT (policy ACCEPT)num target prot opt source destinationTable: filterChain INPUT (policy ACCEPT)num target prot opt source destination ACCEPT udp.0.0.0/.0.0.0/udp dpt:ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:ACCEPT udp.0.0.0/.0.0.0/udp dpt:ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:67Chain FORWARD (policy ACCEPT)num target prot opt source destination ACCEPT all.0.0.0/92.168.122.0/24 state RELATED,ESTABLISHEDACCEPT all.168.122.0/.0.0.0/ ACCEPT all.0.0.0/.0.0.0/ REJECT all.0.0.0/.0.0.0/reject-with icmp-port-unreachableREJECT all.0.0.0/.0.0.0/reject-with icmp-port-unreachableChain OUTPUT (policy ACCEPT)num target prot opt source destinationYou have new mail in /var/spool/mail/root–添加开放21号端口:# /in/iptables -I INPUT -p tcp –dport 21 -j ACCEPT# /etc/init.d/iptables statusTable: natChain PREROUTING (policy ACCEPT)num target prot opt source destinationChain POSTROUTING (policy ACCEPT)num target prot opt source destination MASQUERADE all.168.122.0/24 !192.168.122.0/Chain OUTPUT (policy ACCEPT)num target prot opt source destinationTable: filterChain INPUT (policy ACCEPT)num target prot opt source destination ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:ACCEPT udp.0.0.0/.0.0.0/udp dpt:ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:ACCEPT udp.0.0.0/.0.0.0/udp dpt:ACCEPT tcp.0.0.0/.0.0.0/tcp dpt:67Chain FORWARD (policy ACCEPT)num target prot opt source destination ACCEPT all.0.0.0/92.168.122.0/24 state RELATED,ESTABLISHEDACCEPT all.168.122.0/.0.0.0/3 ACCEPT all.0.0.0/.0.0.0/ REJECT all.0.0.0/.0.0.0/reject-with icmp-port-unreachableREJECT all.0.0.0/.0.0.0/reject-with icmp-port-unreachableChain OUTPUT (policy ACCEPT)num target prot opt source destination保存配置# /etc/rc.d/init.d/iptables saveSaving firewall rules to /etc/sysconfig/iptables:–重启防火墙:# service iptables {startstoprestart}(2)查看关闭selinux# sestatusSELinux status: disabled我这里在安装操作系统的时候就关闭了selinux,如果没有关闭,可以修改如下文件来关闭:# cat /etc/sysconfig/selinux# This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:#enforcing – SELinux security policy is enforced.#permissive – SELinux prints warnings instead of enforcing.#disabled – SELinux is fully disabled.SELINUX=disabled# SELINUXTYPE= type of policy in use. Possible values are:#targeted – Only targeted network daemons are protected.#strict – Full SELinux protection.SELINUXTYPE=targeted#保存退出并重启系统reboot三. FTP配置文件FTP 安装好之后,在/etc/vsftpd/目录下会有如下文件:# cd /etc/vsftpd/# lsftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh#vsftpd.conf: 主配置文件ftpusers: 指定哪些用户不能访问FTP服务器user_list: 指定的用户是否可以访问ftp服务器由vsftpd.conf文件中的userlist_deny的取值来决定。# cat user_list# vsftpd userlist# If userlist_deny=NO, only allow users in this file# If userlist_deny=YES (default), never allow users in this file, and# do not even prompt for a password.# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers# for users that are denied.我们过滤掉#的注释后,查看一下vsftpd.conf 文件:# cat /etc/vsftpd/vsftpd.conf grep -v ‘^#’;anonymous_enable=YESlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESlisten=YESpam_service_name=vsftpduserlist_enable=yestcp_wrappers=YES至于这些参数的意思,在注释里有详细的说明。我们可以在vsftpd.conf 文件设置如下参数:(1)ftpd_banner=welcome to ftp service :设置连接服务器后的欢迎信息(2)idle_session_timeout=60 :限制远程的客户机连接后,所建立的控制连接,在多长时间没有做任何的操作就会中断(秒)(3)data_connection_timeout=120 :设置客户机在进行数据传输时,设置空闲的数据中断时间(4)accept_timeout=60 设置在多长时间后自动建立连接(5)connect_timeout=60 设置数据连接的更大激活时间,多长时间断开,为别人所使用;(6)max_clients=200 指明服务器总的客户并发连接数为200(7)max_per_ip=3 指明每个客户机的更大连接数为3(8)local_max_rate=50000(50kbytes/sec) 本地用户更大传输速率限制(9)anon_max_rate=30000匿名用户的更大传输速率限制(10)pasv_min_port=端口(11)pasv-max-prot=端口号 定义更大与最小端口,为0表示任意端口;为客户端连接指明端口;(12)listen_address=IP地址 设置ftp服务来监听的地址,客户端可以用哪个地址来连接;(13)listen_port=端口号 设置FTP工作的端口号,默认的为21(14)chroot_local_user=YES 设置所有的本地用户可以chroot(15)chroot_local_user=NO 设置指定用户能够chroot(16)chroot_list_enable=YES(17)chroot_list_file=/etc/vsftpd/chroot_list(只有/etc/vsftpd/chroot_list中的指定的用户才能执行 )(18)local_root=path 无论哪个用户都能登录的用户,定义登录帐号的主目录, 若没有指定,则每一个用户则进入到个人用户主目录;(19)chroot_local_user=yes/no 是否锁定本地系统帐号用户主目录(所有);锁定后,用户只能访问用户的主目录/home/user,不能利用cd命令向上转;只能向下;(20)chroot_list_enable=yes/no 锁定指定文件中用户的主目录(部分),文件:/chroot_list_file=path 中指定;(21)userlist_enable=YES/NO 是否加载用户列表文件;(22)userlist_deny=YES 表示上面所加载的用户是否允许拒绝登录;(23)userlist_file=/etc/vsftpd/user_list 列表文件限制IP 访问FTP:#vi /etc/hosts.allowvsftpd:192.168.5.128:DENY 设置该IP地址不可以访问ftp服务FTP 访问时间限制:#cp /usr/share/doc/vsftpd-1.1.3/vsftpd.xinetd /etc/xinetd.d/vsftpd#vi /etc/xinetd.d/vsftpd/修改 disable = noaccess_time = hour:min-hour:min (添加配置访问的时间限制(注:与vsftpd.conf中listen=NO相对应)例: access_time = 8:30-11:30 17:30-21:30 表示只有这两个时间段可以访问ftpftp的配置基本上只有这些了。默认情况下,ftp根目录是/var/ftp。 如果要修改这个目录位置,可以更改/etc/passwd 文件:# cat /etc/passwd grep ftpftp:x:14:50:FTP User:/var/ftp:/in/nologin创建一个用户来访问FTP,并指定该用户的FTP 目录:# useradd -d /u02/qsftp qs# passwd qsChanging password for user qs.New UNIX password:BAD PASSWORD: it is WAY too shortRetype new UNIX password:passwd: all authentication tokens updated successfully.这里指定的是/u02/qsftp 这个目录,要注意个目录的权限。更改用户不能telnet,只能ftp:usermod -s /in/nologin username //用户只能ftp,不能telnetusermod -s /in/bash username //用户恢复正常禁止用户ssh登陆useradd username -s /bin/false 更改用户主目录:usermod -d /bbb username//把用户的主目录定为/bbb然后用qs这个用户就可以访问了。以上只是一些简单的设置。 在用户权限这块还有很多内容可以研究。 比如特定用户的特定权限。 安全性等。 以后在研究了。
返回列表上一篇:linux socket 不释放
关于linux udp如何传输数据图解的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
编辑:568数据
标签:程序,数据,用户,端口,地址