mfc中的socket应用

 

代码
//-----------------------自动上报数据-------------------   
  int   __stdcall   APIENTRY   K1GetData(long   cbAddress,int   a_localPort)   
  {                   
  sockaddr_in   serveraddr;   
          CallbackHandle   
=   cbAddress;           
  TcpSocket   
=   socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);   //声明用TCP通信   
  if(TcpSocket   ==   INVALID_SOCKET)   
  {   
  WSACleanup();   
  myerror   
=   WSAGetLastError();   
  
return   myerror;   
  }   
  
//----------------获得本地IP-----------------   
  char   hostname[255];   
  myerror   
=   gethostname(hostname,sizeof(hostname));   
  
if(myerror   !=   0)   
  {   
  
return   -2;   
  }   
  hostent
*   myhostent   =   gethostbyname(hostname);   
  
if(myhostent   ==   NULL)   
  {   
  
return   -2;   
  }   
  hostent
&   myhost   =   *myhostent;   
  sockaddr_in   sa;   
  
for(int   ho=0;myhost.h_addr_list[ho];ho++)   
  {   
  memcpy(
&sa.sin_addr.s_addr,myhost.h_addr_list[ho],myhost.h_length);   
  }   
  
//----------------绑订端口-----------------------   
  
//DWORD   l_dwip;   
  
//l_dwip   =   inet_addr(a_localAddr);   
  serveraddr.sin_family   =   AF_INET;   
  
//serveraddr.sin_addr.S_un.S_addr   =   l_dwip;   
  serveraddr.sin_addr   =   sa.sin_addr;   
  serveraddr.sin_port   
=   htons(a_localPort);   
  
if(bind(TcpSocket,(sockaddr   *)&serveraddr,sizeof(serveraddr))   ==   SOCKET_ERROR)   
  {   
  closesocket(TcpSocket);   
  myerror   
=   WSAGetLastError();   
  
return   myerror;   
  }   
  
//-------------开始侦听-------------------------   
  if(listen(TcpSocket,5)   ==   SOCKET_ERROR)   
  {   
  closesocket(TcpSocket);   
  myerror   
=   WSAGetLastError();   
  
return   myerror;   
  }   
  DWORD   dwThreadIdA1;   
    
  hThread   
=   CreateThread(NULL,0,ListenData,NULL,0,&dwThreadIdA1);   
  
return   myerror;   
  }   
    
    
  
//------------------帧听线程----------------------   
  DWORD   __stdcall   WINAPI   ListenData(   LPVOID   lpParam   )   
  {   
  sockaddr_in   clientaddr;   
  HANDLE   ThreadAccept;   
  
//------------接受请求-------------------------   
  int   clientaddr_len   =   sizeof(SOCKADDR);           //选择一种   
    
  DWORD   dwThreadIdA;   
  
//--------------add--------------------------   
  while(clientsocket   =   ::accept(TcpSocket,(sockaddr   *)&clientaddr,&clientaddr_len))   
  {   
  ThreadAccept   
=   CreateThread(NULL,   0,   AcceptData,   NULL,   0,   &dwThreadIdA);   
  CloseHandle(ThreadAccept);   
  }   
  
//------------关闭SOCKET---------------------   
  closesocket(clientsocket);   
  closesocket(TcpSocket);   
  
return   0;   
  }   
    
  
//------------------接收线程----------------------   
  DWORD   __stdcall   WINAPI   AcceptData(   LPVOID   lpParam   )   
  {   
  
char*   get_buf   =   new   char[75];   
    
//   Declare   the   function   pointer,   with   Three   string   argument.   
                    typedef   void   (__stdcall   *FUNCPTR)(BSTR   B_RecordID,BSTR   B_CardID,BSTR   B_KQTime,BSTR   B_PosID);   
                    FUNCPTR   vbFunc;   
                    
//   Point   the   function   pointer   at   the   passed-in   address.     
                    vbFunc   =   (FUNCPTR)CallbackHandle;   
    
  
//-------------接受数据-----------------------   
  
//myerror   =   recv(clientsocket,get_buf,75,0);   
  for(;;)   
  {   
  myerror   
=   recv(clientsocket,get_buf,75,0);   
  
if(myerror   ==   SOCKET_ERROR)     
  {   
  
return   myerror;   
  }   
  
if(myerror<=0)   
  
continue;   
  
else   
  
break;   
  }   
  
//-------------发送数据----------------------   
  char   *   BackBuf   =   new   char[75];   
  
char   *   B_mid   =   new   char[73];   
  
char   *   B_BCC   =   new   char[2];   
  memcpy(B_mid,
"BACK",4);   
  memcpy(B_mid   
+   4,get_buf   +   4,69);   
  GetBCC(B_mid,B_BCC,
73);   
  memcpy(BackBuf,B_mid,
73);   
  
//暂时修改成错误的。memcpy(BackBuf+73,B_BCC,2);   
  memcpy(BackBuf+73,"AA",2);   
    
  send(clientsocket,BackBuf,
75,0);   
  
//if   (BCC1   !=   NULL)   delete[]   BCC1;   
  
//-------------回调函数----------------------   
  char   RecordID[8];   
  
char   CardID[6];   
  
char   KQTime[12];   
  
char   PosID[4];   
  memcpy(RecordID,get_buf   
+   30,8);   
  memcpy(CardID,get_buf   
+   38,6);   
  memcpy(KQTime,get_buf   
+   44,12);   
  memcpy(PosID,get_buf   
+   56,4);   
  CString   CS_RecordID;   
  CString   CS_CardID;   
  CString   CS_KQTime;   
  CString   CS_PosID;   
  
for(int   mm=0;mm<8;mm++)   
  {   
  CS_RecordID   
+=   RecordID[mm];   
  }   
  
for(int   j=0;j<6;j++)   
  {   
  CS_CardID   
+=   CardID[j];   
  }   
  
for(int   i=0;i<12;i++)   
  {   
  CS_KQTime   
+=   KQTime[i];   
  }   
  
for(int   m=0;m<4;m++)   
  {   
  CS_PosID   
+=   PosID[m];   
  }   
  vbFunc(CS_RecordID.AllocSysString(),CS_CardID.AllocSysString(),CS_KQTime.AllocSysString(),CS_PosID.AllocSysString());   
  
return   0;   
  }   
    
  
//-----------------结束线程(关闭帧听)--------------------   
  int   __stdcall   APIENTRY   K1CloseAUTO()     
  {   
  myerror   
=   closesocket(clientsocket);   
  myerror   
=   CloseHandle(hThread);   
  myerror   
=   closesocket(TcpSocket);   
  
return   myerror;   
  
//ExitThread();   
  } 

 

 

posted @ 2010-07-01 11:25  风叙  阅读(221)  评论(0)    收藏  举报