基于套接字通信的远程截屏显示与控制技术
1 双机Socket网络通信[2]
初始化服务端Socket:在调用Socket前先要初始化,即加载相应版本的DLL,通过调用WSAStartup函数,将加载成功的Socket库版本的相关信息填在LPWSADATA结构中;
WSADATA lpWSAData;
WSAStartup(MAKEWORD(1,1),&lpWSAData);
创建服务端Socket:完成初始化之后,调用socket函数创建一个套接字,返回套接字句柄,在其后通信中始终用来标识套接字,若调用失败则返回INVALID_SOCKET;
SOCKET sktConnect=socket(AF_INET,SOCK_STREAM,0);
绑定服务端地址:在为某种特定协议创建了套接字后,就用bind函数将套接字绑定到一个本机地址,其类型是sockaddr,用于指明套接字绑定地址,包括IP地址与端口号;
bind(sktConnect,(struct sockaddr far *)&sockaddrin,sizeof(sockaddrin));
服务端监听网络:socket利用listen函数设置状态位,用来检测是否有到来的连接请求,然后调用accept函数,准备接收客户端连接信号,无连接请求时,服务进程被阻塞;
listen(sktConnect,1);
sktClient=accept(sktConnect,(struct sockaddr far *)&sockaddrin,& sockaddrlen);
初始化与创建客户端Winsock:首先利用AfxSocketInit函数判断参数lpwsaData是否为空,从而确定是否调用WSAStartup函数来填充WSADATA结构,随后同样调用socket函数创建客户端的套接字,给客户端Sockaddr_in结构赋值,地址类型和端口号与服务端相同;
套接字选项设置:使用setsockopt函数设置套接字选项,比如发送或者接收的超时设置,缓冲区的容量设置,使用ioctlsocket函数设置socket的I/O模式等;
int ret=ioctlsocket(sktClient,FIONBIO,(unsigned long*)&ul);
双方建立连接:客户端调用connect函数向服务端发出连接请求,当连接请求到来时,被阻塞服务端的accept函数生成一个新的字节流套接字,返回客户端Sockaddr_in结构变量,用带有客户端地址的套接字与客户端进行连接,然后向客户端返回接收信号;
connect(sktClient,(const struct sockaddr *)&sockaddrin,sizeof (sockaddrin));
收发数据:一旦客户端套接字接收到来自服务端的接受信号,则表示双方已经实现连接,任何一方均可使用Send/Write函数和Recv/Read函数向对方发送或者接收数据;
send(sktClient,chrSend,10,0);recv(sktClient,chrReceive,10,0);
关闭套接字与winsock注销:服务端和客户端可以通过调用closesocket函数关闭套接字上的所有发送和接收操作,撤销套接字并且中断连接。同时,winsock服务的动态链接库在使用结束后,应用程序必须调用WSACleanup函数将其注销,并释放分配的资源。
Winsock套接字主要工作流程如图1,①~⑩标识网络数据交换顺序。