tcp通信程序设计

上传人:第*** 文档编号:32698400 上传时间:2018-02-12 格式:DOCX 页数:19 大小:243.57KB
返回 下载 相关 举报
tcp通信程序设计_第1页
第1页 / 共19页
tcp通信程序设计_第2页
第2页 / 共19页
tcp通信程序设计_第3页
第3页 / 共19页
tcp通信程序设计_第4页
第4页 / 共19页
tcp通信程序设计_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《tcp通信程序设计》由会员分享,可在线阅读,更多相关《tcp通信程序设计(19页珍藏版)》请在金锄头文库上搜索。

1、1/19TCP/IP 通信程序设计1、实验目的初步掌握 C 语言 TCP/IP 通信程序的设计。2、实验环境1、Windows 2000/NT/XP 操作系统。2、TCP/IP 协议。3、编程工具:Microsoft Visual C+ 2005。3、相关知识3.1 TCP/IP 协议族表 1 TCP/IP 协议族应用层(FTP, DNS, HTTP, TELNET, SMTP 等)TCP UDPICMP IGMPIPARP RARP网络接口层TCP 具有以下特点:1、面向连接 。端到端的 TCP 连接会关注连接的状态,而网络的中间路由器只关心 IP 分组的转发。2、可靠数据传递 。TCP 使

2、用顺序号、采用直接应答方式,并在必要时通过重传来保证发自源端的数据能成功地被传递到目的地。3、流量控制 。接收方向发送方发送一个接收窗口值,告诉发送方接收方能够处理多少数据。在收到接收方发来的应答前,TCP 发送方最多只能发送等于该窗口值的数据量。4、拥塞控制 。用于防止 TCP 发送方发送的信息量超过网络中链路或路由器的最大处理能力。流量控制和拥塞控制结合起来,使得 TCP 主机能迅速而公平地调整其发送速2/19率,以达到与网络及接收方的处理能力相匹配。3.2 端口与 Socket在进程通信的意义上,网络通信的最终地址不仅网络层提供的 IP 地址,还应包括描述进程的协议端口(protocol

3、 port) 。若没有端口,传输层就无法知道数据应当交付给应用层的哪个进程。因此,端口标示了应用层的进程。TCP 和 UDP 分别提供了 216 个不同的端口值。端口分为两类:1、周知端口(well-know port) ,其值为 0-1023,由 ICANN 负责分配(见RFC 1700) 。其中 TCP 和 UDP 均规定小于 256 的端口作为保留端口。2、临时端口,也称本地分配。进程需要访问传输服务时,向本地操作系统提出动态申请,操作系统返回一个本地唯一的端口号,进程通过合适的系统调用将自己和相应的端口号联系起来。Socket 由 4BSD UNIX 首先提出,目的是解决网络通信问题。

4、Socket 的英文原义是“插座” ,Socket 与电话交换机的插座非常类似,进程通信前,双方各创建一个端点,每一个 Socket 有一个本地唯一的 Socket 号,由操作系统分配。Socket 与IP 地址、 IP 地址的关系如图 1 所示。2 0 2 . 1 1 4 . 2 2 . 9 8 0 8 02 0 2 . 1 1 4 . 2 2 . 9 8 0 8 0I P 地址 端口号S o c k e t图 1 Socket 与 IP 地址、端口号由于 TCP 面向连接的特性,如果多台主机或一台主机的多个进程连接同一台服务器,则必须创建多个连接,如图 2 所示。3/191 1 2 . 1

5、 1 3 . 1 1 1 . 1 61 1 2 . 1 1 3 . 1 1 1 . 1 6端口8 0 8 0端口8 0 8 4端口8 0 8 02 0 2 . 1 1 3 . 1 2 1 . 1 6 8端口8 0 8 0连接1连接2连接3图 2 与同一台主机建立三个连接TCP/IP 标准指定了一个概念层接口,包含了一系列过程和函数。标准建议了每个过程和函数所需要的参数及其所执行操作的语义,但没有进一步指定数据表示的细节。详细的接口通常由操作系统来定义,只要完成 TCP/IP 标准中的功能,可以有不同的细节选择。这样,不同的操作系统的应用程序编程接口是各不相同的。例如,广泛使用的 Berkele

6、y Software Distribution UNIX 的 Socket 接口、Windows的接口定义 Winsock、System V 的接口定义 TLI 接口等。3.3 Socket 的操作方式Socket 有两种主要的操作方式:面向连接和面向无连接。面向连接的 BSD UNIX Socket 的工作流程如图 3 所示,而面向无连接的 BSD UNIX Socket 的工作流程如图 4 所示。到底用哪种模式是由应用程序的需要决定的。如果要求可靠性,用面向连接的操作就会好一些。对于面向无连接的 C/S 模式,Socket 不需要连接目的地的Socket, 它只是简单地投出数据报。无连接的

7、操作简单高效,但数据的安全性不佳。4/19s o c k e t ( )b i n d ( )l i s t e n ( )a c c e p t ( )r e a d ( )w r i t e ( )c l o s e ( )s o c k e t ( )c o n n e c t ( )w r i t e ( )r e a d ( )c l o s e ( )服务器客户机建立连接请求数据应答数据阻塞 , 等待客户连接请求处理请求图 3 面向连接的 C/S 时序图s o c k e t ( )b i n d ( )l i s t e n ( )r e a d ( )w r i t e ( )

8、s o c k e t ( )c o n n e c t ( )w r i t e ( )r e a d ( )服务器客户机建立连接请求数据应答数据阻塞 , 等待客户连接请求处理请求c l o s e ( ) c l o s e ( )图 4 面向无连接的 C/S 时序图5/194、 TCP 通信程序设计4.1 编程要点由于 TCP 协议要求服务器和客户端建立连接,所以服务器需要通过 Listen 方法监听客户端的请求。当客户端发出连接请求后,服务器在 ConnectionRequest 事件中调用 Accept 方法接受请求,从而与客户端建立连接。只有双方建立连接后,才能进行数据的收发。如果

9、在通信过程中任一方断开连接,则通信过程终止。4.2 客户端程序客户端程序遵循以下步骤:1)建立客户端 Socket 连接。2)得到 Socket 读和写的流。3)操作流。4)关闭流。5)关闭 Socket。客户端的源程序代码如下:/ Module Name: Client.c/ Description:/ This sample is the echo client. It connects to the TCP server,/ sends data, and reads data back from the server. / Compile:/ cl -o Client Client.c

10、 ws2_32.lib/ Command Line Options:/ client -p:x -s:IP -n:x -o/ -p:x Remote port to send to/ -s:IP Servers IP address or hostname/ -n:x Number of times to send message/ -o Send messages only; dont receive/ #include 6/19#include #include #pragma comment(lib,ws2_32)#define DEFAULT_COUNT 20#define DEFAU

11、LT_PORT 5150#define DEFAULT_BUFFER 2048#define DEFAULT_MESSAGE This is a test of the emergency broadcasting systemchar szServer128, / Server to connect toszMessage1024; / Message to send to severint iPort = DEFAULT_PORT; / Port on server to connect toDWORD dwCount = DEFAULT_COUNT; / Number of times

12、to send messageBOOL bSendOnly = FALSE; / Send data only; dont receive/ Function: usage:/ Description:/ Print usage information and exit/void usage()printf(usage: client -p:x -s:IP -n:x -onn);printf( -p:x Remote port to send ton);printf( -s:IP Servers IP address or hostnamen);printf( -n:x Number of t

13、imes to send messagen);printf( -o Send messages only; dont receiven);ExitProcess(1);/ Function: ValidateArgs/ Description:/ Parse the command line arguments, and set some global flags / to indicate what actions to perform/void ValidateArgs(int argc, char *argv)7/19int i;for(i = 1; i 3)iPort = atoi(b

14、reak;case s: / Serverif (strlen(argvi) 3)strcpy(szServer, break;case n: / Number of times to send messageif (strlen(argvi) 3)dwCount = atol(break;case o: / Only send message; dont receivebSendOnly = TRUE;break;default:usage();break;/ / Function: main/ Description:/ Main thread of execution. Initiali

15、ze Winsock, parse the / command line arguments, create a socket, connect to the / server, and then send and receive data./int main(int argc, char *argv)WSADATA wsd;8/19SOCKET sClient;char szBufferDEFAULT_BUFFER;int ret,i;struct sockaddr_in server;struct hostent *host = NULL;/ Parse the command line and load Winsock/ValidateArgs(argc,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号