网络编程doc.docx

上传人:b****7 文档编号:25656443 上传时间:2023-06-11 格式:DOCX 页数:19 大小:21.38KB
下载 相关 举报
网络编程doc.docx_第1页
第1页 / 共19页
网络编程doc.docx_第2页
第2页 / 共19页
网络编程doc.docx_第3页
第3页 / 共19页
网络编程doc.docx_第4页
第4页 / 共19页
网络编程doc.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

网络编程doc.docx

《网络编程doc.docx》由会员分享,可在线阅读,更多相关《网络编程doc.docx(19页珍藏版)》请在冰豆网上搜索。

网络编程doc.docx

网络编程doc

1.网络体系结构:

网络层次结构和每层所使用协议的集合。

2.应用层,传输层,网际层,网络接口层

Internet是以ARPANET网络为雏形建立的。

3.网络接口层:

负责将其上的网络层要发送出去的数据发送到其下面的物理网络,或接受由物理网络发送到该目标机的数据帧,并抽出IP数据报交给网络层。

网际层:

把源主机上的分组根据需要发送到互联网中的任何一台目标主机上。

传输层:

完成两台主机之间的通信,实质是两台主机对应进程之间的通信。

应用层:

提供面向用户的网络服务。

4.主机A和主机D通信,数据被送入主机A的协议栈中,然后从应用层开始依次通过协议栈的每一层,知道到数据被当作一串比特流送入物理网络,其中每一层对收到的数据都要增加一些首部信息,这个过程叫作shu7ju的封装。

目的主机D接受到数据流以后,又要从主机D的最低层协议开始,依次通过协议栈的每一层,知道数据被送到最高层应用层为止,接受方的每一层要对发送方对等层多加的数据头进行识别、提取和处理,这个过程叫作解封装。

物理层数据传输方式有:

模拟传输,数字传输。

常用的数字信号编码方式有:

NRZ码,DNRZ码,曼彻斯特码,差分曼彻斯特码。

数据编码:

是指将数据表示成适当的信号形式,以便数据的传输和处理。

在数据传输系统中,主要采用3种数据编码技术:

数字数据的模拟信号编码,数字数据的数字信号编码,模拟数据的数字信号编码。

5数据传输的介质:

同轴电缆,双绞线,光缆。

无线传输。

6.数据传输方式:

模拟传输,数据传输。

7.数据通信的方式:

单工通信,半双工通信,全双工通信。

8.信道复用技术:

频分多路复用技术,时分多路复用技术,光波分多路复用技术。

9.数据链路:

传输数据时,除了必须要有的一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。

10.差错检验与校正:

奇偶校验,方块校验,循环冗余校验。

11.路由器的功能:

路由和转发。

12.IP数据报格式:

1.版本号,占用4为二进制,2.头长度,用4位二进制,3.服务类型,用8位二进制,对数据报的处理方式,4.总长度,用16位二进制数表示,5.生存时间,用8位二进制数表示,6.上层协议标识,用8位二进制数表示,7.校验和,用16位,8.源地址,用23位,9.目的地址,用32位。

13.不产生ICMP差错报文:

(1)ICMP报文发生差错,这是为了避免差错报文无休止产生而规定的,

(2)目的地址是广播地址或多播地址的IP数据报,(3)作为链路层广播的数据报(4)不是IP分片的第一片,(5)源地址不是单个主机的数据报,就是说,源地址不能为零地址、回送地址,广播地址或多播地址。

14.ICMP报文类型:

目标不可达,重定向,超时,参数出错。

15.路由选择算法:

(1)路由器从收到的IP数据报中提取出目标IP地址,

(2)搜索路由表,寻找能与目的IP地址完全匹配的表目,如果能找到,就把报文发送给该表目指定的下一站路由器或者直接的网络接口,如果找不到,搜索路由表,把目标IP地址与子网掩码逐位“与”后找能与网络号想匹配的表目,如果能找到,就把报文发送给该表目指定的下一站路由器或直接连接的网络接口,如果找不到,就搜索路由表,寻找为“默认”的表目,把报文发送给指定的下一站路由器,如果找不到,就发送一个“目标不可达”的ICMP报文给源主机。

16.主机A发送ARP请求,请求帧中数据部分包括,发送者的MAC地址,IP地址,目标IP地址,目标的MAC地址是广播地址,所有的网络中的主机都可以打开,只有符合目标IP地址的主机才回答ARP请求,把自己的MAC地址写入,目标地址字段中发送给主机A,ARP请求者在自己的缓存中构建一个ARP表,将地址信号缓存起来。

17.端口的功能:

识别传输层上不同的网络通信程序。

18.TCP提供的是可靠的,有链接的服务,协议复杂,其拥塞控制,数据校验,重传机制的网络开销很大,不适合实时通信,UDP提供无连接,不可靠的,协议简单,高效的传输数据,适合数据传输量小的场合。

19.UDP:

无连接,不可靠,面向报文。

TCP:

连接,可靠的,面向字节流。

20.网络工作模式:

C/S模式,B/S模式,混合模式。

21.主机,先向本地域名服务器查询,要是没有就查询高速缓存查询,要是没有就向根域名服务器查询,在向顶级域名服务器查询,在向权限域名服务器查询返回给主机。

22.网络登录协议,指定不同的端口访问其他服务器。

23.万维网工作过程:

(1)用户受限要确定网页文件所在的URL,由ULR唯一确定用户要访问的文件在Internert上的位置,

(2)浏览器向DNS发送请求,把域名转换成对应的IP地址(3)DNS进行查询后,向浏览器发送出应答,(4)在查得到的网页躲在的服务器IP地址后,就进入HTTP的工作阶段,浏览器向服务器IP地址的主机发出与端口80建立一条TCP链接(5)链接建立成功后,浏览器发送一条请求传出网页的HTTP命令,(6)服务器接受到请求后,向浏览器发送文件,(7)文件发送完了,服务器主动关闭TCP链接,(8)浏览器显示收到的网页文件(9)要是文件中包含有图片,还要与服务器建立TCP链接下载图片。

24.URL=协议名称+主机名(或IP地址)+目录与文件名

25.控制链接:

<客户端IP地址,客户端控制链接端口,服务器端IP地址,FTP服务器控制链接端口21>

数据链接:

<客户端IP地址,客户端控制链接端口,服务器端IP地址,FTP服务器控制链接端口20>

26.网络中两个通讯程序相互识别对方:

在网络中位了标识通信的进程,首先要标识网络中进程所在的主机,在互联网中使用IP地址来标识不同的主机,其次要标识主机上不同的进程,主机上不同的进程问题,在网络协议中使用端口号来标识主机上的不同进程。

由于不同的主机可能使用不同的网络协议,工作方式不同,地址的标识格式不同,用五元组来标识连两个通信的进程(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)。

27.五元组:

协议,本地IP地址,本地端口号,远程IP地址,远程端口号。

28.套接口可以看成是两个网络应用程序进程通信时,各自通信连接中的一个端点。

流式套接口SOCK_STREAM提供了一种可靠地、面向连接的双向数据传输服务,实现了数据的无差错,无重复的发送,内设流量控制,被传输的数据看作是无记录边界的字节流

数据报套接口SOCK_DGRAM提供一种无连接、不可靠的双向数据传输服务,数据报以独立的包形式被发送,并且保留了记录边界,不提供可靠性保证。

原始套接口SOCK_RAW该套接口允许对较低层协议进行直接访问。

29.网络字节顺序保证数据的正确性。

Htonl()和WSAHtonl()参数是主机字节顺序4个字节

htons()和WSAHtons()参数是主机字节顺序2个字节。

30.网络程序要考虑的几个问题:

(1)并发环境下的网络编程,

(2)异构环境下的网络编程(字节顺序、字的长度、字节定界问题)(3)阻塞与非阻塞通道(4)服务类型的选择

31.加载协议栈intWSAStartup(WORDwVersionRequested,LPWSADATAipWASData)第一个指定Winsock库的版本号。

第二个参数是一个指向WSADATA结构的指针。

创建套接口SOCKETsocket(intaf,inttype,intprotocol);af说明套接口使用的协议地址族TCP或UDP。

Type套接口的类型,protocol套接口使用的特定协议,如果不指定课设置为0。

NULL,0。

地址绑定intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen)S标识一个未绑定套接口的描述字,name是一个与指定协议有关的地址结构指针,

sin_family字段必须为AF_INET。

服务器端监听连接intlisten(SOCKETs,intbacklog)S标识一个已绑定了地址,但还未建立套接口,backlog指定了正在等待连接的最大队列长度。

Listen()仅适用于连接的套接口

客户端请求连接intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen)

s指将要建立连接的套接口name是一个指向远端套接口地址结构namelen标识name名字的长度。

服务器端接受连接SOCKETaccept(SOCKETs,structsockaddrFAR*addr,

intFAR*addrlen)s标识一个套接口,处于连接状态,addr存放发送连接请求的客户机的IP地址信息,addrlen客户地址结构的长度。

有链接的数据发送intsend(SOCKETs,constcharFAR*buf,intlen,intflags)

S用于标识已建立连接的套接口,buf字符缓冲区,内有将要发送的数据,len将要发送的缓冲区中的字符数,flags用于控制数据传输方式,它可以是0,MSG_DONTROUTE或MSG_OOB,0表示按正常方式发送数据。

有链接的数据接收intrecv(sockets,charFAR*buf,intlen,intflags)

S标识已建立连接的套接口,buf用于接收数据的缓冲区,len缓冲区长度,flags指定调用方式,flags参数可以是0,MSG_PEEK或MSG_OOB,0表示正常数据。

无连接的数据接收intrecvfrom(SOCKETs,charFAR*buf,intlen,intflags,

structsockaddrFAR*from,intFAR*fromlen)s标识一个套接口,buf接收数据缓冲区,len缓冲区长度,flags调用方式,from指向存有源地址的缓冲区,fromlen指向from缓冲区长度值,

无连接数据发送intsendto(SOCKETs,constcharFAR*buf,intlen,intflags,conststructsockaddrFAR*to,inttolen)s标识套接口,buf待发数据的缓冲区,len指明buf缓冲区中要发送的数据长度,flags调用方式标志位,to指针,指向接收数据的目的套接口的地址,tolen:

to所指地址的长度。

TCP:

服务器

#include#include#include

#defineDEFAULT_PORT5050

#pragmacomment(lib,"WS2_32.lib")

voidmain()

{

intiPort=DEFAULT_PORT;

WSADATAwsaData;

SOCKETsListen,sAccept;

intiLen;

intiSend;

charbuf[]="Iamaserver.";

structsockaddr_inser,cli;

printf("--------------\n");

printf("Serverwaiting\n");

printf("--------------\n");

if(WSAStartup(MAKEWORD(2,2),&wsaData)!

=0)

{

printf("FailedtoloadWinsock.\n");

return;

}

//创建服务器端套接口

sListen=socket(AF_INET,SOCK_STREAM,0);

if(sListen==INVALID_SOCKET)

{

printf("socket()Failed:

%d\n",WSAGetLastError());

return;

}

//一下建立服务器端地址

ser.sin_family=AF_INET;

ser.sin_port=htons(iPort);

ser.sin_addr.s_addr=htonl(INADDR_ANY);

if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR)

{

printf("bind()Failed:

%d\n",WSAGetLastError());

closesocket(sListen);

return;

}

//进入监听状态

if(listen(sListen,5)==SOCKET_ERROR)

{

printf("listen()Falied:

%d\n",WSAGetLastError());

return;

}

//初始化客户端地址长度参数

iLen=sizeof(cli);

//进入一个无限循环,等待客户的链接请求

while

(1)

{

sAccept=accept(sListen,(structsockaddr*)&cli,&iLen);

if(sAccept==INVALID_SOCKET)

{

printf("accept()Failed:

%d\n",WSAGetLastError());

break;

}

//输出客户IP地址和端口号

printf("AcceptedclientIP:

[%s],port:

[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));

//给建立连接的客户端发送信息

iSend=send(sAccept,buf,sizeof(buf),0);

if(iSend==SOCKET_ERROR)

{

printf("send()Failed.:

%d\n",WSAGetLastError());

break;

}

elseif(iSend==0)

break;

else

{

printf("send()byte:

%d\n",iSend);

printf("--------------");

}

closesocket(sAccept);

}

closesocket(sListen);

WSACleanup();

}

TCP客户端

#include"stdafx.h"

#include

#include

#include

#defineDEFAULT_PORT5050

#defineDATA_BUFFER1024

#pragmacomment(lib,"WS2_32.lib")

voidmain(intargc,char*argv[])

{

WSADATAwsaData;

SOCKETsClient;

intiPort=DEFAULT_PORT;

//从服务器端接收的数据长度

intiLen;

//接收数据的缓冲

charbuf[DATA_BUFFER];

//服务器端地址

structsockaddr_inser;

//判断输入的参数是否正确

/*if(argc<2)

{

//提示在命令行中输入服务器IP地址

printf("Usage:

client[serverIPaddress]\n");

return;

}*/

//接收数据的缓冲区初始化

memset(buf,0,sizeof(buf));

if(WSAStartup(MAKEWORD(2,2),&wsaData)!

=0)

{

printf("FailedtoloadWinsock.\n");

return;

}

//填写要连接的服务器地址信息

ser.sin_family=AF_INET;

ser.sin_port=htons(iPort);

ser.sin_addr.s_addr=inet_addr("127.0.0.1");//"127.0.0.1"argv[1]

//建立客户端流式套接口

sClient=socket(AF_INET,SOCK_STREAM,0);

if(sClient==INVALID_SOCKET)

{

printf("socket(0Failed:

%d\n",WSAGetLastError());

return;

}

//请求与服务器端建立TCP连接

if(connect(sClient,(structsockaddr*)&ser,sizeof(ser))==INVALID_SOCKET)

{

printf("connect()Failed:

%d\n",WSAGetLastError());

return;

}

//输入字符

else

{

while

(1)

{

//memset(buf,0,sizeof(buf));

printf("输入字符\n");

cin>>buf;

intiSend=send(sClient,buf,sizeof(buf),0);

if(iSend==SOCKET_ERROR)

{

printf("send(0Failed.:

%d\n",WSAGetLastError());

break;

}

else

{

//从服务器端接收数据

iLen=recv(sClient,buf,sizeof(buf),0);

if(iLen==0)

return;

elseif(iLen==SOCKET_ERROR)

{

printf("recv()Failed:

%d\n",WSAGetLastError());

return;

}

printf("recv()datafromserver:

%s\n",buf);

}

}

}

closesocket(sClient);

WSACleanup();

}

UDP服务器

#include"stdafx.h"

#include

#include

#pragmacomment(lib,"WS2_32.lib")

//服务器端口号为5050

#defineDEFAULT_PORT5050

//接收数据缓冲区长度

#defineBUFFER_LENGTH1024

voidmain()

{

intiPort=DEFAULT_PORT;

WSADATAwsaData;

SOCKETsSocket;

//客户地址长度

intiLen;

//发送的数据长度

intiSend;

//接收数据长度

intiRecv;

//要发送给客户的信息

charsend_buf[]="Hello!

Iamaserver.";

//接收数据的缓冲区

charrecv_buf[BUFFER_LENGTH];

//本地地址和客户地址

structsockaddr_inser,cli;

printf("---------------------------\n");

printf("Serverwaiting\n");

printf("---------------------------\n");

if(WSAStartup(MAKEWORD(2,2),&wsaData)!

=0)

{

printf("FailedtoloadWinsock.\n");

return;

}

//产生服务器端套接口

sSocket=socket(AF_INET,SOCK_DGRAM,0);

if(sSocket==INVALID_SOCKET)

{

printf("socket()Failed:

%d\n",WSAGetLastError());

return;

}

ser.sin_family=AF_INET;

//htons()函数把一个双字节的主机字节顺序数转换为网络字节顺序

ser.sin_port=htons(iPort);

//htonl()函数吧一个主机自己顺序的数转换为网络字节顺序

ser.sin_addr.s_addr=htonl(INADDR_ANY);

if(bind(sSocket,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR)

{

printf("bind()Failed:

%d\n",WSAGetLastError());

return;

}

iLen=sizeof(cli);

//初始化接收缓冲区

memset(recv_buf,0,sizeof(recv_buf));

//进入一个无限循环,进行数据接收和发送

while

(1)

{

//从客户端接收数据

iRecv=recvfrom(sSocket,recv_buf,BUFFER_LENGTH,0,(SOCKADDR*)&cli,&iLen);

if(iRecv==SOCKET_ERROR)

{

printf("recvfrom()Failed.:

%d\n",WSAGetLastError());

break;

}

elseif(iRecv==0)

break;

else

{

//输出接受到的数据

printf("recvfrom():

%s\n",recv_buf);

//输出客户IP地址和端口号

printf("AcceptedclientIP:

[%s],port:

[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));

}

//给客户发送信息

iSend=sendto(sSocket,send_buf,sizeof(send_buf),0,(SOCKADDR*)&cli,sizeof(cli));

if(iSend==SOCKET_ERROR)

{

printf("sendto(0Failed.:

%d\n",WSAGetLastError());

printf("---------------------------\n");

break;

}

elseif(iSend==0)

break;

else

{

printf("sendto()succceeded!

\n");

printf("---------------------------\n");

}

}

closesocket(sSocket);

WS

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 工作计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1