网络编程的练习1
来源:互联网 发布:能借钱的软件 编辑:程序博客网 时间:2024/05/17 02:04
这里写的是一个客户端的类,调用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;
}
- 网络编程的练习1
- 网络编程的练习1
- 网络编程的练习2
- 网络编程的练习3
- JavaSE_网络编程_TCP_练习1
- vs2010 网络编程练习
- 网络编程练习-fcntl
- 网络编程练习-ioctl
- Java 网络编程 练习
- 网络编程小练习
- 网络编程协议练习
- 黑马程序员-网络编程-练习
- UNIX网络编程简单练习
- 网络编程练习-TCP socket
- 网络编程练习-setsockopt&getsockopt
- 网络编程练习 ftp 文件传输
- 网络编程练习字符串反转
- UNIX网络编程练习-简单的时间服务器和客户端
- 什么是数据data..........重修Data Structure笔记
- BT之父的辛酸奋斗血泪史
- 利用Delphi和金山词霸制作批量单词翻译
- 解决Windows 程序界面闪烁问题的一些经验
- 网页设计技巧11则
- 网络编程的练习1
- boot.ini文件解释
- 史上最全网络协议图
- BitTorrent协议详解
- 程序人生: 我的十年,自己的生活经历,个人自传 (整理)
- 如何对待第一个女朋友--给初恋男生的爱情锦囊
- 补充 - C++字符串完全指引.htm
- 操作窗体系统菜单、按钮
- 专家:人为推动重工业化, 中国经济可能误入歧途