您的位置:首页 > 其它

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐