这里写的是一个客户端的类,调用InitNetClient成功后连接服务器,接收的数据通过消息返回窗口.其它功能以后再加上来.
/*
**************************************************************
2004 - 11 - 30 参照于MSDN
stephen
**************************************************************
*/
#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#define WM_READDATA WM_USER+1001
class CNetClient
{
public:
CNetClient(char* hostname,int iport);
~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);
private:
char hostName[256];
int port;
char szError[256];
char getData[256];
int nReceive;
SOCKET serverSocket;
SOCKADDR_IN destination;
PHOSTENT pHostent;
WSADATA wsData;
HANDLE hreadthread;
HWND m_hWnd;
};
CNetClient::CNetClient(char* hostname,int iport)
{
serverSocket = INVALID_SOCKET;
pHostent = NULL;
strcpy(hostName,hostname);
port = iport;
hreadthread = NULL;
nReceive = 0;
}
// 关闭网络
CNetClient::~CNetClient()
{
DWORD exitCode=0;
if(hreadthread != NULL)
{
GetExitCodeThread(hreadthread,&exitCode);
ExitThread(exitCode);
}
if(serverSocket !=INVALID_SOCKET)
closesocket(serverSocket);
WSACleanup ();
}
// 初始化客户端
bool CNetClient::InitNetClient()
{
if(WSAStartup(MAKEWORD(1,1),&this->wsData) != 0)
{
wsprintf(this->szError,TEXT("WSAStartup failed.Error:%d"),WSAGetLastError());
return false;
}
if((serverSocket = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
{
wsprintf(this->szError,TEXT("socket failed.Error:%d"),WSAGetLastError ());
return false;
}
destination.sin_family = AF_INET;
if((pHostent= gethostbyname(hostName)) == NULL)
{
wsprintf(this->szError,TEXT("gethostbyname failed.Error:%d"),WSAGetLastError ());
closesocket(serverSocket);
return false;
}
memcpy((char FAR*)&(destination.sin_addr),pHostent->h_addr,pHostent->h_length);
destination.sin_port = htons(port);
return true;
}
// 连接服务器
bool CNetClient::ConnectToServer()
{
if(serverSocket == INVALID_SOCKET)
return false;
if(connect(serverSocket,
(PSOCKADDR)&destination,
sizeof(destination))
== SOCKET_ERROR)
{
wsprintf(this->szError,TEXT("connect failed.Error:%d"),WSAGetLastError ());
closesocket(serverSocket);
return false;
}
hreadthread = CreateThread(NULL,0,CNetClient::ThreadToRead,
this,0,NULL);
return true;
}
// 发送数据
bool CNetClient::SendDataToServer(char* data,int len)
{
if(serverSocket == INVALID_SOCKET)
return false;
if(send(serverSocket,data,len,0) == SOCKET_ERROR)
{
wsprintf(this->szError,TEXT("send failed.Error:%d"),WSAGetLastError ());
closesocket(serverSocket);
return false;
}
return true;
}
// 返回错误信息
char* CNetClient::GetLastError()
{
return this->szError;
}
// 读取数据的线程
DWORD WINAPI CNetClient::ThreadToRead(LPVOID n)
{
CNetClient* pnetClient = (CNetClient*)n;
while(1)
{
pnetClient->nReceive = recv(pnetClient->serverSocket,pnetClient->getData,sizeof(pnetClient->getData),0);
if( pnetClient->nReceive == SOCKET_ERROR)
{
wsprintf(pnetClient->szError,TEXT("recv failed.Error:%d"),WSAGetLastError ());
closesocket(pnetClient->serverSocket);
break;
}
else if( pnetClient->nReceive == 0)
{
wsprintf(pnetClient->szError,TEXT("Finished receiving data"));
closesocket(pnetClient->serverSocket);
break;
}
else
{
// 测试用屏蔽了sendmessage
// ::SendMessage(pnetClient->m_hWnd,WM_READDATA,0,(LPARAM)pnetClient->getData);
MessageBox(NULL,(LPCTSTR)pnetClient->getData,"getdata",0);
}
}
return 0L;
}
/*
***************************************************************************************
test
***************************************************************************************
*/
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"-------------socket------------------"<<endl;
char send[] = "user";
CNetClient netClient("ftp.27h.com",80);
if(netClient.InitNetClient() == false)
cout<<netClient.GetLastError()<<endl;
if(netClient.ConnectToServer() == false)
cout<<netClient.GetLastError()<<endl;
if(netClient.SendDataToServer(send,sizeof(send))== false)
cout<<netClient.GetLastError()<<endl;
else
cout<<" Send Data to Server Successfuly"<<endl;
}