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();
}
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();
}


浙公网安备 33010602011771号