TCP通信程序的设计说明书_第1页
TCP通信程序的设计说明书_第2页
TCP通信程序的设计说明书_第3页
TCP通信程序的设计说明书_第4页
TCP通信程序的设计说明书_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、TCP/IP通信程序设计1、实验目的初步掌握C语言TCP/IP通信程序的设计。2、实验环境1、Windows 2000/NT/XP 操作系统。2、TCP/IP 协议。3、编程工具:Microsoft Visual C+ 2005。3、相关知识TCP/IP协议族表1 TCP/IP协议族TCP具有以下特点:1、面向连接。端到端的TCP连接会关注连接的状态,而网络的中间路由器只关 心IP分组的转发。2、可靠数据传递。TCP使用顺序号、采用直接应答方式,并在必要时通过重传 来保证发自源端的数据能成功地被传递到目的地。3、流量控制。接收方向发送方发送一个接收窗口值,告诉发送方接收方能够处 理多少数据。在

2、收到接收方发来的应答前,TCP发送方最多只能发送等于该窗口值的 数据量。4、拥塞控制。用于防止TCP发送方发送的信息量超过网络中链路或路由器的最 大处理能力。流量控制和拥塞控制结合起来,使得TCP主机能迅速而公平地调整其发送速率, 以达到与网络及接收方的处理能力相匹配。端口与 Socket在进程通信的意义上,网络通信的最终地址不仅网络层提供的 IP 地址,还应包 括描述进程的协议端口 protocol port。若没有端口,传输层就无法知道数据应当 交付给应用层的哪个进程。因此,端口标示了应用层的进程。TCP和UDP分别提供了 216个不同的端口值。端口分为两类:1、周知端口well-know

3、 port,其值为 0T023,由 ICANN 负责分配见 RFC 1700。 其中TCP和UDP均规定小于256的端口作为保留端口。2、临时端口,也称本地分配。进程需要访问传输服务时,向本地操作系统提出动 态申请,操作系统返回一个本地唯一的端口号,进程通过合适的系统调用将自己和相 应的端口号联系起来。Socket由4BSD UNIX首先提出,目的是解决网络通信问题。Socket的英文原义 是插座Socket与电话交换机的插座非常类似,进程通信前,双方各创建一个端点, 每一个Socket有一个本地唯一的Socket号,由操作系统分配。Socket与IP地址、 IP地址的关系如图1所示。图1 S

4、ocket与IP地址、端口号由于 TCP 面向连接的特性,如果多台主机或一台主机的多个进程连接同一台服 务器,则必须创建多个连接,如图2所示。图2 与同一台主机建立三个连接TCP/IP 标准指定了一个概念层接口,包含了一系列过程和函数。标准建议了每 个过程和函数所需要的参数及其所执行操作的语义,但没有进一步指定数据表示的 细节。详细的接口通常由操作系统来定义,只要完成TCP/IP标准中的功能,可以有不 同的细节选择。这样,不同的操作系统的应用程序编程接口是各不相同的。例如,广 泛使用的 Berkeley Software Distribution UNIX的 Socket 接口、Windows

5、 的接口 定义Win sock、System V的接口定义TLI接口等。Socket的操作方式Socket有两种主要的操作方式:面向连接和面向无连接。面向连接的BSD UNIX Socket的工作流程如图3所示,而面向无连接的BSD UNIX Socket的工作流程如图4 所示。到底用哪种模式是由应用程序的需要决定的。如果要求可靠性,用面向连接的操 作就会好一些。对于面向无连接的C/S模式Socket不需要连接目的地的Socket,它 只是简单地投出数据报。无连接的操作简单高效,但数据的安全性不佳。图3面向连接的C/S时序图图4面向无连接的C/S时序图4、TCP通信程序设计编程要点由于TCP协

6、议要求服务器和客户端建立连接,所以服务器需要通过Listen方法 监听客户端的请求。当客户端发出连接请求后,服务器在ConnectionRequest事件中 调用Accept方法接受请求,从而与客户端建立连接。只有双方建立连接后,才能进行数据的收发。如果在通信过程中任一方断开连接, 则通信过程终止。客户端程序客户端程序遵循以下步骤:1建立客户端Socket连接。2得到Socket读和写的流。3操作流。4关闭流。5 关闭 Socketo客户端的源程序代码如下:/ Module Name: Client.c/ Description:/ This sample is the echo client

7、. It connects to the TCP server, / sends data, and reads data back from the server./ Compile:/ cl -o Client Client.c ws2_32.lib/ Command Line Options:/ client -p:x-s:IP -n:x -o/ -p:xRemote port to send to/ -s:IPServers IP address or hostname/ -n:xNumber of times to send message/ -oSend messages only

8、; dont receive/#include #include #include #pragma comment#define DEFAULT_COUNT 20#define DEFAULT_PORT 5150#define DEFAULT_BUFFER 2048#define DEFAULT_MESSAGEThis is a test of the emergency #define DEFAULT_MESSAGEbroadcasting system/ / Server to connect to / Message to send to severchar szServer128, s

9、zMessage1024;int iPort = DEFAULT_PORT; DWORD dwCount = DEFAULT_COUNT; BOOL bSendOnly = FALSE;/ Port on server to connect to/ Number of times to send message/ Send data only; dont receive/ Function: usage:/ Description:/ Print usage information and exit/void usageprintf;printf -p:xprintf -s:IP printf

10、-n:xprintf-oprintf -p:xprintf -s:IP printf-n:xprintf; Number of times to send messagen; Send messages only; dont receiven;ExitProcess; / / Function: ValidateArgs / / Description:/Parse the command line arguments, and set some global flags/ to indicate what actions to perform / void ValidateArgs i;in

11、ti;fori = 1; i if | switch tolowercase p: / Remote portif strlen 3iPort = atoi;break;case s: / Serverif strlen 3strcpy;break;case n: / Number of times to send messageif strlen 3dwCount = atol;break;case o: / Only send message; dont receive bSendOnly = TRUE;break;default:usage;break;/ Function: main/

12、 Description:/ Main thread of execution. Initialize Winsock, parse the/ command line arguments, create a socket, connect to the/ server, and then send and receive data./int mainWSADATAwsd;SOCKETsClient;charszBufferDEFAULT_BUFFER;intret,i;struct sockaddr_in server;struct hostent *host = NULL;/ Parse

13、the command line and load Winsock/ValidateArgs;if WSAStartupMAKEWORD, &wsd != 0printf;return 1;strcpy;/ Create the socket, and attempt to connect to the server /sClient = socket;if printfsocket failed: %dn, WSAGetLastError; return 1;server.sin_family = AF_INET; server.sin_port = htons;server.sin_add

14、r.s_addr = inet_addr;/ If the supplied server address wasnt in the form/ aaa.bbb.ccc.ddd its a hostname, so try to resolve it /if host = gethostbyname;if printf; return 1;CopyMemoryh_addr_list0, host-h_length;if connectsClient, &server, sizeof = SOCKET_ERRORprintfconnect failed: %dn, WSAGetLastError

15、; return 1;/ Send and receive data/fori = 0; i ret = sendsClient, szMessage, strlen, 0;if break;else if printfsend failed: %dn, WSAGetLastError; break;printf;if ret = recv;if / Graceful closebreak;else if printfrecv failed: %dn, WSAGetLastError; break;szBufferret = 0;printf;closesocket;WSACleanup;re

16、turn 0;下面解释与TCP套接字编程相关的内容。1、加载Win sock库WSAStartupMAKEWORD, &wsd;其中,第一个参数是Win sock的版本2.2,第二个参数接受返回的库版本信息。2、创建套接字socket;该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,UNIX系统支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而D0S、WIND0WS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。参数type描述要建立的套接字的类 型。参数protocol说明该套接字使用的特定协议,如果调用者不希望特别指定使用

17、 的协议,则置为0,使用默认的连接模式。根据这三个参数建立一个套接字,并将相应 的资源分配给它,同时返回一个整型套接字号。因此socket系统调用实际上指定 了相关五元组中的协议这一元。3、建立套接字连接connect用于建立连接。无连接的套接字进程也可以调用connect,但这时 在进程之间没有实际的报文交换,调用将从本地操作系统直接返回。这样做的优点是 程序员不必为每一数据指定目的地址,而且如果收到的一个数据报,其目的端口未与 任何套接字建立连接,便能判断该端口不可操作。conn ect 的调用格式如下:connect;参数s是欲建立连接的本地套接字描述符。参数name指出说明对方套接字地

18、址 结构的指针。对方套接字地址长度由namelen说明。如果没有错误发生,connect返回0。否则返回SOCKET_ERROR。在面向连接的 协议中,该调用导致本地系统和外部系统之间连接实际建立。由于地址族总被包含在套接字地址结构的前两个字节中,并通过socket调用 与某个协议族相关。因此bind和connect无须协议作为参数。4、数据传输-send与recv当一个连接建立以后,就可以传输数据了。常用的系统调用有send和recvo send调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据, 格式如下:send;参数s为已连接的本地套接字描述符obuf指向存有发送数据的缓冲区

19、的指针, 其长度由len指定。flags指定传输扌空制方式,如是否发送带外数据等。如果没有 错误发生,send返回总共发送的字节数。否则它返回SOCKET_ERRORorecv调用用于在参数s指定的已连接的数据报或流套接字上接收输入数据, 格式如下:recv;参数s为已连接的套接字描述符obuf指向接收输入数据缓冲区的指针,其长度 由len指定。flags指定传输扌空制方式,如是否接收带外数据等。如果没有错误发 生,recv 返回总共接收的字节数。如果连接被关闭,返回0。否则它返回 SOCKET_ERRORo5、关闭套接字-closesocketOclosesocket关闭套接字s,并释放分配

20、给该套接字的资源;如果s涉及一个 打开的TCP连接,则该连接被释放。closesocket的调用格式如下:closesocket;参数s待关闭的套接字描述符。如果没有错误发生,closesocket返回0。否 则返回值 S0CKET_ERR0R。服务器端程序服务器端程序遵循以下基本步骤:1建立一个服务器Socket并开始监听。2使用accept取得新的连接。3建立输入和输出流。4在已有的协议上产生会话。5关闭客户端流和Socketo6关闭服务器Socketo 服务器的处理过程是并发的,它为每个客户请求分配一个线程,而不是来一个处 理一个。所以看起来它在同时处理多个请求。服务器端的源程序代码如下

21、:/ Module Name: Server.c/ Description:/ This example illustrates a simple TCP server that accepts/ incoming client connections. 0nce a client connection is/ established, a thread is spawned to read data from the/ client and echo it back ./ Compile:/ cl -o Server Server.c ws2_32.lib/ Command line opt

22、ions:/server -p:x -i:IP -o/-p:xPort number to listen on/-i:strInterface to listen on/-oReceive only, dont echo the data back/#include #include #include #pragma comment#define DEFAULT_PORT5150#define DEFAULT_BUFFER4096int iPort = DEFAULT_PORT; / Port to listen for clients on BOOL bInterface = FALSE,

23、/ Listen on the specified interface bRecvOnly = FALSE;/ Receive data only; dont echo backchar szAddress128;/ Interface to listen for clients on/ Function: usage/ Description:/ Print usage information and exit/void usage printf;printf -p:x printf-i:strprintf-oprintf -p:x printf-i:strprintf-oExitProce

24、ss;/ Function: ValidateArgs/ Description:/ Parse the command line arguments, and set some global flags/ to indicate what actions to perform/void ValidateArgsint i;fori = 1; i if | switch tolowercase p:iPort = atoi;break;case i:bInterface = TRUE;if strlen 3strcpy;break;case o:bRecvOnly = TRUE;break;d

25、efault:usage;break;/ Function: ClientThread/ Description:/This function is called as a thread, and it handles a given/client connection. The parameter passed in is the socket/ handle returned from an accept call. This function reads / data from the client and writes it back./DWORD WINAPI ClientThrea

26、dSOCKET sock=lpParam; charszBuffDEFAULT_BUFFER;intret,nLeft, idx;while/ Perform a blocking recv call/ret = recv;if / Graceful close break;else if printfrecv failed: %dn, WSAGetLastError; break;szBuffret = 0; printf;/ If we selected to echo the data back, do it/if nLeft = ret; idx = 0;/ Make sure we

27、write all the data/ while 0ret = send; if break;else if printfsend failed: %dn, WSAGetLastError;break;nLeft -= ret; idx += ret;return 0;/ Function: main/ Description:/ Main thread of execution. Initialize Winsock, parse the/command line arguments, create the listening socket, bind/to the local addre

28、ss, and wait for client connections./int mainWSADATAwsd;SOCKETsListen,sClient;intiAddrSize;HANDLEhThread;DWORDdwThreadId;struct sockaddr_in local,client;ValidateArgs;if WSAStartupMAKEWORD, &wsd != 0 printf;return 1;/ Create our listening socket/sListen = socket; if printfsocket failed: %dn, WSAGetLa

29、stError; return 1;/ Select the local interface and bind to it/if local.sin_addr.s_addr = inet_addr; if usage; elselocal.sin_addr.s_addr = htonl; local.sin_family = AF_INET; local.sin_port = htons;if bindsListen, &local, sizeof = SOCKET_ERRORprintfbind failed: %dn, WSAGetLastError; return 1;listen;/

30、In a continous loop, wait for incoming clients. Once one/ is detected, create a thread and pass the handle off to it./while iAddrSize = sizeof;sClient = acceptsListen, &client,&iAddrSize;if printfaccept failed: %dn, WSAGetLastError;break;printfAccepted client: %s:%dn,inet_ntoa, ntohs;hThread = Creat

31、eThreadNULL, 0, ClientThread,sClient, 0, &dwThreadId;if printfCreateThread failed: %dn, GetLastError; break;CloseHandle;closesocket;WSACleanup;return 0;与客户端程序相比,服务器端在以下几个方面存在差异。1、指定本地地址bind当一个套接字用socket创建后,存在一个名字空间地址族,但它没有被命 名。bind将套接字地址包括本地主机地址和本地端口地址与所创建的套接字号 联系起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:bind;参

32、数s是由socket调用返回的并且未作连接的套接字描述符套接字号。参 数name是赋给套接字s的本地地址名字,其长度可变,结构随通信域的不同而不 同。namelen表明了 name的长度。如果没有错误发生,bind返回0。否则返回值S0CKET_ERR0R。 地址在建立套接字通信过程中起着重要作用,作为一个网络应用程序设计者对 套接字地址结构必须有明确认识。例如,UNIX BSD有一组描述套接字地址的数据结 构,其中使用TCP/IP协议的地址结构为:struct sockaddr_inshort sin_family; /*AF_INET*/u_short sin_port; /*16位端口号,网络字节顺序*/struct in_addr sin_addr; /*32位 IP 地址,网络字节顺序*/char sin_zero8; /*保留*/2、监听连接 - listen此调用用于面向连接服务器,表明它愿意接收连接。丨isten需在accept之 前调用,其调用格式如下:listen;参数s标识一个本地已建立、尚未连接的套接字号,服务器愿意从它

温馨提示

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

最新文档

评论

0/150

提交评论