LINUX实验报告Word格式.docx
- 文档编号:21860806
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:15
- 大小:112.25KB
LINUX实验报告Word格式.docx
《LINUX实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《LINUX实验报告Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
main()
{
intlistenfd,connectfd;
structsockaddr_inserver;
structsockaddr_inclient;
socklen_taddrlen;
if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)
perror("
socket()error."
);
exit
(1);
}
intopt=SO_REUSEADDR;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&
opt,sizeof(opt));
bzero(&
server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(structsockaddr*)&
server,sizeof(server))==-1)
Bind()error"
}
if(listen(listenfd,BACKLOG)==-1)
listen()error.\n"
exit
(1);
addrlen=sizeof(client);
if((connectfd=accept(listenfd,(structsockaddr*)&
client,&
addrlen))==-1)
accept()error.\n"
printf("
Yougotaconnectionfromcient'
sipis%s,portis%d.\n"
inet_ntoa(client.sin_addr),htons(client.sin_port));
send(connectfd,"
welcome\n"
8,0);
close(connectfd);
close(listenfd);
客户端
strings.h>
netdb.h>
#defineMAXDATASIZE100
intmain(intargc,char*argv[])
intsockfd,num;
charbuf[MAXDATASIZE];
structhostent*he;
if(argc!
=2)
Usage:
%s<
IPADDRESS>
\n"
argv[0]);
if((he=gethostbyname(argv[1]))==NULL)
gethostbyname()error\n"
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
socket()error\n"
server.sin_port=htons(PORT);
server.sin_addr=*((structin_addr*)he->
h_addr);
if(connect(sockfd,(structsockaddr*)&
server,sizeof(server)==-1)){
connect()error\n"
if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1)
{
buf[num-1]='
\0'
;
servermessage:
%s\n"
buf);
close(sockfd);
3、实验运行结果
服务端的运行结果:
客户端的运行结果:
4、源代码解析
服务端代码解析:
if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1)////服务器端首先调用socket()函数,指定使用AF_INET、TCP方式创建,第一参数AF_INFET用来指明socket对象所使用的协议簇;
第二个参数SOCK_STREAM为套接字类型,为可靠的,面向连接的流socket,默认为TCP协议;
第三个参数,设置为0,让系统自动选择默认协议,此时为TCP协议。
//创建一个套接字监听套接字的返回值
//perror()用来将上一个函数发生错误的原因输出到标准设备(stderr)。
参数s所指的字符串会先打印出,后面再加上错误原因字符串。
此错误原因依照全局变量errno的值来决定要输出的字符串。
//退出
//设置套接字选项为SO_REUSEADDR,socket可重用,经常在socket通信时进行设置。
A:
这个套接字选项通知内核,如果端口忙,但TCP状态位于TIME_WAIT,可以重用端口。
如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"
地址已经使用中"
。
如果你的服务程序停止后想立即重启,而新套接字依旧使用同一端口,此时SO_REUSEADDR选项非常有用。
//设置套接字选项为SO_REUSEADDR,即socket可重用。
设置socket为可发送广播信息
//servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
首先将整个结构体清零,然后设置地址类型为AF_INET,网络地址为INADDR_ANY,这个宏表示本地的任意IP地址,因为服务器可能有多个网卡,每个网卡也可能绑定多个IP地址,这样设置可以在所有的IP地址上监听,直到与某个客户端建立了连接时才确定下来到底用哪个IP地址,端口号为SERV_PORT,我们定义为8000。
//地址协议IPV4
//地址端口
server,sizeof(server))==-1)//绑定地址信息
if(listen(listenfd,BACKLOG)==-1)//监听网络
if(listen(listenfd,BACKLOG)==-1)//典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。
listen()成功返回0,失败返回-1。
addrlen))==-1)//intaccept(intsockfd,structsockaddr*cliaddr,socklen_t*addrlen);
三方握手完成后,服务器调用accept()接受连接,如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。
cliaddr是一个传出参数,accept()返回时传出客户端的地址和端口号。
addrlen参数是一个传入传出参数(value-resultargument),传入的是调用者提供的缓冲区cliaddr的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)。
如果给cliaddr参数传NULL,表示不关心客户端的地址。
//发送函数
//关闭连接
//关闭监听
客户端代码解析:
//定义sock字段
//定义数据的最大长度
//定义socketaddr_in类型,名为server的结构体
=2)//判断命令行输入的是否为两个参数
if((he=gethostbyname(argv[1]))==NULL)//判断主机名是否为空
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//客户端调用socket()函数,指定与服务器端使用相同通信协议,使用AF_INET、TCP方式创建,第一参数AF_INFET用来指明socket对象所使用的协议簇;
//给套接字清0
//创建基于IPV4的数据六方式socket对象
//?
对方端口
//对方ip地址
server,sizeof(server)==-1))//发起连接
if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1)//从套接口接收数据
//buf接收数据的缓冲区
//输出服务端的信息
二、综合实验项目2
1、实验题目
Linux基于UDP的网络编程
进入udp文件夹,新建文件udp.c,
并在其中输入以下代码:
cdudp
进入文件夹viudp.c
新建文件udp.c
服务端
#include<
#defineMAXLINE80
#defineSERV_PORT8888
voiddo_echo(intsockfd,structsockaddr*pcliaddr,socklen_tclilen)
{
intn;
socklen_tlen;
charmesg[80];
for(;
)
{
len=clilen;
n=recvfrom(sockfd,mesg,80,0,pcliaddr,&
len);
sendto(sockfd,mesg,n,0,pcliaddr,len);
}
intmain(void)
intsockfd;
structsockaddr_inservaddr,cliaddr;
sockfd=socket(AF_INET,SOCK_DGRAM,0);
bzero(&
servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(8888);
if(bind(sockfd,(structsockaddr*)&
servaddr,sizeof(servaddr))==-1)
perror("
binderror"
exit
(1);
}
do_echo(sockfd,(strucsockaddr*)&
cliaddr,sizeof(cliaddr));
return0;
保存文件退出文件编辑模式回到命令行模式,对所编写的程序进行编译
Gcc-oudpudp.c
新建文件udpclient.c,输入以下代码:
void
do_cli(FILE
*fp,int
sockfd,struct
sockaddr
*pservaddr,socklen_t
servlen)
{intn;
charsendline[80],recvline[80+1];
if(connect(sockfd,(structsockaddr*)pservaddr,servlen)==-1)
{perror("
connecterror"
while(fgets(sendline,80,fp)!
=NULL)
write(sockfd,sendline,strlen(sendline));
n=read(sockfd,recvline,80);
if(n==-1)
readerror"
recvline[n]=0;
fputs(recvline,stdout);
intmain(intargc,char**argv)
intsockfd;
structsockaddr_inservaddr;
if(argc!
usage:
udpclient<
IPaddress>
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(8888);
if(inet_pton(AF_INET,argv[1],&
servaddr.sin_addr)<
=0)
[%s]isnotavalidIPaddress\n"
argv[1]);
sockfd=socket(AF_INET,SOCK_DGRAM,0);
do_cli(stdin,sockfd,(structsockaddr*)&
return0;
保存文件退出文件编辑模式回到命令行模式,对所编写程序进行编译。
gcc–oudpclientudpclient.c
运行的方法有两种,一种是就在本机上先执行udp可执行程序,再执行udpclient程序。
另一种方法是利用交叉线连接两台NORCO工作平台,在一台上先执行udp程序,另一台机子上执行udpclient程序。
执行的命令如下:
./udp&
./udpclient127.0.0.1
//当采用两机互联时将IP地址改为对方IP即可
执行结果如下:
Hello//手动输入
Hello//udp显示
WelcometoIntel&
NORCOplatform//手动输入
NORCOplatform//udp显示
在执行过程中,可以利用netstat–ln来观察绑定的端口号,如果udp服务器已经执行,
当我们再次重复执行时会报错binderror:
Addressalreadyinuse,如果未启动服务器程序直接运行客户端程序则会报错readerror:
Connectionrefused,
在正常执行过程中可以通过Ctrl+d或者Ctrl+c结束程序。
执行的截图:
4、源代码解析
UDP协议是建立在IP协议基础之上的,用在传输层的协议。
UDP与
TCP的不同在于它是不可靠的数据报服务,只是简单地对信息进行接收而
不对接收到的信息的正确性进行检查。
其常用的两个函数如下:
intrecvfrom(intsockfd,void*buf,intlen,unsignedintflags,
structsockaddr*fromint*fromlen)
intsendto(intsockfd,constvoid*msg,intlen,unsignedint
flags,structsockaddr*tointtolen)
sockfd,buf,len的意义和read,write一样,分别表示套接字描述符,发
送或接收的缓冲区及大小。
recvfrom负责从sockfd接收数据,如果from不是NULL,那么在fro
m里面存储了信息来源的情况,如果对信息的来源不感兴趣可以将from和
fromlen设置为NULL。
sendto负责向to发送信息,此时在to里面存储收信息方的详细资料。
UDP协议是建立在IP协议基础之上的,用在传输层的协议。
UDP与
TCP的不同在于它是不可靠的数据报服务,只是简单地对信息进行接收而
intrecvfrom(int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUX 实验 报告