📄 4.htm
字号:
exit(1);<br>
}'//接收失败打印错误信息<br>
serv_respon(connfd);//运行服务器的处理函数<br>
close(connfd);//关闭连接套接字}<br>
dose(listenfd);'//关闭监听套接字}<br>
服务器通信部分:<br>
#include<stdio.h><br>
< ……//引用头文件部分略><br>
void serv_respon(int sockfd){<br>
int nbytes;char bur[1024];<br>
for(;;){<br>
nbytes=read_requ(sockfd,bur,1024);<br>
//读出客户机发出的请求,并分析其中的协议结构,获知请求的内容部分的长度,并将内容复制到缓冲区buf中,<br>
if( (6) )return;//如客户机结束发送就退出<br>
else if(bytes<0){<br>
fprintf(siderr,"读错误情息:%s\n",strerror(errno));<br>
return;<br>
} //读请求错误打印错误信息<br>
if(write-all(sockfd,buf,nbytes)<0)<br>
//将请求中的内容部分反向发送回客户机<br>
fprintf(siderr,"写错误信息:%s\n",strerror(errno));<br>
}<br>
}<br>
int read_requ(int sockfd,char*buf int size){<br>
char inbuf[256];<br>
int n;int i;<br>
i=read_line(sockfd,inbuf,256);<br>
//从套接字接收缓冲区中读出一行数据,该数据为客户请求的首部<br>
if(1<O)return(i);<br>
else if(i==0)return(0);<br>
if(stmcmp(inbuf,″″,6)==0)<br>
scanf( (7) ,″%d″,&n); //从缓冲区buf中读出长度信息<br>
else{<br>
sprintf(bur,″″,14);<br>
return(14);<br>
} //取出首部Length域中的数值,该数值为内容部分的长度<br>
return(read-all(sockfd,bur,n));//从接收缓冲区中读出请求的内容部分<br>
}<br>
int get-char(int fd,char*ch){<br>
static int offset=0;<br>
static int size=0;<br>
static char buff[1024];<br>
//声明静态变量,在get_char多次被调用期间,该变量的内存不释放<br>
for(;size<=0 | | (8) ;){<br>
size=read(fd,bur,1024);//一次从套接字缓冲区中读出一个数据块<br>
if(size<0){<br>
if(errno==EINTR){<br>
size=0;<br>
contine;<br>
//EINTR表示本次读操作没有成功,但可以继续使用该套接字读出数i<br>
}else<br>
return(-1);<br>
}<br>
offset=0; //读出数据后,将偏址置为0<br>
*ch=buf[offset ++]; //将当前的字符取出,并将偏址移向下一字符<br>
return(1);<br>
}<br>
int read _ line(int fd,char*buf,int msxlen){<br>
int i, n;<br>
char ch;<br>
for(i=0;i< (9) ){<br>
n=get_char(fd,&ch);//取出一个字符<br>
if(n==1){<br>
buff[i++]=ch;//将字符加入字符串中<br>
if( (10) )break;<br>
}else if(n<)return(-1);<br>
else break;<br>
}<br>
buf[i]=`\0`;<br>
return(i);<br>
}<br>
//函数read_line的作用是读出请求的首部,其处理的方法是每次调用get_char函数,取出一个字符,检查该字符是否是回车符`\n`,如果是回车符,就返回请求的首部<br>
//get_char的处理方式较为特殊,并不是每次调用read函数读一个字符,而是一次从缓冲区中读一块内容,再一次一个字符提交给函数read_line,如果提交完了就再读一块,这样就可以提高读缓冲区的效率。另外,由于客户机是分两次调用writ_all函数将请求的首部和内容发送给服务器,因此get_char不会取出请求内容部分的字符部分<br>
SOCKET数据结构与函数:<br>
1.地址结构。<br>
sockaddr_in:<br>
sockaddr_in类型的结构定义,sockaddr_in是通用套接字结构sockaddr在TCP/IP协议下的结构重定义,为TCP/IP套接字地址结构。<br>
Struct sockaddr_in{<br>
short int sin_family;//地址类型AF_XXX,其中AF_INET为TCP/IP专用<br>
unsigned short int sin _port;//端口号<br>
struct in_addr sin_addr;//Internet地址<br>
//端口号以及Internet地址使用的是网络字节顺序,需要通过函数htons转换<br>
}<br>
struct_inaddr{<br>
_u32 s_addr;//类型为unsignel long<br>
}<br>
hostent:<br>
hostent类型的结构定义<br>
struct hostnet{<br>
char*h_name; //主机的正式名称<br>
char**h_aliases; //别名列表<br>
nit h_addrtvPe; //主机地址类型:AF_XXX<br>
int h_length; //主机地址长度:4字节(32位)<br>
char**h_addr_list; //主机IP地址列表<br>
}<br>
#define h_addr h_addr_list[0]<br>
2.基本函数。<br>
int socket(int domain,int type,int protocol);<br>
函数socket创建一个套接字描述符,如果失败则返回-1。domain为地址类型,type为套接字类型,本题中为SOCK_STREAM;protocol指定协议,本题中为0。<br>
int connect(int sockfd,struct sockaddr*servaddr,int addrlen);<br>
函数connect与服务器建立一个连接,成功返回0,失败返回-1。servaddr为远程服务器的套接字地址,包括服务器的IP地址和端口号;addrlen为地址的长度。<br>
int read(int fd,char*bur,int len);<br>
int write(int fd,char*buf,int len);<br>
函数read和write从套接字读和写数据,成功返回数据量大小,否则返回-1。buf指定数据缓冲区,len指定接收或发送的数据量大小。<br>
int bind(int sockfd,struct sockaddr*myaddr,int addrlen);<br>
函数bind将本地地址与套接字绑定在一起,成功返回0,否则返回-1;myaddr是本机地址;addrlen为套接字地址结构的长度。<br>
int listen(int sockfd,int backlog);<br>
函数listen将一个套接字转换为倾听套接字,成功返回0,否则返回-1;backlog为请求队列的最大长度。<br>
int accept(int sockfd,struct sockaddr*addr,int*addrlen);<br>
函数accept从倾听套接字的完成连接中接收一个连接,如果完成连接队列为空,那么这个进程睡眠,失败时返回-1,成功时返回新的套接字描述符。Sockfd为倾听套接字,addr为客户机的地址,addlen为地址长度,在调用时用常量NULL代替addr与addlen表示无须取出客户机的地址信息<br>
struct hostent *gethostbyname(const char*hostname);<br>
函数gethostbyname查询指定的域名地址对应的IP地址,返回一个hostent结构的指针,如果不成功返回NULL。<br>
3.用户自定义函数。<br>
int read_all(int fd,void*bur,int nbyte);<br>
函数read all从参数fd指定的套接字描述符中读取nbytes字节数据至缓冲区buf中,成功返回实际读的字节数(可能小于nbyte),失败返回-1。<br>
int write_all(int fd,void*bur,int nbyte);<br>
函数write_all向参数fd指定的套接字描述符中写入缓冲区buf前nbyte字节的数据,成功返回实际写的字节数(始终等于nbyte),失败返回-1。<br>
write_requ函数为客户机发送请求的函数;read_requ函数为服务器获取请求的函数。 </p>
<p>
<span class="style1">
<textarea name="textarea" cols="75" rows="10" id="textarea"></textarea>
</span></p>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="1%" valign="top"> </td>
<td width="99%" valign="top"><span class="style1" style="text-align:left;"><img src="images/anniu.gif" width="78" height="22" img style="CURSOR: hand" onClick=DisplayOrHidden(T2)></span>
<table width="96%" border="0">
<tr>
<td><p align=left style='text-align:left;'>
<span class="style1"><SPAN id=T2 style="BORDER-RIGHT: #ffffff 1px solid; BORDER-TOP: #ffffff 1px solid; DISPLAY: none; BORDER-LEFT: #ffffff 1px solid; COLOR: black; BORDER-BOTTOM: #ffffff 1px solid; FONT-FAMILY: 宋体"><span class="STYLE1" style="font-family: 宋体">
【答案】(1)socket(AF_INET,SOCK_STREAM,0)<br>
(2)INADDR_ANY<br>
(3)htons(SERVER_PORT)<br>
(4)listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)<br>
(5)accept(listenfd,NULL,NULL)<br>
(6)nbytes==0<br>
(7)buf+6<br>
(8)offset==size<br>
(9)maxlen<br>
(10)ch==`\n`<br>
</span></p>
</td>
</tr>
</table></td>
</tr>
</table>
<p class="style1">● 试题三<br>
阅读以下说明和交换机的配置信息,回答问题1~3,将解答填入答题纸的对应栏内。<br>
【说明】<br>
某公司下设3个部门,为了便于管理,每个部门组成一个VLAN,公司网络结构如图1所示。</p>
<p align="center" class="style1"><img src="images/xiawu4001.gif" width="578" height="222"><br>
图1 网络结构图</p>
<p align="left" class="style1"><br>
【交换机Switch1的部分配置信息】<br>
Switch1 (config)#tinterface fO/9<br>
Switch1(config-if)#switchport mode access<br>
Switch1(config-if)#switchport access vlan 11<br>
Switch1(config)#interface fO/10<br>
Switch1(config-if)#switchport mode access<br>
Switch1(config-if)#switchport access vlan 12<br>
Switch1(config)#interface fO/17<br>
Switch1(config-if)#switchport mode access<br>
Switch1(config-if)#switchport access vlan 13<br>
【交换机Switch2的部分配置信息】<br>
Switch2(config)#interface fO/6<br>
Switch2(config-if)#switchport mode access<br>
Switch2(config-if)#switchport access vlan 11<br>
Switch2(config)#interface fO/8<br>
Switch2(config-if)#switchport mode access<br>
Switch2(config-if)#switchport access vlan 12<br>
Switch2(config)#intefface fO/11<br>
Switch2(config-if)#switchport mode access<br>
Switch2(config-if)#switchport access vlan 13<br>
【交换机Switch3的部分配置信息】<br>
Switch3(config)#interface fO/3<br>
Switch3(config-if)#switchport mode access<br>
Switch3(config-if)#switchport access vlan 11<br>
Switch3(config-if)#exit<br>
Switch3(config)#interface fO/7<br>
Switch3(config-if)#switchport mode access<br>
Switch3(config-if)#switchport access vlan 12<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -