VC实现服务端和多客户端同步、超时处理实例
2011-07-10 17:12
531 查看
近期筹划用户主机审记策略上传项目,要解决多客户端上传信息服务器拥塞问题。如下为传输数据时的功能测试#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"mswsock.lib")
#define MEMSIZE_STR 1024
char * sendBuf = (char *)malloc(MEMSIZE_STR); //发送缓存
char * recvBuf = (char *)malloc(MEMSIZE_STR); //接收缓存
SOCKADDR_IN addrClient;
SOCKADDR_IN addSrv;
void Setioctlsocket(SOCKET s) //设置非阻塞模式
{
unsigned long flag=1;
ioctlsocket(s,FIONBIO,(unsigned long*)&flag);
}
bool Getioctlsocket(SOCKET s) //检测结果,设置阻塞模式
{
bool TheFlag=false;
struct timeval timeout;
fd_set sets;
FD_ZERO(&sets);
FD_SET(s,&sets);
timeout.tv_sec=10; //超时10秒
timeout.tv_usec=0;
int result=select(0,0,&sets,0,&timeout);
if(result<=0)
TheFlag=false;
else
TheFlag=true;
unsigned long flag=0;
ioctlsocket(s,FIONBIO,(unsigned long*)&flag);
return TheFlag;
}
DWORD WINAPI AnswerThread(LPVOID lparam) //服务端事务处理线程
{
SOCKET sockConn=(SOCKET)(LPVOID)lparam;
//这里定义需要执行的操作:接受了客户端操作即可开始操作
send(sockConn,sendBuf,MEMSIZE_STR+1,0);
recv(sockConn,recvBuf,MEMSIZE_STR+1,0);
printf("client %s send:%s \n",inet_ntoa(addrClient.sin_addr),recvBuf);
closesocket(sockConn);
return 0;
}
void StrSendModle(bool flag,char * SendStr,char * serverIP,int ServerPort)
{
sprintf(sendBuf,"%s",SendStr);
WSADATA wsadata;
if (WSAStartup( MAKEWORD(1,1) ,&wsadata)!=0) return
4000
;
if(flag)//标识服务端
{
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addSrv.sin_family=AF_INET;
addSrv.sin_port=htons(ServerPort);
bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
int addrClientlen=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&addrClientlen);
DWORD dwThreadId;
HANDLE hThread=CreateThread(NULL,NULL, AnswerThread, (LPVOID)sockConn,0,&dwThreadId); //接收到任务,创建新线程,注意函数类型
CloseHandle(hThread);
}
}
else//标识客户端
{
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
Setioctlsocket(sockClient);
addSrv.sin_addr.S_un.S_addr=inet_addr(serverIP);
addSrv.sin_family=AF_INET;
addSrv.sin_port=htons(ServerPort);
connect(sockClient,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));//非阻塞模式不再等待,让给select处理
if(Getioctlsocket(sockClient)) //连接服务器正常就执行操作,否则返回超时消息
{
send(sockClient,sendBuf,MEMSIZE_STR+1,0);
recv(sockClient,recvBuf,MEMSIZE_STR+1,0);
printf("server send:%s\n",recvBuf);
}
else
printf("连接超时\n");
closesocket(sockClient);
}
free(recvBuf);
free(sendBuf);
WSACleanup();
}
char * serSTr="server ok";
char * clientSTr="client ok";
//服务端调用
StrSendModle(true,serSTr,NULL,6000);
//客户端调用
StrSendModle(false,clientSTr,"127.0.0.1",6000);
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"mswsock.lib")
#define MEMSIZE_STR 1024
char * sendBuf = (char *)malloc(MEMSIZE_STR); //发送缓存
char * recvBuf = (char *)malloc(MEMSIZE_STR); //接收缓存
SOCKADDR_IN addrClient;
SOCKADDR_IN addSrv;
void Setioctlsocket(SOCKET s) //设置非阻塞模式
{
unsigned long flag=1;
ioctlsocket(s,FIONBIO,(unsigned long*)&flag);
}
bool Getioctlsocket(SOCKET s) //检测结果,设置阻塞模式
{
bool TheFlag=false;
struct timeval timeout;
fd_set sets;
FD_ZERO(&sets);
FD_SET(s,&sets);
timeout.tv_sec=10; //超时10秒
timeout.tv_usec=0;
int result=select(0,0,&sets,0,&timeout);
if(result<=0)
TheFlag=false;
else
TheFlag=true;
unsigned long flag=0;
ioctlsocket(s,FIONBIO,(unsigned long*)&flag);
return TheFlag;
}
DWORD WINAPI AnswerThread(LPVOID lparam) //服务端事务处理线程
{
SOCKET sockConn=(SOCKET)(LPVOID)lparam;
//这里定义需要执行的操作:接受了客户端操作即可开始操作
send(sockConn,sendBuf,MEMSIZE_STR+1,0);
recv(sockConn,recvBuf,MEMSIZE_STR+1,0);
printf("client %s send:%s \n",inet_ntoa(addrClient.sin_addr),recvBuf);
closesocket(sockConn);
return 0;
}
void StrSendModle(bool flag,char * SendStr,char * serverIP,int ServerPort)
{
sprintf(sendBuf,"%s",SendStr);
WSADATA wsadata;
if (WSAStartup( MAKEWORD(1,1) ,&wsadata)!=0) return
4000
;
if(flag)//标识服务端
{
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addSrv.sin_family=AF_INET;
addSrv.sin_port=htons(ServerPort);
bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
int addrClientlen=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&addrClientlen);
DWORD dwThreadId;
HANDLE hThread=CreateThread(NULL,NULL, AnswerThread, (LPVOID)sockConn,0,&dwThreadId); //接收到任务,创建新线程,注意函数类型
CloseHandle(hThread);
}
}
else//标识客户端
{
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
Setioctlsocket(sockClient);
addSrv.sin_addr.S_un.S_addr=inet_addr(serverIP);
addSrv.sin_family=AF_INET;
addSrv.sin_port=htons(ServerPort);
connect(sockClient,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));//非阻塞模式不再等待,让给select处理
if(Getioctlsocket(sockClient)) //连接服务器正常就执行操作,否则返回超时消息
{
send(sockClient,sendBuf,MEMSIZE_STR+1,0);
recv(sockClient,recvBuf,MEMSIZE_STR+1,0);
printf("server send:%s\n",recvBuf);
}
else
printf("连接超时\n");
closesocket(sockClient);
}
free(recvBuf);
free(sendBuf);
WSACleanup();
}
char * serSTr="server ok";
char * clientSTr="client ok";
//服务端调用
StrSendModle(true,serSTr,NULL,6000);
//客户端调用
StrSendModle(false,clientSTr,"127.0.0.1",6000);
相关文章推荐
- Mina框架使用---Android客户端的实现,断线重连,粘包处理(服务端非mina)
- 自己封装的Socket组件,实现服务端多进程共享Socket对象,协同处理客户端请求
- 支持异步同步的分布式CommandBus MSMQ实现 - 支持Session传递、多实例处理
- VC++MFC下实现SOAP服务端和SOAP客户端
- CentOS 6.3 Rsync服务端与Debian 6.0.5 Rsync客户端实现数据同步
- Ubuntu Server Rsync服务端与Windows cwRsync客户端实现数据同步配置教程
- Python警察与小偷的实现之一客户端与服务端通信实例
- zookeeper源码阅读分析笔记--客户端服务端通信机制以及session超时、过期处理
- java客户端与服务端同步实例
- Dubbo consumer端接收服务端返回结果异步转同步机制及超时处理
- CentOS Rsync服务端与Windows cwRsync客户端实现数据同步
- C语言实现服务端和客户端进行TCP通信实例
- java udp网络编程及实例代码,实现客户端和服务端通信
- Win2003下cwRsyncServer服务端与cwRsync客户端数据同步实例教程
- Socket通信完整实例(心跳包,客户端断线重连,服务端超时断开客户端连接)
- C/S结构中如何实现服务端与客户端的同步,实现动态刷新
- TCP实现ECHO程序(服务端同时处理多个客户端的响应)
- vc++/mfc socket网络通信多客户端和服务端安全问题,服务端只处理授权客户端
- Java Websocket实例【服务端与客户端实现全双工通讯】
- 使用VC++实现 客户端和服务端通信 获取本机IP地址