TCP socket实现C/S应用
软硬件平台:
Pentium(R) 4 CPU 2.80GHz,512MB内存,Windows XP SP2,Winsock 1.1.
程序概要设计:
本程序基于面向连接套接字设计,既作为并发的服务器端,又作为客户端。面向连接套接字的服务进程与客户进程在通信之前必须建立各自的套接字并进行连接,然后才能对相应的套接字进行“读”、“写”操作,实现数据的传输。主要使用的Winsock函数有socket,bind,listen,accept,connect,shutdown和closesocket等,使用的数据传输函数有send和recv.
面向连接套接字的编程模型如下:
面向连接通信程序一般步骤为:
1. 使用套接字之前必须调用WSAStartup,以便程序在调用WSAStartup时,系统找到一个合适的链接库并与它绑定。
2. 应用程序调用socket创建一个新的套接字用来进行网络通信。调用返回一个描述符代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
这个新创建的的套接字。参数可以指定使用的
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
族和服务类型(字节流或数据报)。
3. 应用程序调用bind来指定套接字的本地端点地址。该调用的参数指定套接字描述符和端点地址。服务器调用bind主要用来指定熟知端口等待连接。
4. 面向连接的服务器调用listen把一个套接字设置为被动模式,让它准备连接传入的连接。
5. 服务进程调用函数accept 准备接受来自客户端的连接。客户进程调用connect连接到服务器。 accept为每个新的连接请求创建一个新的套接字,并返回该套接字的描述符给调用者。服务器只为这个新的连接使用套接字,而使用原来的套接字来接收其他的连接请求。一旦接收了一个请求,服务器就使用这个新的套接字来传输数据。使用完之后,服务器关闭该套接字。
6. 服务进程和客户进程通过调用send和recv在TCP连接上发送数据和接收数据。
本程序开始启动服务器,并使之处于准备连接状态。其中服务器的资源为一个格(grid),并把控制界面给客户端,使之与特定的服务器建立连接(被连接端服务器必须已经启动),然后执行put、get操作。客户端与服务器端的传送数据需要一个应用协议,为简单起见,我只对发送的包的数据(包括命令字段)以一个结构(struct)定义。即
struct _gridNodeData{
short cmd;//command
short x;//x
short y;//y
int v;//value
};
cmd作为客户端要对服务器端请求的命令,如get、put等。x,y,v 分别为数据在grid中的位置以及数值。服务器的并发实现是通过多线程,在无连接情况下,主服务器线程从不直接与客户端通信。一旦一个新的连接到来,主线程就创建一个子线程来处理连接。在子线程同客户交互时,主线程等待其他的连接。并且在修改服务器端数据时,应用信号量对线程实行同步。
本程序几点说明:
本程序的功能比较简单,主要是通过控制台来处理客户端的请求,如连接指定服务器、从服务器中断开、put操作(修改指定grid数据值)、get操作(获得指定grid数据值),客户端主动退出。特别说明的是程序中有一个display操作,是对本地服务器端数据进行显示,而不是对指定连接的其他服务器段数据显示。这个操作只作为连接本地时作测试用。
由于时间和自己的能力有限,程序有很明显的bug。如执行put或get操作时,会提示输入数据,当输入数据为字符型时,会出现无限循环操作。所以在输入数据时,要特别小心。但然,我也会抽空对程序进行优化和改进。
程序操作示例:
_1176322012.vsd
�
建立套接字socket()
绑定套接字bind()
阻塞,等待建立连接
�
准备接收连接accept()�
侦听
Listen()
发送/接收数据send()/recv()
�
关闭closesocket()�
建立套接字socket()�
建立连接connect()
发送/接收数据send()/recv()
�
关闭closesocket()�
Winsock服务进程
Winsock客户进程