精华内容
下载资源
问答
  • MFC UDP通信

    2014-10-12 07:47:09
    MFC UDP通信 一个简单的使用MFC套接字实现UDP通信的小程序
  • mfc UDP 通信

    2009-07-27 12:59:01
    UDP实现的通信UDP实现的通信UDP实现的通信UDP实现的通信
  • MFC UDP通信简单实现

    2018-05-31 13:50:39
    Hello, 这是一个MFC UDP通信示例,好用,网上整理,侵权请通知在下删除。谢谢
  • MFC UDP通信程序

    2018-08-23 14:13:00
    MFCUDP通讯聊天软件,一编译就可以正常运行,正常聊天。
  • VS2012 MFC UDP通信

    2018-10-19 17:48:51
    本工具设计的目的是用于自己项目上,由于好久没有使用C++了,可能编程有些丑陋,哪里不对希望大家见谅。本文参考了许多前辈的例子,终于搞好了。若有和前辈们相同的地方,可以联系我,进行删除。...

    本工具设计的目的是用于自己项目上,由于好久没有使用C++了,可能编程有些丑陋,哪里不对希望大家见谅。本文参考了许多前辈的例子,终于搞好了。若有和前辈们相同的地方,可以联系我,进行删除。本意也是大家互相学习嘛,废话不多说了,看图:

    由于是我们项目专用的工具,端口目前是固定写死在程序中的,有需要的可以自己进行添加。

    创建连接

    void CMFCUDPDlg::OnClickedButtonCreateSocket()
    {
        // TODO: 在此添加控件通知处理程序代码
        CString temp;
        m_createsocket.GetWindowText(temp);///获取按钮的文本
        UpdateData(true);
        if(temp == _T("关闭连接"))///表示点击后是"关闭串口",也就是已经关闭了串口
        {
            //关闭socket        
            m_createsocket.SetWindowText(_T("打开连接"));///设置按钮文字为"打开串口"
            //关闭接收线程,关闭socket
            CloseListenTread();
            closesocket(m_socket);
        }
        else if(temp == _T("打开连接"))///当前列表的内容个数
        {
            UpdateData(true);
            m_socket = socket(AF_INET, SOCK_DGRAM, 0);
            if( INVALID_SOCKET  == m_socket )
            {
               AfxMessageBox(_T("创建套接字失败"));
               return;
            }
            else
            {
                SOCKADDR_IN addr;
                addr.sin_addr.s_addr = htonl(INADDR_ANY);
                //addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
                addr.sin_family = AF_INET;
                addr.sin_port = htons(6000);
                int retval;
                retval = bind(m_socket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
                if (SOCKET_ERROR == retval)
                {
                    AfxMessageBox(_T("绑定失败!"));
                    closesocket(m_socket);
                    return ;
                }
                //创建接收线程
                if (!OpenListenThread())  
                {  
                    AfxMessageBox(_T("错误,请关闭应用,重新打开!"));
                }
                m_createsocket.SetWindowText(_T("关闭连接"));
            }        
        }
    }
     

    发送数据:

    void CMFCUDPDlg::OnClickedButtonSendMessage()
    {
        // TODO: 在此添加控件通知处理程序代码
        GetDlgItem(IDC_BUTTON_SEND)->SetFocus();
        CString temp;
        int i=0;
        UpdateData(true);
        m_createsocket.GetWindowText(temp);
        if (temp == "打开连接")///没有打开串口
        {
            AfxMessageBox(_T("请首先打开连接"));
            return;
        }
        
        m_sendmessage.GetWindowText(temp);
        size_t len = _tcsclen(temp) + 1;
        char* m_str = NULL;
        size_t* converted = 0;
        m_str = new char[len];
    #ifdef UNICODE
        wcstombs_s(converted, m_str, len, temp.GetBuffer(0), _TRUNCATE);
    #else
        m_str = temp.GetBuffer(0);
    #endif

        DWORD dwIP;
        m_hostip.GetAddress(dwIP);
        SOCKADDR_IN addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(hostport);
        addr.sin_addr.s_addr = htonl(dwIP);
        sendto(m_socket, m_str, strlen(m_str), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR));

        m_sendmessage.SetSel(0, -1);
        m_sendmessage.Clear();//清空数据
        m_sendmessage.GetFocus();//再次获得焦点
        UpdateData(FALSE);//必须的。否则界面内容不更新改变
    }

    接收数据是放在另外一个线程中进行处理

    UINT WINAPI CMFCUDPDlg::RecvThreadProc(LPVOID lpParameter)
    {
        //AfxMessageBox(_T("线程工作"));
        /** 得到本类的指针 */
        CMFCUDPDlg *pRecvMessage = reinterpret_cast<CMFCUDPDlg*>(lpParameter);

        SOCKADDR_IN ClntAddr; 
        int clntAddrLen = sizeof(ClntAddr);
        char echoBuffer[1024]=""; 
        CString buffer;
        int recvMsgSize  = 0;
        size_t len = 0;
        size_t converted = 0;
        //处理数据的接收
        if(!s_bExit)//表示线程已经开启,正在工作,这句代码可以不要,下面的while有判断
        {        
            while(!s_bExit)
            {
                //一直阻塞到有客户端发来数据 (sock, recvBuf, 200, 0, (SOCKADDR*)&addr, &len);
                recvMsgSize = recvfrom(pRecvMessage->m_socket,echoBuffer,sizeof(echoBuffer),0 ,(SOCKADDR*)&ClntAddr, &clntAddrLen);
                if (SOCKET_ERROR == recvMsgSize)
                {
                    //AfxMessageBox(_T("断开连接,请重新打开连接"));
                    break;
                }
     
                 //把echoBuffer转格式成wchar_t
                len = strlen(echoBuffer) + 1;
                wchar_t *WStr;
                WStr=(wchar_t*)malloc(len*sizeof(wchar_t));
                mbstowcs_s(&converted, WStr, len, echoBuffer, _TRUNCATE);
      
                //获取对方ip
                char *addr = inet_ntoa(ClntAddr.sin_addr);
                //把addr转格式成wchar_t
                len = strlen(addr) + 1;
                wchar_t *address;
                address=(wchar_t*)malloc(len*sizeof(wchar_t));
                mbstowcs_s(&converted, address, len, addr, _TRUNCATE);
     
                /*把发送端的ip地址和消息还有换行都存放在buffer里,然后一直往save里追加*/
                buffer.Format(_T("【%s】说 :%s\r\n"),address,WStr);
                 
                pRecvMessage->m_recvmessage.SetSel(-1, -1);
                pRecvMessage->m_recvmessage.ReplaceSel(buffer);
            }
        }
        return 0;
    }

    工程代码中也有一些对线程的管理,以及对控件大小随着主对话框大小改变的处理。

    下载地址:https://download.csdn.net/download/lionmon82/10732605

    第一次发博客,哪里做的不好多见谅。

    本文参考了前辈们的例程,若有侵权,请联系我删除。

    展开全文
  • MFC接收从机箱发送过来的数据,并把数据写入txt文件,UDP通信和将数据写入txt文件是在不同的类中分开执行的,我将接收数据的数组定义成全局变量,并在另一个类中将这些数据写入txt文件,现在的问题是,我怎么同步这...
  • MFC实现UDP通信

    2017-12-27 09:09:28
    开发工具为vs2008,编程语言为C++,实现UDP通信,一个程序既可以作为服务器,也可以作为客户端
  • VS2012 MFCUDP通信

    2018-10-19 17:27:19
    本例程在VS2012环境下运行,通过MFC工程创建了UDP通信助手,本意用在自己的项目上,用来进行数据配置的,很简单,方便修改,初学者应该很快搞懂。控件可以随着对话框的大小进行改变。
  • 基于mfc对话框的UDP通信测试小软件,适合初学者参考。
  • MFC- UDP通信的源代码

    2012-11-20 00:10:29
    MFC- UDP通信的源代码 里面有很多关于我做的项目的东西 不用的话可以删掉
  • MFC网络通信》Part 1 简单UDP通信

    千次阅读 热门讨论 2016-03-16 10:21:12
    MFC网络通信》Part 1 简单的UDP通信   1、新建普通的MFC(exe)对话框程序,程序命名为UD

    《MFC网络通信》Part 1 简单UDP通信                                                                                                                                            


    1、新建普通的MFC(exe)对话框程序,程序命名为UDP,第二步中勾选Window Sockets

    2、主对话框中添加一些控件,如下图

    3、控件属性列表:

    控件类型		ID			CaptionStyle
    Static			IDC_STATIC		对方主机的IP地址:
    Edit			IDC_IP
    Static			IDC_STATIC		端口:
    Edit 			IDC_PORT
    Edit			IDC_HIST		多行、垂直滚动条(去掉自动水平滚动条)
    Edit			IDC_INPUT
    Button			IDOK			发送(&S)
    Button			IDCANCEL		关闭

    4、新建一个CSocket的派生类CSockUDP:

    5、在CSockUDP的头文件中添加头文件:

    #include <afxsock.h>
    
    
    
    
    /
    // CSockUDP command target
    
    
    class CSockUDP : public CSocket
    {
    <span style="white-space:pre">	</span>
    // Attributes
    public:
    

    6、在CSockUDP类中添加虚函数OnReceive,用于截获接收到的网络数据:

    7、修改虚函数代码:
    void CSockUDP::OnReceive(int nErrorCode) 
    {
    	// TODO: Add your specialized code here and/or call the base class
    	char s[2048];
    
    	CString szIP;
    	UINT nPort;
    
    	int nRect = ReceiveFrom(s,sizeof(s),szIP,nPort);
    	if(nRect<=0)
    		return ;
    	s[nRect] = 0;//将接收到的数据通过消息框显示出来
    	//AfxMessageBox(s);
    
    	CString str;
    	str.Format("%s 对你说: \r\n%s\r\n",szIP,s);
    	CWnd * pDlg = AfxGetMainWnd();
    	CEdit * pEdit = (CEdit *)pDlg->GetDlgItem(IDC_HIST);
    	pEdit->SetSel(pEdit->GetWindowTextLength(),-1);
    	pEdit->ReplaceSel(str);
    	
    
    	CSocket::OnReceive(nErrorCode);
    }
    

    8、修改主对话框的初始化函数代码:
    BOOL CUDPDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	if (!m_sock.Create(8828,SOCK_DGRAM))
    	{
    		CString str;
    		str.Format("创建Socket时出错:%d",GetLastError());
    		AfxMessageBox(str);
    	}
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
    	
    	// TODO: Add extra initialization here
    	
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }

    9、在App类的进程启动函数InitInstance开头,添加一行初始化代码来初始化Socket:
    BOOL CUDPApp::InitInstance()
    {
    	//此处添加一行代码初始化Socket
    	AfxSocketInit();
    
    	…
    10、在主对话框类中添加“发送(&S)”按钮的消息映射函数OnOK:
    void CUDPDlg::OnOK() 
    {
    	// TODO: Add extra validation here
    	CString szIP,szText;
    	GetDlgItemText(IDC_INPUT,szText);
    	if (szText.IsEmpty())
    	{
    		AfxMessageBox("请输入要输入的文字!");
    			return;
    	}// 
    	GetDlgItemText(IDC_IP,szIP);
    	if (szIP.IsEmpty())
    	{
    		AfxMessageBox("请输入对方主机的IP");
    		return ;
    	}
    	UINT nPort = GetDlgItemInt(IDC_PORT);
    
    		m_sock.SendTo(szText,szText.GetLength(),nPort,szIP);
    
    
    		CString str;
    		str.Format("你对 %s 说:\r\n%s\r\n",szIP,szText);
    		CEdit *pEdit = (CEdit*)GetDlgItem(IDC_HIST);
    		pEdit->SetSel(pEdit->GetWindowTextLength(),-1);
    		pEdit->ReplaceSel(str);
    
    }

    11、调试、运行程序,测试代码:
    1)Win+R组合进入控制台界面,输入ipconfig得到主机的IP地址;
    2) 端口号的范围是 0~65 535
    3)在程序界面中输入IP:192.168.1.46,端口号随便给一个
    注:可以自己装一个虚拟机测试UDP程序



    展开全文
  • 基于MFCUDP通信实现

    2016-06-10 23:30:53
    程序代码有详细解释,界面友好,课程设计时用的,课设的同学可以从中学到很多知识也会顺利答辩哦!
  • mfc socket udp通信

    千次阅读 2011-12-08 22:41:53
    mfc socket udp通信 Socket在哪里呢? 在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。 图2 原来Socket在这里。 Socket是什么呢? Socket是应用层与TCP/IP协议族通信...
      
     mfc socket udp通信 
    
    Socket在哪里呢?
    在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。

    图2

    原来Socket在这里。
    Socket是什么呢?
    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
    你会使用它们吗?
    前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
    一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。

    图3

    先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
    在这里我就举个简单的例子,我们走的是TCP协议这条路(见图2)。例子用MFC编写,运行的界面如下:


    图4


    图5

    在客户端输入服务器端的IP地址和发送的数据,然后按发送按钮,服务器端接收到数据,然后回应客户端。客户端读取回应的数据,显示在界面上。
    下面是接收数据和发送数据的函数:

    int Receive(SOCKET fd, char *szText, int len)
    {
        
    int cnt;
        
    int rc;
        
    cnt = len;
        
    while (cnt > 0)
            {
            
    rc = recv(fd, szText, cnt, 0);
            
    if (rc == SOCKET_ERROR)
                {
                
    return  - 1;
                }
            
    if (rc == 0)
                
    return len - cnt;
            
    szText += rc;
            
    cnt -= rc;
            }
        
    return len;
    }

    int Send(SOCKET fd, char *szText, int len)
    {
        
    int cnt;
        
    int rc;
        
    cnt = len;
        
    while (cnt > 0)
            {
            
    rc = send(fd, szText, cnt, 0);
            
    if (rc == SOCKET_ERROR)
                {
                
    return  - 1;
                }
            
    if (rc == 0)
                
    return len - cnt;
            
    szText += rc;
            
    cnt -= rc;
            }
        
    return len;
    }

    服务器端:

    在服务器端,主要是启动Socket和监听线程。

    #define DEFAULT_PORT 2000
    void CServerDlg::OnStart()
    {
        
    sockaddr_in local;
        
    DWORD dwThreadID = 0;
        
    local.sin_family = AF_INET;
        
    //设置的端口为DEFAULT_PORT。
        
    local.sin_port = htons(DEFAULT_PORT);
        
    //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
        
    local.sin_addr.S_un.S_addr = INADDR_ANY;
        
    //初始化Socket
        
    m_Listening = socket(AF_INET, SOCK_STREAM, 0);
        
    if (m_Listening == INVALID_SOCKET)
            {
            
    return ;
            }
        
    //将本地地址绑定到所创建的套接字上
        
    if (bind(m_Listening, (LPSOCKADDR) &local, sizeof(local)) == SOCKET_ERROR)
            {
            
    closesocket(m_Listening);
            
    return ;
            }
        
    //创建监听线程,这样也能响应界面上操作。
        
    m_hListenThread = ::CreateThread(NULL, 0, ListenThread, this, 0,
                &
    dwThreadID);
        
    m_StartBtn.EnableWindow(FALSE);
        
    m_StopBtn.EnableWindow(TRUE);
    }

    //监听线程函数:
    WORD WINAPI CServerDlg::ListenThread(LPVOID lpparam)
    {
        
    CServerDlg *pDlg = (CServerDlg*)lpparam;
        
    if (pDlg == NULL)
            
    return 0;
        
    SOCKET Listening = pDlg->m_Listening;
        
    //开始监听是否有客户端连接。
        
    if (listen(Listening, 40) == SOCKET_ERROR)
            {
            
    return 0;
            }
        
    char szBuf[MAX_PATH];
        
    //初始化
        
    memset(szBuf, 0, MAX_PATH);
        
    while (1)
            {
            
    SOCKET ConnectSocket;
            
    sockaddr_in ClientAddr;
            
    int nLen = sizeof(sockaddr);
            
    //阻塞直到有客户端连接,不然多浪费CPU资源。
            
    ConnectSocket = accept(Listening, (sockaddr*) &ClientAddr, &nLen);
            
    //都到客户端的IP地址。
            
    char *pAddrname = inet_ntoa(ClientAddr.sin_addr);
            
    pDlg->Receive(ConnectSocket, szBuf, 100);
            
    //界面上显示请求数据。
            
    pDlg->SetRequestText(szBuf);
            
    strcat(szBuf, " :我是老猫,收到(");
            
    strcat(szBuf, pAddrname);
            
    strcat(szBuf, ")");
            
    //向客户端发送回应数据
            
    pDlg->Send(ConnectSocket, szBuf, 100);
            }
        
    return 0;
    }

    服务器端一直在监听是否有客户端连接,如有连接,处理客户端的请求,给出回应,然后继续监听。

    客户端:

    客户端的发送函数:

    #define DEFAULT_PORT 2000
    void CClientDlg::OnSend()
    {
        
    DWORD dwIP = 0;
        
    TCHAR szText[MAX_PATH];
        
    memset(szText, 0, MAX_PATH);
        
    m_IP.GetWindowText(szText, MAX_PATH);

        
    //把字符串形式的IP地址转成IN_ADDR结构需要的形式。
        
    dwIP = inet_addr(szText);
        
    m_RequestEdit.GetWindowText(szText, MAX_PATH);
        
    ockaddr_in local;
        
    SOCKET socketTmp;

        
    //必须是AF_INET,表示该socket在Internet域中进行通信
        
    local.sin_family = AF_INET;

        
    //端口号
        
    local.sin_port = htons(DEFAULT_PORT);

        
    //服务器的IP地址。
        
    local.sin_addr.S_un.S_addr = dwIP;

        
    //初始化Socket
        
    socketTmp = socket(AF_INET, SOCK_STREAM, 0);

        
    //连接服务器
        
    if (connect(socketTmp, (LPSOCKADDR) &local, sizeof(local)) < 0)
            {
            
    closesocket(socketTmp);
            
    MessageBox("连接服务器失败。");
            
    return ;
            }

        
    //发送请求,为简单只发100字节,在服务器端也规定100字节。
        
    Send(socketTmp, szText, 100);
        
    //读取服务器端返回的数据。
        
    memset(szText, 0, MAX_PATH);

        
    //接收服务器端的回应。
        
    Receive(socketTmp, szText, 100);
        
    CHAR szMessage[MAX_PATH];
        
    memset(szMessage, 0, MAX_PATH);
        
    strcat(szMessage, szText);

        
    //界面上显示回应数据。
        
    m_ReplyBtn.SetWindowText(szMessage);
        
    closesocket(socketTmp);
    }

     

     

     

    客户端就一个函数完成了一次通信。在这里IP地址为何用127.0.0.1呢?使用这个IP地址,服务器端和客户端就能运行在同一台机器上,这样调试方便多了。当然你可以在你朋友的机器上运行Server程序(本人在局域网中测试过),在自己的机器上运行Client程序,当然输入的IP地址就该是你朋友机器的IP地址了。
    简单的理论和实践都说了,现在Socket编程不神秘了吧?希望对你有些帮助。

    展开全文
  • MFC中利用CSocket实现UDP通信,亲测真实可用,开发工具是visual studio 2013
  • UDP的打通是关键,控制的理念要看各自的项目要求
  • MFC中利用CSocket实现UDP通信

    千次下载 热门讨论 2012-05-09 18:02:24
    MFC中利用CSocket实现UDP通信
  • UDP通信MFC实现

    2015-05-23 15:33:52
    为了学习UDP,简单的通过MFC进行实现,仅供学习。代码实测通过。
  • MFC socket UDP通信

    2011-01-04 13:55:00
    Socket在哪里呢?在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。 图2原来Socket在这里。...前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多

    Socket在哪里呢?
    在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。


    图2

    原来Socket在这里。
    Socket是什么呢?
    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
    你会使用它们吗?
    前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
    一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。

     

    图3

    先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
    在这里我就举个简单的例子,我们走的是TCP协议这条路(见图2)。例子用MFC编写,运行的界面如下:

     


    图4

     


    图5

    在客户端输入服务器端的IP地址和发送的数据,然后按发送按钮,服务器端接收到数据,然后回应客户端。客户端读取回应的数据,显示在界面上。
    下面是接收数据和发送数据的函数:

    int Receive(SOCKET fd, char *szText, int len)
    {
        
    int cnt;
        
    int rc;
        
    cnt = len;
        
    while (cnt > 0)
         {
            
    rc = recv(fd, szText, cnt, 0);
            
    if (rc == SOCKET_ERROR)
             {
                
    return  - 1;
             }
            
    if (rc == 0)
                
    return len - cnt;
            
    szText += rc;
            
    cnt -= rc;
         }
        
    return len;
    }

    int Send(SOCKET fd, char *szText, int len)
    {
        
    int cnt;
        
    int rc;
        
    cnt = len;
        
    while (cnt > 0)
         {
            
    rc = send(fd, szText, cnt, 0);
            
    if (rc == SOCKET_ERROR)
             {
                
    return  - 1;
             }
            
    if (rc == 0)
                
    return len - cnt;
            
    szText += rc;
            
    cnt -= rc;
         }
        
    return len;
    }

    服务器端:

    在服务器端,主要是启动Socket和监听线程。

    #define DEFAULT_PORT 2000
    void CServerDlg::OnStart()
    {
        
    sockaddr_in local;
        
    DWORD dwThreadID = 0;
        
    local.sin_family = AF_INET;
        
    //设置的端口为DEFAULT_PORT。
        
    local.sin_port = htons(DEFAULT_PORT);
        
    //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
        
    local.sin_addr.S_un.S_addr = INADDR_ANY;
        
    //初始化Socket
        
    m_Listening = socket(AF_INET, SOCK_STREAM, 0);
        
    if (m_Listening == INVALID_SOCKET)
         {
            
    return ;
         }
        
    //将本地地址绑定到所创建的套接字上
        
    if (bind(m_Listening, (LPSOCKADDR) &local, sizeof(local)) == SOCKET_ERROR)
         {
            
    closesocket(m_Listening);
            
    return ;
         }
        
    //创建监听线程,这样也能响应界面上操作。
        
    m_hListenThread = ::CreateThread(NULL, 0, ListenThread, this, 0,
             &
    dwThreadID);
        
    m_StartBtn.EnableWindow(FALSE);
        
    m_StopBtn.EnableWindow(TRUE);
    }

    //监听线程函数:
    WORD WINAPI CServerDlg::ListenThread(LPVOID lpparam)
    {
        
    CServerDlg *pDlg = (CServerDlg*)lpparam;
        
    if (pDlg == NULL)
            
    return 0;
        
    SOCKET Listening = pDlg->m_Listening;
        
    //开始监听是否有客户端连接。
        
    if (listen(Listening, 40) == SOCKET_ERROR)
         {
            
    return 0;
         }
        
    char szBuf[MAX_PATH];
        
    //初始化
        
    memset(szBuf, 0, MAX_PATH);
        
    while (1)
         {
            
    SOCKET ConnectSocket;
            
    sockaddr_in ClientAddr;
            
    int nLen = sizeof(sockaddr);
            
    //阻塞直到有客户端连接,不然多浪费CPU资源。
            
    ConnectSocket = accept(Listening, (sockaddr*) &ClientAddr, &nLen);
            
    //都到客户端的IP地址。
            
    char *pAddrname = inet_ntoa(ClientAddr.sin_addr);
            
    pDlg->Receive(ConnectSocket, szBuf, 100);
            
    //界面上显示请求数据。
            
    pDlg->SetRequestText(szBuf);
            
    strcat(szBuf, " :我是老猫,收到(");
            
    strcat(szBuf, pAddrname);
            
    strcat(szBuf, ")");
            
    //向客户端发送回应数据
            
    pDlg->Send(ConnectSocket, szBuf, 100);
         }
        
    return 0;
    }

     

    服务器端一直在监听是否有客户端连接,如有连接,处理客户端的请求,给出回应,然后继续监听。

    客户端:

    客户端的发送函数:

    #define DEFAULT_PORT 2000
    void CClientDlg::OnSend()
    {
        
    DWORD dwIP = 0;
        
    TCHAR szText[MAX_PATH];
        
    memset(szText, 0, MAX_PATH);
        
    m_IP.GetWindowText(szText, MAX_PATH);

        
    //把字符串形式的IP地址转成IN_ADDR结构需要的形式。
        
    dwIP = inet_addr(szText);
        
    m_RequestEdit.GetWindowText(szText, MAX_PATH);
        
    ockaddr_in local;
        
    SOCKET socketTmp;

        
    //必须是AF_INET,表示该socket在Internet域中进行通信
        
    local.sin_family = AF_INET;

        
    //端口号
        
    local.sin_port = htons(DEFAULT_PORT);

        
    //服务器的IP地址。
        
    local.sin_addr.S_un.S_addr = dwIP;

        
    //初始化Socket
        
    socketTmp = socket(AF_INET, SOCK_STREAM, 0);

        
    //连接服务器
        
    if (connect(socketTmp, (LPSOCKADDR) &local, sizeof(local)) < 0)
         {
            
    closesocket(socketTmp);
            
    MessageBox("连接服务器失败。");
            
    return ;
         }

        
    //发送请求,为简单只发100字节,在服务器端也规定100字节。
        
    Send(socketTmp, szText, 100);
        
    //读取服务器端返回的数据。
        
    memset(szText, 0, MAX_PATH);

        
    //接收服务器端的回应。
        
    Receive(socketTmp, szText, 100);
        
    CHAR szMessage[MAX_PATH];
        
    memset(szMessage, 0, MAX_PATH);
        
    strcat(szMessage, szText);

        
    //界面上显示回应数据。
        
    m_ReplyBtn.SetWindowText(szMessage);
        
    closesocket(socketTmp);
    }

    客户端就一个函数完成了一次通信。在这里IP地址为何用127.0.0.1呢?使用这个IP地址,服务器端和客户端就能运行在同一台机器上,这样调试方便多了。当然你可以在你朋友的机器上运行Server程序(本人在局域网中测试过),在自己的机器上运行Client程序,当然输入的IP地址就该是你朋友机器的IP地址了。
    简单的理论和实践都说了,现在Socket编程不神秘了吧?希望对你有些帮助。

    展开全文
  • MFC UDP广播

    2018-10-01 14:35:00
    基于MFC对话框的广播通信,可以同时收发广播,如果本机端口和接受端口设置一样则自己可以收到自己发的信息,如果不想受到自己的消息设置不同端口号就行,vs2013下测试可以正常使用
  • MFC UDP CSocket实现局域网通信

    千次阅读 2015-05-04 12:18:11
    派生一个MyScoket 基于CSocket #include ...3) 用返回的套接字和客户端进行通信(recvfrom); 4) 关闭套接字 客户端:(发送端) 1) 创建套接字(socket) 2) 向服务器发送数据(sendto 3) 关闭套接字
  • 学习mfcUDP协议的网络通信代码。很有参考价值!
  • 我创建了十个发送线程,延迟sleep(1),一个接收线程,希望发送10000包/秒,实际用抓包工具看的时间每次不一样,1~16秒之间发10000包都可能,我该如何达到固定的10000包/秒?
  • MFC]UDP通信的简单实现

    千次阅读 2018-04-13 13:18:34
    1. UDP和TCP最大的区别: 1) TCP最大的特点就是面向连接、安全可靠,也就是说TCP通信必须要先建立连接,并且通信过程需要时时校验,如果数据有误需要重发; 2) UDP最大的特点就是面向无连接,不可靠,也就是说不用...
  • [MFC]UDP通信的简单实现

    万次阅读 2015-07-21 15:00:56
     2) UDP最大的特点就是面向无连接,不可靠,也就是说不用建立连接就直接向目标发送信息,并且通信过程中不做任何校验,如果数据丢失或者有误也不管;  3) 听上去UDP非常的无用,但其实不然,UDP最大
  • MFC SOCKET 双向通信,包括基于 UDP 协议的客户端/服务器端,基于 TCP 协议的客户端/服务器端
  • MFC UDP TCP 聊天

    2012-07-12 16:47:16
    MFC UDP和TCP聊天于一体,使用前自由选择使用何种协议 编写程序实现一个基于UDP 模式的通信程序和一个基于TCP 模式的通信程序。 基本要求:能输入计算机的IP地址和端口号,能输入、发送文本信息和显示接受的文本信息...
  • MFC下利用继承CSocket类 实现UDP通信源代码
  • 基于MFCUDP局域网通信

    热门讨论 2011-07-04 14:50:15
    MFC开发,UDP协议,可在两台电脑上,各打开一个客户端一个服务器端,互相通信

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,648
精华内容 1,859
关键字:

mfc的udp通信