- 论坛徽章:
- 0
|
头文件:
// NetClient.h: interface for the CNetClient class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_NETCLIENT_H__9B200D98_2A83_4465_BB6E_66B32EA8E2F6__INCLUDED_)
#define AFX_NETCLIENT_H__9B200D98_2A83_4465_BB6E_66B32EA8E2F6__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#define WM_READDATA WM_USER+1001
const int MAX_RECEIVE_LEN = 5120;
const int NORMAL_RECEIVE_LEN = 512;
const int SEND_LEN = 512;
const int ERR_LEN = 256;
class CNetClient
{
public:
//CNetClient( char *servip, int servport, int itimeout );
CNetClient( CString servip, int servport, long itimeout );
virtual ~CNetClient();
inline void SethWnd( HWND hwnd )
{
m_hWnd = hwnd;
}
bool InitNetClient();
bool ConnectToServer();
bool SendDataToServer( char* data, int len );
char* GetLastError();
static DWORD WINAPI ThreadToRead( LPVOID n );
static DWORD WINAPI ThreadToSend( LPVOID n );
void SetSendData( CString data );
char* GetRcvData();
//char getData[MAX_RECEIVE_LEN];
private:
char servIp[16];
//CString servIp;
int servPort;
char szError[ERR_LEN];
char getData[MAX_RECEIVE_LEN];
char sendData[SEND_LEN];
int iRecv;
int iSend;
long nTimeout;
SOCKET servSocket;
SOCKADDR_IN destination;
PHOSTENT pHostent;
WSADATA wsData;
HANDLE hreadthread1;
HANDLE hreadthread2;
HWND m_hWnd;
DWORD dwThreadId;
};
cpp文件:
// NetClient.cpp: implementation of the CNetClient class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "znetbarsvr.h"
#include "NetClient.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CNetClient::CNetClient( CString servip, int servport, long itimeout )
{
servSocket = INVALID_SOCKET;
pHostent = NULL;
strcpy( servIp, servip );
servPort = servport;
//hreadthread = NULL;
dwThreadId = NULL;
iRecv = 0;
iSend = 0;
nTimeout = itimeout;
}
CNetClient::~CNetClient()
{
DWORD exitCode=0;
//if( hreadthread != NULL )
//{
// GetExitCodeThread( hreadthread, &exitCode );
// ExitThread( exitCode );
//}
if( servSocket != INVALID_SOCKET )
{
closesocket( servSocket );
}
WSACleanup();
}
// 初始化客户端
bool CNetClient::InitNetClient()
{
if(WSAStartup(MAKEWORD(1,1),&this->wsData) != 0)
{
wsprintf(this->szError,TEXT("socket failed.Error:%d"),WSAGetLastError ());
return false;
}
if( (servSocket = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET )
{
wsprintf(this->szError,TEXT("socket failed.Error:%d"),WSAGetLastError ());
return false;
}
// 发送和接收时限设置
//int nNetTimeout=2000;//20秒
//发送时限
setsockopt(servSocket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nTimeout,sizeof(int));
//接收时限
setsockopt(servSocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nTimeout,sizeof(int));
destination.sin_family = AF_INET;
destination.sin_addr.s_addr = inet_addr( servIp );
destination.sin_port = htons( servPort );
return true;
}
// 连接服务器
bool CNetClient::ConnectToServer()
{
if(servSocket == INVALID_SOCKET)
return false;
if( connect( servSocket, (PSOCKADDR)&destination, sizeof(destination) ) == SOCKET_ERROR )
{
wsprintf(this->szError,TEXT("connect failed.Error:%d"),WSAGetLastError ());
closesocket(servSocket);
return false;
}
//memset( this->getData, 0, sizeof( this->getData ) );
hreadthread = CreateThread(NULL, 0, CNetClient::ThreadToRead, this, 0, &dwThreadId);
MessageBox(NULL, (LPCTSTR)hreadthread, "create thread return", 0);
closesocket(servSocket);
if ( hreadthread != 0 )
CloseHandle( hreadthread );
else
{
wsprintf(this->szError,TEXT("create thread.Error:%d"),WSAGetLastError ());
MessageBox(NULL,(LPCTSTR)getData,"getdata",0);
//closesocket(servSocket);
return false;
}
return true;
}
// 发送数据
bool CNetClient::SendDataToServer( char* data,int len )
{
if(servSocket == INVALID_SOCKET)
return false;
if(send(servSocket,data,len,0) == SOCKET_ERROR)
{
wsprintf(this->szError,TEXT("send failed.Error:%d"),WSAGetLastError ());
closesocket(servSocket);
return false;
}
return true;
}
// 设置发送消息
void CNetClient::SetSendData( CString data )
{
strcpy( sendData, data );
}
// 返回错误信息
char* CNetClient::GetLastError()
{
return this->szError;
}
// 取得接收消息
char* CNetClient::GetRcvData()
{
return getData;
}
// 读取数据的线程
DWORD WINAPI CNetClient::ThreadToRead(LPVOID n)
{
CNetClient* pnetClient = (CNetClient*)n;
DWORD dRtn = 0;
pnetClient->iSend = send(pnetClient->servSocket,pnetClient->sendData,sizeof(pnetClient->sendData),0);
if( pnetClient->iSend == SOCKET_ERROR )
{
wsprintf(pnetClient->szError,TEXT("send failed.Error:%d"),WSAGetLastError());
closesocket(pnetClient->servSocket);
return -1;
}
pnetClient->getData[MAX_RECEIVE_LEN] ='\0';
pnetClient->iRecv = recv(pnetClient->servSocket,pnetClient->getData,sizeof(pnetClient->getData),0);
if( pnetClient->iRecv == SOCKET_ERROR)
{
wsprintf(pnetClient->szError,TEXT("recv failed.Error:%d"),WSAGetLastError());
closesocket(pnetClient->servSocket);
return -2;
}
else if( pnetClient->iRecv == 0)
{
wsprintf(pnetClient->szError,TEXT("Finished receiving data"));
}
return 0;
}
问题:发送信息到服务端。然后服务端返回信息后
接收BUFFER,即getdate第二次以后总是为空。
请哪位大侠指点一下。 |
|