c网络编程项目(c++网络编程项目)

http://www.itjxue.com  2023-02-02 01:58  来源:未知  点击次数: 

怎样用C语言做socket网络编程?

mfc只是对socket进行了一些封装,大部分人做网络编程都是用的原始的socket,比如如下接口都可以在c下进行调用

1.socket()

2.bind()

3.connect()

4.listen()

5.accept()

6.send() 和recv()

7.sendto() 和recvfrom()

8.close() 和shutdown()

9.getpeername()

10.gethostname()

这些接口是在Winsock2.h中定义的不是在mfc中定义的,你只需要包含Winsock2.h头文件和Ws2_32.lib库就可以了。

如何用MFC实现网络编程

?????一.?客户端?

?????1.?创建一个Dialog?Based项目:CSockClient。?

?????2.?设计对话框?

?????去掉Ok和Cancle两个按钮,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量。?

?????Control?ID?????Type?????????Member

?????IDC_EDITMSG????CEdit???????m_MSG

?????IDC_LISTMSG????ClistBox????m_MSGS

?????3.?CAsyncSocket类用DoCallBack函数处理MFC消息,当一个网络事件发生时,DoCallBack函数按网络事件类型:FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT分别调用OnReceive、OnSend、OnAccept、OnConnect函数。

?????由于MFC把这些事件处理函数定义为虚函数,所以要生成一个新的C++类,以重载这些函数,做法如下:以Public方式继承CAsyncSocket类,生成新类MySock;为MySock类添加虚函数OnReceive、OnConnect、OnSend。?

?????4.?在MySock.ccp中添加以下代码?

?????#include?"CSockClient.h"

?????#include?"CSockClientDlg.h"

?????5.?在MySock.h中添加以下代码?

?????public:

?????BOOL?m_bConnected;????//是否连接

?????UINT?m_nLength;????//消息长度

?????char?m_szBuffer[4096];?//消息缓冲区

?????6.?在MySock.ccp中重载各函数?

?????MySock::MySock()

?????{

?????????m_nLength=0;

?????????memset(m_szBuffer,0,sizeof(m_szBuffer));

?????????m_bConnected=FALSE;

?????}

?????MySock::~MySock()

?????{

?????????//关闭套接字

?????if(m_hSocket!=INVALID_SOCKET)

?????Close();

?????}

?????void?MySock::OnReceive(int?nErrorCode)?

?????{

?????????m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);

?????????//下面两行代码用来获取对话框指针

?????CCSockClientApp*?pApp=(CCSockClientApp*)AfxGetApp();

?????????CCSockClientDlg*?pDlg=(CCSockClientDlg*)pApp-?m_pMainWnd;

?????????pDlg-?m_MSGS.InsertString(0,m_szBuffer);

?????????memset(m_szBuffer,0,sizeof(m_szBuffer));

?????????CAsyncSocket::OnReceive(nErrorCode);

?????}

?????void?MySock::OnSend(int?nErrorCode)?

?????{

?????????Send(m_szBuffer,m_nLength,0);

?????????m_nLength=0;

?????????memset(m_szBuffer,0,sizeof(m_szBuffer));

?????????//继续提请一个“读”的网络事件,接收Server消息

?????AsyncSelect(FD_READ);

?????????CAsyncSocket::OnSend(nErrorCode);

?????}

?????void?MySock::OnConnect(int?nErrorCode)?

?????{

?????????if?(nErrorCode==0)

?????????{

?????m_bConnected=TRUE;

?????CCSockClientApp*?pApp=(CCSockClientApp*)AfxGetApp();

?????CCSockClientDlg*?pDlg=(CCSockClientDlg*)pApp-?m_pMainWnd;

?????memcpy(m_szBuffer,"Connected?to?",13);

?????strncat(m_szBuffer,pDlg-?m_szServerAdr,

?????sizeof(pDlg-?m_szServerAdr));

?????pDlg-?m_MSGS.InsertString(0,m_szBuffer);

?????AsyncSelect(FD_READ);?////提请一个“读”的网络事件,准备接收

?????????}

?????????CAsyncSocket::OnConnect(nErrorCode);

?????}

?????7.?新建对话框IDD_Addr,用来输入IP地址和Port;生成新类CAddrDlg。增加两个Edit控件:IDC_Addr、IDC_Port按下表在ClassWizard中为CAddrDlg类添加变量。?

?????Control?ID????Type????Member

?????IDC_Addr????CString????m_Addr

?????IDC_Port????Int????????m_Port

?????8.?在CSockClientDlg.ccp中添加代码:?

?????#include?"AddrDlg.h"

?????protected:

?????????int?TryCount;

?????????MySock?m_clientSocket;

?????????UINT?m_szPort;

?????public:

?????????char?m_szServerAdr[256];????

?????9.?双击IDD_CSOCKCLIENT_DIALOG对话框中的“连接”按钮,添加以下代码:?

?????void?CCSockClientDlg::OnConnect()?

?????{

?????????m_clientSocket.ShutDown(2);

?????????m_clientSocket.m_hSocket=INVALID_SOCKET;

?????????m_clientSocket.m_bConnected=FALSE;

?????????CAddrDlg?m_Dlg;

?????????//默认端口1088

?????m_Dlg.m_Port=1088;

?????????if?(m_Dlg.DoModal()==IDOK??!m_Dlg.m_Addr.IsEmpty())

?????????{

?????memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr));

?????m_szPort=m_Dlg.m_Port;

?????//建立计时器,每1秒尝试连接一次,直到连上或TryCount10

?????SetTimer(1,1000,NULL);

?????TryCount=0;

?????????}

?????}

?????10.?添加Windows消息WM_TIMER响应函数OnTimer?

?????void?CCSockClientDlg::OnTimer(UINT?nIDEvent)?

?????{

?????????if?(m_clientSocket.m_hSocket==INVALID_SOCKET)

?????????{

?????BOOL?bFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT);

?????if(!bFlag)

?????{

?????????AfxMessageBox("Socket?Error!");

?????????m_clientSocket.Close();

?????????PostQuitMessage(0);

?????????return;

?????}

?????????}

?????????m_clientSocket.Connect(m_szServerAdr,m_szPort);

?????????TryCount++;

?????????if?(TryCount?=10?||?m_clientSocket.m_bConnected)

?????????{????

?????KillTimer(1);

?????if?(TryCount?=10)

?????????AfxMessageBox("Connect?Failed!");

?????return;

?????????}

?????????CDialog::OnTimer(nIDEvent);

?????}

?????11.?双击IDD_CSOCKCLIENT_DIALOG对话框中的“发送”按钮,添加以下代码:?

?????void?CCSockClientDlg::OnSend()?

?????{

?????????if?(m_clientSocket.m_bConnected)

?????????{

?????m_clientSocket.m_nLength=m_MSG.GetWindowText

?????(m_clientSocket.m_szBuffer,?sizeof(m_clientSocket.m_szBuffer));

?????m_clientSocket.AsyncSelect(FD_WRITE);

?????m_MSG.SetWindowText("");

?????????}

?????}

?????12.?双击IDD_CSOCKCLIENT_DIALOG对话框中的“关闭”按钮,添加以下代码:?

?????void?CCSockClientDlg::OnExit()?

?????{

?????????//关闭Socket

?????m_clientSocket.ShutDown(2);

?????????//关闭对话框

?????EndDialog(0);????

?????}

?????12.运行此项目,连接时输入主机名或IP均可,CAsyncSocket类会自动处理。

?????二.?服务端

?????Server端的编程与Client端的类似,下面主要介绍他的Listen及Accept函数。

?????1.?建立一个CNewSocket类,重载CAsyncSocket类的OnReceive、OnSend函数,如何进行信息的显示和发送可以参考Client程序。本例中采用将收到信息原封不动发回的方法来实现Echo功能,代码如下:

?????CNewSocket::OnReceive(int?nErrorCOde)

?????{

?????????m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);

?????????//?直接转发消息

?????AsyncSelect(FD_WRITE);

?????}

?????CNewSocket::OnSend(int?nErrorCode)

?????{

?????????Send(m_szBuffer,m_nLength,0);

?????}

?????2.?建立一个CMyServerSocket类,重载CAsyncSocket类的OnAccept函数代码如下

?????在MyServerSocket.h中声明变量

?????public::

?????CNewSocket*?m_pSocket;

?????void?CMyServerSocket::OnAccept(int?nErrorCode)

?????{

?????????//侦听到连接请求,调用Accept函数

?????????CNewSocket*?pSocket?=?new?CNewSocket();

?????????if?(Accept(*pSocket))

?????????{

?????pSocket-?AsyncSelect(FD_READ);

?????m_pSocket=pSocket;

?????????}

?????????else

?????delete?pSocket;

?????}

?????3.?为对话框添加一个“侦听”按钮,添加如下代码:

?????在CsockServerDlg.ccp中声明变量

?????public:

?????????CMyServerSocket?m_srvrSocket;

?????void?CCSockServerDlg::OnListen()

?????{

?????????if?(m_srvrSocket.m_hSocket==INVALID_SOCKET)

?????????{

?????BOOL?bFlag=m_srvrSocket.Create

?????(UserPort,SOCK_STREAM,FD_ACCEPT);

?????if?(!bFlag)

?????{

?????????AfxMessageBox(“Socket?Error!”);

?????????M_srvrSocket.Close();

?????????PostQuitMessage(0);

?????????Return;

?????}

?????????}

?????//“侦听”成功,等待连接请求

?????if?(!m_srvrSocket。Listen(1))

?????{

?????int?nErrorCode?=?m_srvrSocket.GetLastError();

?????if?(nError!=WSAEWOULDBLOCK)

?????{

?????????AfxMessageBox(“Socket?Error!”);

?????????M_srvrSocket.Close();

网络编程C语言入门知识

c

语言

是高级语言,但由于它可以通过指针对内存进行访问,具有了低级语言的特性,因此很多人也称它是中级语言。按照内容来说C语言有自己的语言符号和语句规则,他有3种基本的结构:顺序结构,选择结构、循环结构。然后按照不同的需要通过用这三种结构的不同“组合”(当然不是拼凑那种简单组合)就可以编出不同功能的程序了。

当然还有指针和结构体等其他一些内容,但编程强调的是算法能力。算法即是你要做一件事的步骤,在编程里面体现的就是你要实现一个功能要知道编写的内容有几部分每一部分大概用什么方法去实现。

c语言的网络编程特点有哪些?(在线等待,答得好马上给分!)

1、你说得用C语言开发网络程序,一定指的是在WIN/UNIX/LINUX/SOLARIS/FreeBSD等多进程/多线程操作系统下的编程,网络编程是基于B/S或者C/S架构的,无论那种,S都需要有多线程或者子进程的处理与客户端通信的能力,DOS下的C是不具备这个能力。另外,网络程序是对操作系统多线程/多进程能力要求很高的应用,所以UNIX下的C编程能很好的满足要求。

2、网络编程只要遵从一种协议,语言是没有限定的,比较各种语言编写的网路应用的特点,归根结底还是回到这种语言已经它存在的操作系统的特点。相比与其他语言开发的网络程序,用UNIX/SOKCET/C这种模式开发的网络应用能最大限度的利用系统资源,同时兼备UNIX的稳定性和C的高效率,是大型网络应用经常采用的方式,例如著名的freeBSD,大量的论坛都是这样的方式。很多网络应用,离开UNIX和C,在重连接负荷的情况下是无法工作的。

3、但是由于高效与通用是一对矛盾,UNIX/C开发的网络应用,比较靠近系统底层,代码的可移植性、可重用性相对于使用winsock编程的WINDOWS/C++方案的网络应用要差一些,windows的MFC已经对网络协议做了很多层的封装,使用C++来继承可以节省大量开发时间。

4、结论,如果你想开发自己全新的网络应用/协议,并且要承担很重的用户访问负荷,那么你可以用C,而且操作系统要用UNIX/LINUX,如果你仅仅希望用已经成熟的internet协议写一些界面漂亮的网络应用,推荐你用WINDOWS/C++方式。

网络编程用 c还是c++

网络的底层API都是C语言的,不管是Linux还是Windows都是这样。用C++是为了封装代码,达到复用和扩展的目的。简单的项目用C足够了,C++适合开发复杂的大型项目。据说ACE的结构很复杂,不太适合学习,我反正是没有接触过,只用过 Berkeley Socket

tcp网络编程(C语言)

以下是两个文件.client.c和server.c

server.c

client.c

运行效果如下

(责任编辑:IT教学网)

更多