实用网络程序设计-实习(实训)

时间:2024.4.20

实习(实训)报告

 名称         实用网络程序设计实训       

                                            

20##年6月22日至 20##年6月29日共一周

学  院   计算机工程学院 

班   级    11网络技术1  

姓   名                   

院    长       李金祥        

系  主  任       刘昭斌        

指导教师于复生  吴建平


1、         实训地点:

A2-506

2、         实训时间:

20##-6-22至 20##-6-29

3、         小组成员:

4、         具体内容:

4.1面向非连接的基于UDP协议的Socket通信技术来实现聊天室

发送端的界面上有两个静态文本控件,两个文本编辑框控件和两个按钮控件。两个文本边界框需要分别定义关联的成员变量,输入IP地址的文件编辑框添加成员变量m_ip,输入信息内容的文本编辑框添加成员变量m_message。

(1)“发送”代码:

void CWlaqDlg::OnSend()

{

      UpdateData(true);

      struct MEG

      {

             int code;        

             char data[500];             

      }Meg;

      WSADATA wsaData;

      if(WSAStartup(MAKEWORD(2,2),&wsaData))

      {

             WSACleanup();

             return;

      }

      int port=8888;

      SOCKET SendSocket;

      SendSocket=socket(AF_INET,SOCK_DGRAM,0);

      if(SendSock==INVALID_SOCKET)

             return;

      struct sockaddr_in sendAddr;

      sendAddr.sin_family=AF_INET;

      sendAddr.sin_addr.s_addr=inet_addr(m_ip);

      sendAddr.sin_port=htons(port);

      if(m_message.IsEmpty())

      {

             MessageBox("没有输入发送内容!"NULL,MB_OK);

             return;

      }

      Meg.code=1;

      strcpy(Meg.data,m_message);

   if(sendto(SendSocket,(char*)&Meg,sizeof(Meg),0,(LPSOCKADDR)&sendAddr,sizeof(sendAddr))==SOCKET_ERROR)

      {

             MessageBox("发送信息错误!",NULL,MB_OK);

             return;

      }

      closesocket(SendSocket);

}

(2)“开始接收UDP包”代码:

两个静态文本控件用于显示文字;一个列表框用于显示接收到的信息,成员变量为m_show,类型为CListBox。

void CMy1233Dlg::OnRecv()

{

       struct MEG

       {

              int code;

              char data[500];

       }Meg;

       WSADATA wsaData;

       if(WSAStartup(MAKEWORD(2,2),&wsaData))

       {

              WSACleanup();

              return;

       }

       SOCKET RecvSocket;

       RecvSocket=socket(AF_INET,SOCK_DGRAM,0);

       if(RecvSocket==INVALID_SOCKET)

              return;

       int port=8888;

       struct sockaddr_in recvAddr;

       recvAddr.sin_family=AF_INET;

       recvAddr.sin_addr.S_un.S_addr=INADDR_ANY;

       recvAddr.sin_port=htons(port);

       if(bind(RecvSocket,(LPSOCKADDR)&recvAddr,sizeof(recvAddr))==SOCKET_ERROR)

              return;

       int len=sizeof(recvAddr);

       if(recvfrom(RecvSocket,(char*)&Meg,sizeof(Meg),0,(LPSOCKADDR)&recvAddr,(int*)&len)==SOCKET_ERROR)

              return;

       m_show.InsertString(-1,Meg.data);

       closesocket(RecvSocket);

}

4.2点对点聊天

界面上有四种控件,显示文字信息的是静态文本框,让用户输入信息的事文本编辑框,显示聊天信息的是列表框,别的是按钮。设置本机监听端口的文本编辑框成员变量名为m_localPort;对方监听端口文本编辑框成员变量名为m_toPort;昵称的文本编辑框成员变量名m_name;对方IP地址的文本编辑框成员变量名为m_ip;发送内容的文本编辑框成员变量为m_message;显示聊天信息的列表框成员变量为m_show,类型是CListBox.

(1)“开始聊天”的代码:

ULONG WINAPI LinsenThread(LPVOID p){

       struct MEG

       {

              char name[20];

              char data[200];

       }*pMeg;

       CMy2Dlg *pDlg=(CMy2Dlg *)p;

       CSocket ReceiveSocket;

       char *buff[256];

       CString data,name;

       int port=atoi(pDlg->m_localPort);

       ReceiveSocket.Create(port,SOCK_DGRAM);

       while(1){

              ReceiveSocket.Receive(buff,256);

              pMeg=(struct MEG*)buff;

              data=pMeg->data;

              name=pMeg->name;

              data=name+"说:"+data;

              pDlg->m_show.AddString(data);

              memset(buff,0,256);

       }

       ReceiveSocket.Close();

       return 0;

}

void CMy2Dlg::OnServer()

{

       UpdateData(true);

       CreateThread(NULL,0,LinsenThread,this,NULL,NULL);

}

(2)“发送”的代码:

void CMy2Dlg::OnSend()

{

       UpdateData(true);

       struct MEG

       {

              char name[20];

              char data[200];

       }Meg,*pMeg;

       CSocket SendSocket;

       strcpy(Meg.name,m_name);

       strcpy(Meg.data,m_message);

       pMeg=&Meg;

       int port=atoi(m_toPort);

       SendSocket.Create(1234,SOCK_DGRAM);

       SendSocket.SendTo(pMeg,sizeof(Meg),port,m_ip);

       m_show.AddString(m_name+"说:"+m_message);

       SendSocket.Close();

}

4.3实现聊天室:

(1)服务器端代码:

显示聊天信息的空间为CListBox,成员变量为m_show。

“启动服务器”:

ULONG WINAPI LinsenThread(LPVOID p){

      CStringArray m_chater;

      struct MEG

      {

             char ip[20];

             char name[20];

             char data[200];

      }Meg,*pMeg;

      CMy1237Dlg *pDlg=(CMy1237Dlg *)p;

      CSocket m_ReceiveSocket;

      char *buff[256];

      CString data,name,chatIP;

      m_ReceiveSocket.Create(8888,SOCK_DGRAM);

      while(1){

             m_ReceiveSocket.Receive(buff,256);

             pMeg=(struct MEG*)buff;

             data=pMeg->data;

             name=pMeg->name;

             if(data.IsEmpty()&&name.IsEmpty())

                    continue;

             data=name+"说:"+data;

             pDlg->m_show.InsertString(-1,data);

             chatIP=pMeg->ip;

             CString listIP;

             bool flag=0;

             int len=m_chater.GetSize();

             for(int i=0;i<len;i++)

             {

                    if(chatIP==m_chater.GetAt(i))

                    {

                           flag=1;

                           break;

                    }

             }

             if(!flag)

                    m_chater.Add(chatIP);

             len=m_chater.GetSize();

             for(int k=0;k<len;k++)

             {

                    listIP=m_chater.GetAt(k);

                    m_ReceiveSocket.SendTo(pMeg,sizeof(Meg),6666,listIP);

             }

             memset(buff,0,256);

             }

      m_ReceiveSocket.Close();

      return 0;

}

void CMy1237Dlg::OnServer()

{

      CreateThread(NULL,0,LinsenThread,this,NULL,NULL);

}

(2)聊天者端代码:

昵称的文本编辑框成员变量为m_name;输入IP地址的文本编辑框成员变量为m_ip;输入聊天信息的文本编辑框成员变量为m_message;显示聊天信息的列表框成员变量为m_show,类型为CListBox。

此外,在对话框类中定义一个CString类型的public变量m_localIP。

“开始聊天”

ULONG WINAPI LinsenThread(LPVOID p){

      struct MEG

      {

             char ip[20];

             char name[20];

             char data[200];

      }Meg,*pMeg;

      CMy2Dlg *pDlg=(CMy2Dlg *)p;

      CSocket m_ReceiveSocket;

      char *buff[256];

      CString data,name;

      m_ReceiveSocket.Create(6666,SOCK_DGRAM);

      strcpy(Meg.ip,pDlg->m_localIP);

      strcpy(Meg.name,pDlg->m_name);

      strcpy(Meg.data,"我来了");

      pMeg=&Meg;

      m_ReceiveSocket.SendTo(pMeg,sizeof(Meg),6666,pDlg->m_toIP);

      while(1){

             int n=m_ReceiveSocket.Receive(buff,256);

             if(n==0)

                    continue;

             pMeg=(struct MEG*)buff;

             data=pMeg->data;

             name=pMeg->name;

             if(data.IsEmpty()&&name.IsEmpty())

                    continue;

             data=name+"说:"+data;

             pDlg->m_show.InsertString(-1,data);

             memset(buff,0,256);

             }

      return 0;

}

void CMy2Dlg::OnEnter()

{

      UpdateData(true);

      char HostName[128];

      if(gethostname(HostName,128)!=0)

             return;

      struct hostent* pHost;

      pHost=gethostbyname(HostName);

      LPCSTR lpIP=inet_ntoa(*(struct in_addr*)pHost->h_addr_list[0]);

      m_localIP=lpIP;

      m_enter.EnableWindow(false);

      CreateThread(NULL,0,LinsenThread,this,NULL,NULL);

}

“发送”

void CMy2Dlg::OnSend()

{

      UpdateData(true);

      struct MEG

      {

             char ip[20];

             char name[20];

             char data[200];

      }Meg,*pMeg;

      CSocket m_SendSocket;

     

      strcpy(Meg.ip,m_localIP);

      strcpy(Meg.name,m_name);

      strcpy(Meg.data,m_message);

      pMeg=&Meg;

      m_SendSocket.Create(1234,SOCK_DGRAM);

      m_SendSocket.SendTo(pMeg,sizeof(Meg),8888,m_toIP);

      SendSocket.Close();

}

5、         实训总结:

       经过一个学期对《Visual C++ 网络编程技术》的学习,我学习到了基本的理论知识,了解到了C++语言程序设计的思想。通过综合运用所学的知识,发现、提出、分析和解决实际问题,锻炼实践能力。

       在为期一周的实用网络程序设计中,体会颇多,学到了很多东西。加强了对C++程序设计这门课程的认识,并且复习了自己以前学习到知识。使得我对计算机语言的学习有了更深入的了解!通过这次课程设计,我相信会为我以后的学习和工作带来很大好处,因为这是在平时的课堂和考试中不会出现的问题和考验。对于这些问题,并不是我们平时只靠课本,就可以轻易解决的。所以,锻炼了我们遇到问题,学会用自己以掌握的知识去解决具体问题的能力,进一步培养独立思考问题和解决问题的能力。

       通过训练,体会到了面向对象程序设计的方便与巧妙。懂得在进行编写一个程序之前,要有明确的目标和整体的设计思想。此外,某些具体的细节内容也相当重要。

       虽然这次课程设计是在参照程序的基础上进行的,但是我觉得对自己时一个挑战和锻炼。由于对知识的了解不够广泛,造成在设计时出现了很多不必要的麻烦和错误,而且功能上还不够完善。在以后的学习中,我会更加努力锻炼自己,提高自己,让自己写出更好更完善的程序。我相信:只要坚定信念,对自己充满信心,就可以克服一切困难


第二篇:实用网络程序设计-实习(实训)报告


实习(实训)报告

 名称         实用网络程序设计实训       

                                            

20##年6月11日至 20##年6月15日共一周

院  系   计算机工程系  

班   级    10系统集成   

姓   名                 

系 主 任       李金祥        

教研室主任        谭方勇       

指导教师于复生  吴建平

广播程序的设计

目录

1、设计分析与原理... 3

1.1网络会议室需要有以下主要功能:... 3

1.2关键技术的分析... 3

1.3广播通信... 3

2、程序流程图... 4

3、程序代码... 5

3.1广播端程序的实现代码如下:... 5

3.2接收端程序的实现代码如下:... 7

4、程序运行界面及程序运行结果... 9

4.1程序运行界面... 9

4.2程序运行结果... 10

1、设计分析与原理

1.1网络会议室需要有以下主要功能:

用户可以选择参加某个会议

用户可以在会议上发表言论,并且用户的发言会即时传递给每个参加会议的人

用户可以随时选择退出会议。需要时,还可以再加入进来。

1.2关键技术的分析

通常,根据参与一次通信的对象的多少,可以将通信分为两类:

一类是点对点通信,也称其为单播通信,TCP协议仅支持这种单播通信方式

一类是多点通信,也称为群或组通信,UDP协议既支持单播通信方式,又支持多点通信方式。

1.3广播通信

所谓广播是指一种同时与网络中所有主机进行交互数据的通信方式,传输者通过一次数据传输就可以使网络上的所有主机接收到这个数据信息。用于指示网络中所有主机的地址成为广播地址。

广播通信的主要用途是资源发现和减少网络数据流量。当需要寻找网络上存在的某个资源的IP地址时,利用广播方式即可对它进行定位。当有多个客户与一台服务器进行通信时,网络广播可以减少网络数据流量。

用于指示网络中所有主机的地址称为广播地址。广播地址有直接地址和有限地址之分。直接广播地址适合于向一个指定网络(已知网络号)发送数据包的情况,若不知道网络号,又要向本地网络发送广播数据包,就需要使用有限广播地址255.255.255.255 。

2、程序流程图

一个IP广播程序分为两部分,一个是广播端,一个是接收端。

广播流程:

3、程序代码

3.1广播端程序的实现代码如下:

// BroadcastDlg.h : header file

//

#if !defined(AFX_BROADCASTDLG_H__FC76F3D6_B780_4EE1_9A20_74CB95929FE9__INCLUDED_)

#define AFX_BROADCASTDLG_H__FC76F3D6_B780_4EE1_9A20_74CB95929FE9__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////

// CBroadcastDlg dialog

class CBroadcastDlg : public CDialog

{

// Construction

public:

   CBroadcastDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

   //{{AFX_DATA(CBroadcastDlg)

   enum { IDD = IDD_BROADCAST_DIALOG };

      // NOTE: the ClassWizard will add data members here

   //}}AFX_DATA

   // ClassWizard generated virtual function overrides

   //{{AFX_VIRTUAL(CBroadcastDlg)

   protected:

   virtual void DoDataExchange(CDataExchange* pDX);  // DDX/DDV support

   //}}AFX_VIRTUAL

// Implementation

   CString m_message;

protected:

   HICON m_hIcon;

   // Generated message map functions

   //{{AFX_MSG(CBroadcastDlg)

   virtual BOOL OnInitDialog();

   afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

   afx_msg void OnPaint();

   afx_msg HCURSOR OnQueryDragIcon();

   afx_msg void OnBroadcast();

   //}}AFX_MSG

   DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_BROADCASTDLG_H__FC76F3D6_B780_4EE1_9A20_74CB95929FE9__INCLUDED_)

3.2接收端程序的实现代码如下:

// RecvDlg.h : header file

//

#if !defined(AFX_RECVDLG_H__3C1186B6_D893_44D5_86DB_6BAB346591B3__INCLUDED_)

#define AFX_RECVDLG_H__3C1186B6_D893_44D5_86DB_6BAB346591B3__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////

// CRecvDlg dialog

class CRecvDlg : public CDialog

{

// Construction

public:

    CRecvDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

    //{{AFX_DATA(CRecvDlg)

    enum { IDD = IDD_RECV_DIALOG };

        // NOTE: the ClassWizard will add data members here

    //}}AFX_DATA

    // ClassWizard generated virtual function overrides

    //{{AFX_VIRTUAL(CRecvDlg)

    protected:

    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    //}}AFX_VIRTUAL

// Implementation

public:

    CListBox    m_show;  // 用于控制对话框中的列表框

protected:

    HICON m_hIcon;

    // Generated message map functions

    //{{AFX_MSG(CRecvDlg)

    virtual BOOL OnInitDialog();

    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

    afx_msg void OnPaint();

    afx_msg HCURSOR OnQueryDragIcon();

    afx_msg void OnRecv();

    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_RECVDLG_H__3C1186B6_D893_44D5_86DB_6BAB346591B3__INCLUDED_)

4、程序运行界面及程序运行结果

根据,一个IP广播程序分为两部分,一个是广播端,一个是接收端。首先建立这两个应用程序。

4.1程序运行界面

广播端程序运行界面如图,4-1-1:

(图4-1-1)

广播接收端程序运行界面如图,4-1-2:

(图4-1-2)

4.2程序运行结果

如图4-2-1,广播端发出信息:

(图4-2-1)

如图4-2-2,广播接收到收到信息:

(图4-2-2)

更多相关推荐:
网络编程实验报告

网络编程课程设计报告题目姓名学院专业班级学号指导教师基于Linux网络聊天室的设计陈佳悦陈雄兰信息科学技术学院网络工程网络工程10219xx021319xx0214薛卫职称副教授基于Linux网络聊天室的设计摘...

网络程序设计实验报告

目录1需求分析211电子商城网站的目的和意义212网站功能分析22电子商城网站的设计221功能模块设计222数据库设计43电子商城网站的实现531开发工具及环境配置5311开发环境5312安装及配置532程序设...

网络程序设计实验报告

实验报告课程名称指导教师实验日期院系专业班级实验地点学生姓名学号同组人实验项目名称一实验目的和要求一实验目的自写二实验要求自写1按实验内容分步骤完成实验2完成实验报告包括实验过程概述实验中遇到的问题及解决方法实...

JAVA网络程序设计实验报告

Java网络程序设计实验五JDBC班级姓名学号日期20xx68实验五JDBC一实验目的1掌握SQL语句和MYSQL数据库操作命令2掌握关系型数据库设计规则3掌握JDBC类库包使用规则二实验内容1学习SQL语言基...

网络编程实验报告

20xx年秋季学期计算机网络编程实验报告班级计121班学号12101020xx8姓名刘杰总成绩评语指导教师签字日期实验一登陆页面及菜单界面的实现一实验目的1熟悉NET程序设计方法2熟悉WindowsForm控件...

网络编程实验报告

实验一TCPSocketAPI程序设计一预备知识1网络编程基本概念网络上的计算机间的通讯实质上是网络中不同主机上的程序之间的通讯在互联网中使用IP地址来标识不同的主机在网络协议中使用端口号来标识主机上不同进程即...

网络程序设计报告

网络程序设计实验报告班级130914学号13091404姓名王文文教师张志钦目录实验说明重要提示实验1虚拟机Vmware和RedhatLinux的安装实验2RedhatLinux与Windows文件共享的设置实...

网络编程设计实验指导书

实验一JavaEE初级编程2学时1实验目的1掌握Java程序运行环境的安装与配置2掌握Tomcat服务器的安装及环境配置方法3掌握对MyEclipse的集成开发环境的配置为JavaEE程序的实验做好准备工作4掌...

Linux网络编程第二次实验报告

Linux网络编程作业(第二次)姓名:学号:班级:作业截图如下:客户端程序截图:服务端程序如下:客户端运行结果如下:服务端运行结果如下:程序运行结束后,打开txt文档结果正确,如下:第一次打开:第二次打开:过程…

网络程序设计实验报告-Winsock编程接口实验

网络程序设计实验报告实验名称Winsock编程接口实验实验类型验证型实验指导教师专业班级姓名学号电子邮件实验地点实验日期20xx年3月29日实验成绩一实验目的掌握Winsock的启动和初始化掌握gethostn...

网络程序设计实验报告-UDP通信实验

网络程序设计实验报告实验名称UDP通信实验实验类型验证型实验指导教师专业班级姓名学号电子邮件实验地点实验日期20xx年3月29日实验成绩一实验目的进一步理解WinsockAPI的调用方法了解UDP协议的工作原理...

网络编程实验报告

程序实践报告一程序实践概述1题目名称Linux程序设计基础2时间进度20xx年6月19日到20xx年7月5日3开发环境Ubunto1004二问题分析1功能说明编程实现快速排序算法实现文本文件拷贝函数copyfs...

网络程序设计实验报告(28篇)