网络软件开发

网络软件开发,vc ++ 、linux 、asp、sql server 2000 android、iOS

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  5 随笔 :: 1 文章 :: 45 评论 :: 0 Trackbacks

Socket编程在大多数的编程语言中都是一件比较有趣的事情。它是比较常用的编写通过网络通信的服务器和客户端方法。在windows平台Socket通信大多是基于MS Winsock设计的。Windows支持基于TCP和UDP的socket通信。Windows APIs在socket编程中是非常有用的,但是有些人发现在用它们工作的时候有困难。
所以在这里我介绍一种最简单用MFC socket类进行socket编程的方法。这不仅可以使你的工作变得简单而且能减少你在网络程序上的开发时间。你可以定制一个socket类,然后你可以在你的其他的网络应用程序中重用。
在socket编程中,MFC提供了两个基本的类,分别是CAsyncSocket和Csocket。Csocket是从CAsyncSocket继承来的。我们可以建立定制的socket类,也是从CasyncSocket继承而来的,当然也是为了我们程序特殊的需要。
初始化socket
首先需要调用AfxSocketInit()函数来初始化我们的socket环境。
为了初始化sockets,我们需要调用AfxSocketInit()函数。它通常是在MFC中的InitInstance()函数中被调用的。如果我们用程序向导来创建socket程序的话,查看“use Windows Sockets”这个选项,然后选中它。它将会自动的为我们创建这个步骤了。(如果我们没有选中这个选项的话,我们也可以手动添加这些代码的。)这个函数的返回值显示这个函数的调用成功或失败。
BOOL CServerApp::InitInstance()
{....
if( AfxSocketInit() == FALSE)
  {
  AfxMessageBox("Sockets Could Not Be Initialized");
  return FALSE;
  }
  ...
}
创建Server Sockets
为了创建一个Server Socket,我们需要声明一个CAyncSocket的变量或者我们自己定制的一个从AyncSocket或是Cscket继承来的类的类型的变量。然后调用Create()函数,同时指定监听的端口。这个函数的返回值显示这个函数的调用成功或失败。
UpdateData(TRUE);
m_sListener.Create(m_port);
if(m_sListener.Listen()==FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
创建Client Sockets
为了创建Client socket类,我们需要声明一个CAyncSocket的变量或者我们自己定制的一个从AyncSocket或是Cscket继承来的类的类型的变量。然后调用Create()函数,同时指定监听的端口。这个函数的返回值显示这个函数的调用成功或失败。
m_sConnected.Create();
m_sConnected.Connect("server ip",port);
监听客户端的连接
创建了server socket以后,我们要进行监听。调用Listen()函数。这个函数的返回值显示这个函数的调用成功或失败。
if( m_sListener.Listen()== FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
接受连接
连接请求要被接受accept,是用另外的socket,不是正在监听的socket。请参看代码。
void CXXXDlg::OnAccept()
{
 CString strIP;
 UINT port;
 if(m_sListener.Accept(m_sConnected))
 {
  m_sConnected.GetSockName(strIP,port); //应该是GetPeerName,获取对方的IP和port
  m_status="Client Connected,IP :"+ strIP;
  m_sConnected.Send("Connected To Server",strlen("Connected To  Server"));     
UpdateData(FALSE);
 }
 else
 {
 AfxMessageBox("Cannoot Accept Connection");
 }
}
发送数据
数据放在一个buffer中或是结构体中,调用send()函数发送。
m_sConnected.Send(pBuf,iLen);
接受数据
调用receive()接受数据。
void CXXXrDlg::OnReceive()
{
char *pBuf =new char [1025];
CString strData;
int iLen;
iLen=m_sConnected.Receive(pBuf,1024);   
if(iLen == SOCKET_ERROR)     
  {
  AfxMessageBox("Could not Recieve");     
  }     
else    
  {
  pBuf[iLen]=NULL;
  strData=pBuf;
  m_recieveddata.Insert(m_recieveddata.GetLength(),strData);
 //display in server             
 UpdateData(FALSE);
 m_sConnected.Send(pBuf,iLen);  //send the data back to the Client    
 delete pBuf;         
  }
}
关闭连接
m_sConnected.ShutDown(0);    停止发送数据
m_sConnected.ShutDown(1);    停止接受数据
m_sConnected.ShutDown(2);    停止发送接受数据
m_sConnected.Close();
编写自己的socket类
在class view中选择添加一个新类,设置它的基类为CAsyncSocket,在类向导的帮助下添加如下的一些函数。
class MySocket : public CAsyncSocket
{ // Attributes
public:
 // Operations
public:
MySocket();
virtual ~MySocket();
// Overrides
public:
void SetParentDlg(CDialog *pDlg);// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(MySocket)
public:
virtual void OnAccept(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnOutOfBandData(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
//}}AFX_VIRTUAL // Generated message map functions
//{{AFX_MSG(MySocket)
// NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG
protected:
private:
CDialog * m_pDlg;
};
设置“Parent Dialog”
调用这个socket类的SetParentDlg函数,保证当socket事件发生的时候这个窗体能接收到。
m_sListener.SetParentDlg(this);
m_sConnected.SetParentDlg(this);
建立Socket 事件和窗体成员函数之间的联系
在这个窗体类中添加一些函数,比如void OnReceive(); void OnClose(); void OnAccept(); void OnConnect()等,它们会在我们编写的的socket类中调用到。
void MySocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(nErrorCode==0)
{
((CServerDlg*)m_pDlg)->OnAccept();
}
CAsyncSocket::OnAccept(nErrorCode);
}
这里只写了一个OnAccept()函数,其他的几个中也有类似的调用。详细的请参考代码。


email: ghs_linux@163.com
欢迎交流哦 :)

posted on 2006-07-27 12:05 信任 阅读(5889) 评论(38)  编辑 收藏 引用

评论

# re: MFC socket程序开发 2006-08-08 14:14 ankh
hi~能否把完整的代码贴出来?
或email到ankh2008@hotmail.com?  回复  更多评论
  

# re: MFC socket程序开发 2006-08-08 14:14 ankh
hi~能否把完整的代码贴出来?
或email到ankh2008@hotmail.com?  回复  更多评论
  

# re: MFC socket程序开发 2006-08-09 08:33 ghslinux
可以的。  回复  更多评论
  

# re: MFC socket程序开发 2006-08-11 12:18 ghslinux
已经发送,请查收。  回复  更多评论
  

# re: MFC socket程序开发 2006-08-18 09:22 marco
能否把完整的代码email到marcovanshine@hotmail.com? 谢谢  回复  更多评论
  

# re: MFC socket程序开发 2006-09-14 15:28 Mac
好东西,学习...  回复  更多评论
  

# re: MFC socket程序开发 2006-10-09 23:33 清风
楼主能否把完整代码发送到chenweizi@sina.com
多谢  回复  更多评论
  

# re: MFC socket程序开发 2007-01-23 11:36 cherry
谢谢,小妹可否求一份完整的代码,发送到lyl83213@hotmail.com  回复  更多评论
  

# re: MFC socket程序开发 2008-04-07 15:36 majia
请把这段程序的代码发给我一份!谢谢!majia1984@126.com  回复  更多评论
  

# re: MFC socket程序开发 2008-04-10 11:52 小路
你好 我也要一份 謝謝你!!!
blueshiang@hotmail.com  回复  更多评论
  

# re: MFC socket程序开发 2008-04-23 10:25 清凉
您好,能否也给我发一份,学习,呵呵,谢谢
huangsup110@hotmail.com  回复  更多评论
  

# re: MFC socket程序开发 2008-04-23 14:06 信任
已经发送  回复  更多评论
  

# re: MFC socket程序开发 2008-05-07 00:33 xiaoye
能否给我发一分,yesj-2008@163.com,谢谢  回复  更多评论
  

# re: MFC socket程序开发 2008-05-09 15:16 信任
已发送。  回复  更多评论
  

# re: MFC socket程序开发 2008-05-09 15:17 信任
@清凉
已发送  回复  更多评论
  

# re: MFC socket程序开发 2008-05-20 19:47 piccolo
您好,能给我也发一份么,我在做毕业设计,有网络编程方面的内容
谢谢 邮箱是
lgpiccolo@163.com  回复  更多评论
  

# re: MFC socket程序开发 2008-05-23 11:03 ly
你好,能给我发一份么》?我正在学习这方面,谢谢
ly24381@163.com  回复  更多评论
  

# re: MFC socket程序开发 2008-06-03 20:21 goldfisher
能否给我发一个完整的代码?非常感谢  回复  更多评论
  

# re: MFC socket程序开发 2008-06-03 20:22 goldfisher
刚忘了帖EMAIL,呵呵,goldfisher.jin@gmail.com  回复  更多评论
  

# re: MFC socket程序开发 2008-06-06 11:14 hwan
能给我也发一个完整的代码吗? hwan_hh@126.com,谢谢  回复  更多评论
  

# re: MFC socket程序开发 2008-06-10 14:23 hby0501
LZ 我也想要一份,可以么? 谢谢!!!  回复  更多评论
  

# re: MFC socket程序开发 2008-06-10 14:24 hby0501
hby0501@163.com  回复  更多评论
  

# re: MFC socket程序开发 2008-06-13 23:09 hiyawu
小弟需要完整代码
邮箱 123514228@qq.com
???thanks  回复  更多评论
  

# re: MFC socket程序开发 2008-07-09 20:50 好人
你好,我很需要这方面的代码。能否给我发一份
谢谢
zs060226@163.com  回复  更多评论
  

# re: MFC socket程序开发 2009-04-18 16:35 caogenxia
可以给一份代码我看看吗,caogenxia@qq.com
  回复  更多评论
  

# re: MFC socket程序开发[未登录] 2009-06-13 21:30 天行
能不能将完整代码发到meibao_2000@163.com。

先谢了。  回复  更多评论
  

# re: MFC socket程序开发 2009-06-25 00:44 hannah
可以给我一分完整代码吗?yuhannah@hotmail.com  回复  更多评论
  

# re: MFC socket程序开发 2011-05-17 11:17 闭环
楼主您好 能不能把完整的代码发到279676738@qq.com
不胜感激 正在学习中  回复  更多评论
  

# re: MFC socket程序开发[未登录] 2011-05-19 09:20 小王
你好,能否给我一份,谢谢了,505115063@qq.com  回复  更多评论
  

# re: MFC socket程序开发[未登录] 2011-05-29 15:25 star
谢谢。。能够给我发一份啊。。正在系统编程中,找了好久啊。。
623383843@qq.com
  回复  更多评论
  

# re: MFC socket程序开发 2011-11-23 21:50 陈秋明
您好,看了后,感觉写的很好,但是有些细节有点疑惑,可否也发一份给我,我正在学习网络编程中!谢谢
邮箱:540284410@qq.com  回复  更多评论
  

# re: MFC socket程序开发[未登录] 2013-04-10 10:50 lei
您好,这篇文章的完整代码还有吗,可否发我有一份,谢谢!416296223@qq.com  回复  更多评论
  

# re: MFC socket程序开发 2013-05-28 10:44 jeansnorth
您好 请问能否给我发一份完整的TCP通信程序呢 我的邮箱是jeansnorth@163.com 不胜感激 本人是新手 看一部分代码还是不太懂  回复  更多评论
  

# re: MFC socket程序开发[未登录] 2013-06-10 10:01 Ben
您好,麻烦您也给我发一份好吗?我的邮箱1324468038@qq.com 谢谢  回复  更多评论
  

# re: MFC socket程序开发 2013-11-18 11:23 Guilty
你好 能给我发一份源代码吗 270503325@qq.com 谢谢  回复  更多评论
  

# re: MFC socket程序开发 2015-02-20 16:10 陈晶
@信任
能发一份给我吗?非常需要,谢谢啦  回复  更多评论
  

# re: MFC socket程序开发 2015-04-03 13:30 linuxsocket
以上代码都全部发送  回复  更多评论
  

# re: MFC socket程序开发 2015-08-31 16:21 刘培坤
能否发送一份给我,谢谢 邮箱lpkhappy@yeah.net@linuxsocket
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


敏捷软件、敏捷企业管理系统