苏州市职业大学
实习(实训)报告
名称 实用网络程序设计实训
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)