网络编程指南设计-v0.4_第1页
网络编程指南设计-v0.4_第2页
网络编程指南设计-v0.4_第3页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、TCP客户端计算机网络编程1. 简单的TCP程序的建立TCP服务器端图1-1 TCP整体程序示意图TCP/IP通用套接字地址结构 struct sockaddr sa_family_t sa_family; char sa_data14;IPv4特定套接字地址结构struct sockaddr_in sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr;unsigned char sin_zero8; 图1-2套接字地址结构1.1服务器端程序/*相关头文件*/#i nclude <stdio.h>#i

2、 nclude <n eti net/in .h>#i nclude <sys/socket.h>#i nclude <uni std.h>#include <string.h>int sockfd = socket(AFNET,SOCK_STREAM,0); struct sockaddr_i n serveraddr,clie ntaddr; serveraddr.sin_family = AF_INET;serveraddr.s in _port = hton s(1234); serveraddr.sin_addr.s_addr = IN

3、ADDR_ANY; sockle n_t addrle n = sizeof(addr);bin d(sockfd,(struct sockaddr *)&serveraddr,addrle n);/* 被动套接字,两个队列*/liste n(sockfd,5);int sock_id = accept(sockfd,(struct sockaddr *)&clie ntaddr,&addrle n);/*为什么是写sock_id ?已链接的套接字是否可以写sockfd ?监听套接字*/write(sock_id,buf,strle n( buf);Close(sock

4、f_id);1.2客户端程序#i nclude <stdio.h>#i nclude <n eti net/in .h>#i nclude <sys/socket.h>#in clude <arpa/i net.h>#i nclude <uni std.h>int sockfd = socket(AFNET,SOCK_STREAM,0); struct sockaddr_i n addr;addr.sin_family = AF_INET;addr.sin_port = hto ns(1234);in et_pto n(AF_INET

5、,"",&addr.sin_addr);conn ect(sockfd,(struct sockaddr *)&addr,sizeof(addr);char recvBuf100 = 0 ;read(sockfd,recvBuf,sizeof(recvBuf);Close(sockfd);2. 简单的UDP程序的建立服务器端客户端图2-1 UDP程序整体架构2.1服务端程序 int sockfd = socket(AFNET,SOCK_DGRAM,0);struct sockaddr_i n servaddr;servaddr.s in _

6、family = AF_INET;servaddr.s in _port = hton s(1234);servaddr.sin_addr.s_addr = INADDR_ANY;bin d(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr);struct sockaddr_i n cliaddr;sockle n_t clile n = sizeof(cliaddr);recvfrom(sockfd,msg,sizeof(msg),0,(struct sockaddr *)&cliaddr,&clilen);2.2

7、客户端程序 int sockfd = socket(AFNET,SOCK_DGRAM,0);struct sockaddr_i n servaddr;servaddr.s in _family = AF_INET;servaddr.s in _port = hton s(1234);in et_pto n(AF_INET,"",&servaddr.sin_addr);/没有客户端与服务器之分Struct sockaddr_i n myaddr;myaddr.sin_family = AF_INET;Myaddr.sin_port = hto ns(

8、1234);Myaddr.sin_addr.s_addr = INADDR_ANY;Bind(sockfd,(struct sockaddr *)&myaddr,sizeof(myaddr);char *msg = "Hello World"sen dto(sockfd,msg,strle n( msg),0, (struct sockaddr)&servaddr ,sizeof(servaddr);3. 多播程序的建立客户端设置socket加入多播r*i设置socket加入多播Bi nd端口J1r1FRecvfrom 数据LJ数据L;创建socket创建s

9、ocket1 F图3-1多播网络整体架构服务器端3.1服务器端程序 int sockfd = socket(AFNET,SOCK_DGRAM,0); struct sockaddr_i n srv;srv.sin_family = AF_INET;srv.sin_port = ht on s(1234);in et_pto n(AF_INET,"",&srv.sin_addr); struct group_req req;req.gr_i nterface = 0;memcpy(&req.gr_group,&srv,sizeof(s

10、rv);setsockopt(sockfd,IPPROTOP ,MCAST_JOIN_GROUP,&req,sizeof(req); bin d(sockfd,(struct sockaddr* )&srv,sizeof(srv);char buf40 = 0;recvfrom(sockfd,buf,sizeof(buf),0,NULL,0);setsockopt(sockfd,IPPROTOP ,MCAST_LEAVE_GROUP,&req,sizeof(req);3.2客户端程序 int sockfd = socket(AFNET,SOCK_DGRAM,0);str

11、uct sockaddr_i n srv;srv.sin_family = AF_INET;srv.sin_port = ht on s(1234);in et_pto n(AF_INET,"",&srv.sin_addr);struct group_req req;req.gr_i nterface = 0;memcpy(&req.gr_group,&srv,sizeof(srv);setsockopt(sockfd,IPPROTOP ,MCAST_JOIN_GROUP,&req,sizeof(req); int onof

12、f = 1;setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on off,sizeof(o noff);sen dto(sockfd,msg,strle n(msg),O,(struct sockaddr *)&srv,sizeof(srv);setsockopt(sockfd,IPPROTOP ,MCAST_LEAVE_GROUP,&req,sizeof(req);4. 网络编程涉及的函数与宏定义函数int socket(i nt doma in ,i nt type,i nt protocol);PF_UNIX/PF_LOCAL

13、/AF_UNIX/AF_LOCAL UNIX进程通信协议PF_INET/AF_INET Ipv4网络协议PF_INET6/AF_INET6 Ipv6网络协议PF_IPX/AF_IPX IPX-Novell 协议PF_NETLINK/AF_NETLINK 核心用户接口装置参数domainPF_X25/AF_X25 ITU-T X.25/ISO-8208协议PF_AX25/AF_AX25 业余无线 AX.25 协议PF_ATMPVC/AF_ATMPVC 存取原始 ATM PVCsPF_APPLETALK/AF_APPLETALK appletalk(DDP)协议PF_PACKET/AF_PACKE

14、T 初级封包接口SOCK_STREAM 提供双向连续且可信赖的数据流,即TCP。支持OOB机制,在所有数据传送前必须使用connect()来建立连线状态。参数typeSOCK_DGRAM 使用不连续不可信赖的数据包连接SOCK_SEQPACKET提供连续可信赖的数据包连接SOCK_RAW提供原始网络协议存取SOCK_RDM提供可信赖的数据包连接SOCK_PACKET提供和网络驱动程序直接通信。参数 protocol用来指定socket所使用的传输协议编号,通常此参考不用管它,设为0即可功能说明socket用来建立一个新的socket,也就是向系统注册,通知系统建立一个网络通信端口。返回成功则返

15、回socket处理代码,失败返回-1。定义函数int bin d(i nt sockfd,struct sockaddr * my_addr,i nt addrle n);参数 sockfd调用socket返回的sockfdstruct socketaddr_ instruct sockaddr un sig ned short intsa_family_t sa_family;sin_family;参数 my_addruin t16_t sin _port;char sa_data14;struct in _addr sin _addr;un sig ned char sin _zero8;

16、参数 addrlen即 sizeof(my_addr)功能说明绑定网络地址端口给参数sockfd。返回成功则返回0,失败返回-1,错误原因存于 errno中。定义函数int conn ect (i nt sockfd,struct sockaddr * serv_addr,i nt addrle n);参数 sockfd调用socket返回的sockfd参数servstruct socketaddr_ inun sig ned short int sin_family;uin t16_t sin _port;struct in _addr sin _addr;un sig ned char s

17、in _zero8; ;struct sockaddr sa_family_t sa_family; char sa_data14;参数 addrlen即 sizeof(my_addr)功能说明连接设定好的端口和网络地址返回成功则返回0,失败返回-1,错误原因存于 errno中。定义函数int liste n(i nt sockfd,i nt backlog)参数 sockfd调用socket返回的sockfd参数 backlog监听等待队列最大值即backlog 乘以1.5,一般情况设疋为5功能说明监听客户端的连接返回成功则返回0,失败返回-1,错误原因存于 errno中。定义函数int a

18、ccept(i nt socket,struct sockaddr * addr,i nt * addrle n);参数 sockfd调用socket返回的sockfd参数servstruct socketaddr_ inun sig ned short int sin_family;uin t16_t sin _port;struct in _addr sin _addr;un sig ned char sin _zero8; ;struct sockaddr sa_family_t sa_family; char sa_data14;参数 addrlen即 sizeof(my_addr)参

19、数 addrlen功能说明接受来自客户端的连接返回成功则返回0,失败返回-1,错误原因存于 errno中。定义函数int recvfrom(i nt socket,void *buf,i nt len,un sig ned int flags ,struct sockaddr *from ,int *fromle n);参数 sockfd调用socket返回的sockfd参数buf接受数据保存的内存池参数 len接受数据的长度参数 flags参数flags 一般设0 ,其他数值疋义请参考recv()参数 from发送数据的网络地址与端口参数 fromlen网络地址结构体长度功能说明接受来自对端

20、的数据返回成功则返回接收到的字符数,失败则返回-1,错误原因存于 errno中。定义函数int sen dto ( int sockfd , const void * msg, int len, un sig ned int flags, conststruct sockaddr * to , int tole n )参数 sockfd调用socket返回的sockfd参数 msg发送数据保存的内存池参数 len发送数据的长度参数 flags参数flags 一般设0 ,其他数值疋义请参考send()参数to对端数据的网络地址与端口参数 fromlen网络地址结构体长度功能说明发送本段的数据返回

21、成功则返回实际传送出去的字符数,失败返回一1,错误原因存于errno中。定义函数int setsockopt(i nt sockfd,i nt level,i nt opt name,c onst void * optval , socklen_toptlen);参数 sockfd调用socket返回的sockfd参数level代表欲设置的网络层,一般设成SOL_SOCKET以存取socket参数level层。参数opt name 代表欲设置的选项,有下列几种数值:SO_DEBUG打开或关闭排错模式SO_REUSEADDR 允许在bind ()过程中本地地址可重复使用SO_TYPE 返回 so

22、cket 形态。SO_ERROR返回socket已发生的错误原因SO_DONTROUTE 送出的数据包不要利用路由设备来传输。SO_BROADCAST 使用广播方式传送SO_SNDBUF设置送出的暂存区大小SO_RCVBUF设置接收的暂存区大小SO_KEEPALIVE定期确定连线是否已终止。SO OOBINLINE 当接收到OOB数据时会马上送至标准输入设备SO LINGER确保数据安全且可靠的传送出去。参数 optval代表需要设的参数值(太多,没有列举)参数optlen为optval的长度。功能说明用来设置参数sockfd所指疋的socket状态返回成功则返回0,失败返回-1,错误原因存于

23、 errno中。附录:问题列表附录1. socket 意义向内核申请一个网络套接字,类似文件描述符2. 服务端设定端口地址的意义指定对方的端口和 IP 地址。3. 为什么要 bind服务端 TCP 需要监听本地端口,需要标记本地端口和地址给 sockfd ,并在内核 中申请资源。4. 监听服务器端需要监听 sockfd ,将其转换为被动连接的网络套接字, (创建的时候默 认是主动连接的),在监听之际,会维护两个队列,一个已完成连接的队列,一 个未完成连接的队列,当客户端 connect 时,发送一个 SYN 给服务器端,监听 往未完成的队列中添加一项,然后返回一个 ACK 应答,客户端重新返回

24、一个应 答 ACK ,这样连接建立,将该项从未完成移动到已完成队列末尾, accept 函数 只要已完成队列有项就会被唤醒。 listen 第二个参数代表这两个列总长度 / 1.55. accept 两个 sockfd 、 sock_id 关系 一个用来监听本地端口,一个是新创建的虚拟的客户端网路套接字6. 为什么客户端不需要 bind 客户端是主动连接服务器,不需要绑定本地端口和 IP7. 客户端的 sockaddr_in ?代表他需要连接的服务器的地址和端口,并不是自己的8. recvfrom 的 clientaddr 什么意思?这是从对端的端口和IP,不关心客户端是谁连接,可以直接写0

25、,但是服务器端 不保存客户端地址的话,无法回发数据9. 为什么 UDP 服务器端需要 bind 同样的,作为服务器,是需要被动接收数据,所以需要标记自己的端口和 IP 等 给本地 sockfd10. 为什么 UDP 客户端不需要 bind因为他是主动去连接服务器,只要知道服务器的端口和 IP 即可连接,虽然这样 做可以行得通,但是从软件工程的角度, UDP 没有特定的服务器端和客户端, (网络视频莫非也这样不区分?,应该是不需要往回发送数据)11. 什么是多播当任何一个程序加入一个多播组时, 他可以往这个组中发送数据, 也将接受到来 自这个组任何成员的数据 (包括自己往组中发送的数据, 可以关

26、闭)。多播是 UDP 连接12. 多播 bind 的意义只要是加入多播的程序,都是平等的成员,没有所谓特定的服务器端和客户端, 因为都需要接受来自多播组的数据, 也可以往多播组自中发送数据, 所以需绑定 多播地址,以便从多播地址发送和接受数据,所以多播程序都需要 bind 多播地 址,从 UDP 角度来讲,客户端不需要 bind ,但是多播虽然每一个都是客户端, 但是都也会被动接受数据,所以要 bind图1-1 OSI模型1. Network Basic1.1 OSI模型网络基础首先需要知道的就是 OSI模型,这是理论上的INETNET模型应用层:上层应用网络编程接口表示层:关注对等实体间交换

27、数据格式(int16,int32,int64,以及 little endian 禾口 big endian)会话层:提供一个类似命名空间,将 一个应用各部分不同传输流联系 在一起,比如视频流和音频流 传输层:进程到进程的信道(消息, 网关) 网络层:路由选择(分组、路由器) 数据链路层:比特流组成帧(网络适配器、 驱动程序、Hub)物理层:物理通信链路上的原始比特 传输1.2因特网体系结构,TCP、IP模型(沙漏模型)SMTP HTTP RTPcopper fiber radioerniJ WWW phone.TCP UDPether net PPF<XTCP和UDP提供逻辑信 道,从端

28、到端(end to end)特点:1. 没有严格的划分层 次,比较自由2. 沙漏模型,以IP为核 心定义网络中交换分组的 一种共同方法1.3网际协议族OSI模型仅仅只是学术上、理论上的模型,在真正的In ternet应用上,将加權0护应用层、表示层、会话层合并为一层,提供套接字供用户进行编程,传输层提供 TCP、UDP协议族,网络层提供IP供上层使用,数据链路层与物理层即设备与 设备驱动程序。图1-2网际协议族2. TCP协议与TCP编程2.1 TCP协议略解TCP 是可靠的、可流量控制的、排序的、全双工的网络网际协议。 可靠性TCP 当往另一端发送数据时需要对端返回一个确认, 如果在一定时间没有收 到确认, TCP 将会自动重传数据并等待更长时间,直到数次重传失败之后、TCP才选择放弃,一般为 410 分钟。 流量可控TCP还有动态估算客户端与服务器端往返时间(RTT, round-trip time ) 的算法,以便估算等待一个确认需要多长时间 排序TCP会对自己发出的每一个字节关联一个序列号,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论