




已阅读5页,还剩44页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络编程课程实验指导书实验七 HTTP协议客户端编程实现1 实验目的与要求掌握浏览web网页的原理,深入理解HTTP原理以及HTML语言的功能,运用流式套接字下载web网页文件,分别用文本方式和浏览器方式打开下载的网页文件。同时运用ChtmlView类编写浏览器软件。运用ChtmlView类开发浏览器程序,比较两者的异同.2、实验内容第一部分:编写并理解程序,利用流式套接字与web服务器建立TCP连接,然后向服务器发送Get命令,接收服务器的内容,把接收到的信息保存在一个文件中,然后打开该文件,观察文件的内容.第二部分: 运用ChtmlView类开发浏览器程序3 实验原理模拟explorer部分功能,与web服务器的80端口建立TCP连接,接下来向web服务器发送一Get命令,服务器会把应答信息和web网页的内容传输过来.4、实验步骤编写并调试程序,选择一个web服务器,寻找共IP地址,如:邵阳学院 0搜狐 新浪 13在程序中填入该web服务器的Ip地址,运行程序,打开接收的文本文件,观察文件的内容。并在实验报告中填写下述内容。接收文件的第一部分的应答信息内容是什么? 接收文件的第二部分的内容是什么?用ChtmlView类开发浏览器程序有什么特点?主要仪器设备:安装有VC+6.0的PC机。要求撰写实验报告,填写实验结果。附录:第一部分的程序如下#pragma comment(lib,ws2_32.lib)#include #include #include void main()WSADATA wsaData;SOCKET s;FILE *fp1;/文件指针SOCKADDR_IN saddr;int result;/整形变量,用于记录接收数据的字节数int port=80;/http服务器的默认端口WSAStartup(MAKEWORD(2,2),&wsaData);s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);/创建TCP套接字saddr.sin_family=AF_INET;saddr.sin_port=htons(port);saddr.sin_addr.S_un.S_addr=inet_addr(0);/的IP地址connect(s,(SOCKADDR*) &saddr, sizeof(saddr);/请求与web服务器建立TCP连接char sendbuff400,strB1025;/定义发送缓冲区和接收缓冲区strcpy(sendbuff,GET /index.html HTTP/1.1rnHost:rnrn);/字符串拷贝send(s,sendbuff,strlen(sendbuff),0);/传送http请求报文fp1=fopen(E:pp1.html,w);/打开E:pp.html,把接收报文保存在该文件中result = 1;/以下每次最多只接收1024字节,其中result为接收的字节数while(result0)strset(strB, );result=recv(s,strB,1024,0);/接收http应答报文fwrite(strB,1,result,fp1);/把strB的数据写入fp所指的文件,以1个字节为单位,写入result个字节strBresult=0;/为显示在屏幕上,加字符串结束标记printf(%s,strB);/以字符串的形式显示的屏幕上 /实际接收的字节数大于0,继续接收fclose(fp1);/关闭文件closesocket(s);/关闭套接字WSACleanup();/关闭动态链接库第二部分的操作如下1 建立工程SelfBrowser基于”单文档”, 工具栏样式为:”类似IE”,最后一步的CselfBrowserView基于ChtmlView类2 打开资源视图(ResourceView),点击对话框资源(Dialog),再点击IDR_MAINFRAME选项卡,如图所示:剪切“TODO:对话框布局”,在该位置添加一编辑框和命令按钮,把命令按钮的标题改为”浏览”,把编辑框的ID号改为”ID_EDIT_ADDRESS”,如图所示3 点击“建立类向导”出会现如下界面,选定”Select an existing class”后,点击”OK”,出现下面的界面选定CmainFrame类后,点击”select”再点击“确定”后,完成建立类向导的操作。4 双击“浏览”按钮,为该按钮添加成员函数,其代码如下:CString sWebAddress;m_wndDlgBar.GetDlgItem(IDC_EDIT_ADDRESS)-GetWindowText(sWebAddress);(CHtmlView*)GetActiveView()-Navigate(sWebAddress);5 打开类视图,找到“CSelfBrowserView”类的OnInitialUpdate函数更改其中的内容,使其的默认网页为””6 打开”MainFrm.h”文件,在类(CMainFrame)定义中加入成员函数的声明afx_msg void OnInputAddress();在”MainFrm.cpp”中添加函数的实现afx_msg void CMainFrame:OnInputAddress()/其代码与“浏览”按钮的代码相同再在该文件BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间添加如下代码:ON_COMMAND(IDOK,OnInputAddress)7 打开资源视图,添加如下菜单项,各菜单项的ID标志和相关信息菜单项IDPrompt代码CSelfBrowserView后退(&B)ID_BACK转到上一页n后退GoBack()前进(&F)ID_FORWARD转到下一页n前进GoForward()主页(&H)ID_HOME转到主页n主页GoHome()停止(&S)ID_STOP停止加载页n停止Stop()刷新(&R)ID_REFRESH刷新当前页n刷新Refresh()源文件(&C)ID_CODE显示网页文件n源文件进入”查看功能”,选定”建立类向导”,选定”CSelfBrowserView”类,找到各菜单项对应的ID号,添加其相应的成员函数8 自定义工具栏在资源视图中点击ToolBar-IDR_MAINFRAME添加图标,画出图标的图形,按回车,为图标定义ID及相关信息图标项IDPrompt代码CSelfBrowserView后退(&B)ID_TOOLBACK转到上一页n后退GoBack()前进(&F)ID_TOOLFORWARD转到下一页n前进GoForward()进入”查看功能”,选定”建立类向导”,选定”CSelfBrowserView”类,找到各图标项对应的ID号,添加其相应的成员函数9 使标题标随页面不同而改变为视图类CSelfBrowserView添加虚成员函数OnDocumentComplete()添加代码如下:(CMainFrame*)GetParentFrame()-SetURL(lpszURL);GetDocument()-SetTitle(lpszURL);在MainFrm.h文件的类定义中声明void SetURL(LPCTSTR lpszURL);在MainFrm.cpp中实现该方法,其代码为m_wndDlgBar.GetDlgItem(IDC_EDIT_ADDRESS)-SetWindowTextA(lpszURL);在SelfBrowserView.cpp文件的前面添加如下代码#include “MainFrm.h”10 使用WinInet类的功能为工程添加一个对话框点击”资源视图”-Dialog-右击(选插入Dialog)得到一个对话框,删除“确定按钮”,把“取消”按钮改为”关闭”。添加一个文本框。如下图所示:为工程添加一个新类,类名为CHtmlCodeViewDlg,其基类为CDialog,Dialog ID为IDD_DIALOG1添加菜单项”源文件”的成员函数与代码查看-类向导-选CselfBrowserView类,选中ID_CODE,选COMMAND双击添加的代码如下:CHtmlCodeViewDlg dlg;dlg.DoModal();在文件SelfBrowserView.cpp的前部添加如下代码#include “HtmlCodeViewDlg.h”在HtmlCodeViewDlg.cpp文件的前部包含如下代码#include “MainFrm.h”#include “afxinet.h”在MainFrm.h的类定义中,把变量m_wndDlgBar的声明改为public在CHtmlCodeViewDlg类中,为编辑框添加成员变量m_htmlCode :CString 添加CHtmlCodeViewDlg类的初始成员函数点击”建立类向导”-选择CHtmlCodeViewDlg类,在object ID栏选CHtmlCodeViewDlg,在右边message栏选WM_INITDIALOG双击添加如下代码:CWaitCursor wait;CInternetSession session(Self Net);CStdioFile *pFile=NULL;CString sWebAddress;(CMainFrame*)GetParentFrame()-m_wndDlgBar).GetDlgItem(IDC_EDIT_ADDRESS)-GetWindowText(sWebAddress);pFile=session.OpenURL(sWebAddress);if(pFile!=NULL)CString str,allText=,crlf=rn;while(pFile-ReadString(str)allText+=crlf+str;this-m_htmlCode=allText;UpdateData(false);pFile-Close();实验六 Ping命令的编程实现1 实验目的与要求掌握原始套接字的使用,深入理解ICMP协议和IP协议的首部结构,理解ping命令的工作原理,运用原始套接字实现ping命令的功能,注意计算校验和的算法.2、实验内容编写并理解程序,利用原始套接字传输ICMP包给目标主机,实现ping命令的功能。实现结果如下:ping 0的结果3 实验原理Ping命令的功能是测试两台主台是否连通,由一台主机发送一个ICMP的回送/请求与应答报文至另一台主机,然后接收应合报文,测试数据发送与接收的往返时间,IP包中的TTL值以及ICMP报文中附加数据的字节数.4、实验步骤首先确定一台开启的机器,可以是Internet网络上的任何一台主机,也可以是局域网上的一台工作站,但必须保证该机器是开启的,并没有禁用ICMP请求应答报文,找到该机器的IP地址,填入程序中的相应位置上,然后运行程序,记录结果。并在实验报告中填写下述内容。目的主机的IP地址为:_每次发送ICMP包的个数:_运行结果:ICMP首部应填的内容主要仪器设备:安装有VC+6.0的PC机。要求撰写实验报告,填写实验结果。附录:参考程序#include /Winsock API头文件#include #include #pragma comment(lib,ws2_32.lib) /Winsock API连接库文件/BYTEunsigned char,自定义类型/USHORTunsigned short,自定义类型/ULONGunsigned long,自定义类型typedef unsigned char BYTE;typedef unsigned short USHORT;typedef unsigned long UNLONG;/IP首部结构typedef struct iphdr/IP首部结构体BYTE h_len:4; /首部长度指的是IP层头部占32bit字的数目 /(也就是IP层头部包含多少个4字节,实际字节数4*hlen),BYTE version:4; /IP版本号BYTE tos; /服务类型TOSUSHORT total_len; /IP包总长度 USHORT ident; /标识USHORT frag_and_flags; /标志位BYTE ttl; /生存时间BYTE proto; /协议USHORT checksum; /IP首部校验和ULONG sourceIP; /源IP地址(32位)ULONG destIP; /目的IP地址(32位)IpHeader;/*ICMP头 结构*/typedef struct _ihdrBYTE i_type; /类型 发出的ICMP为8(ICMP_ECHO_REQUEST),接受到的ICMP为0BYTE i_code; /代码USHORT i_cksum; /ICMP包校验和USHORT i_id; /识别号(一般用进程号作为标识号)USHORT i_seq; /报文序列号(一般设置为0)IcmpHeader;USHORT checksum(USHORT *,int); /函数声明:计算ICMP包校验和void main()/初始化SocketWSADATA wsaData;WSAStartup(MAKEWORD(2,2), /Socket版本号 &wsaData /指向WSADATA数据结构的指针 );SOCKET sockRaw;/定义原始套接字/创建原始套接字sockRaw=socket(AF_INET,/协议族(AF_INET: TCP_IP) 3,/SOCK_RAW,/套接字类型(原始套接字) IPPROTO_ICMP/协议类型(ICMP协议) );/设置目的IPchar ICMP_DEST_IP20;/目标主机IP点分十进制地址sprintf(ICMP_DEST_IP,0); /IP目标地址SOCKADDR_IN dest,from;/地址结构memset(&dest,0,sizeof(dest);dest.sin_addr.S_un.S_addr=inet_addr(ICMP_DEST_IP);dest.sin_family=AF_INET;char *icmp_data;/ICMP包地址指针int attachsize=32;/发送的ICMP数据包附加字节数,本程序默认为32字节char *attachdata;/ICMP包附加数据存贮区指针attachdata=(char*)malloc(attachsize);/创建一个32字节的存贮区memset(attachdata,a,attachsize);/ICMP包数据部分 填充attachsize字节aint datasize=sizeof(IcmpHeader)+attachsize;/ICMP数据包总大小(头+体)icmp_data=(char*)malloc(datasize);/根据上面计算的结果为ICMP包分配内存memset(icmp_data,0,datasize);/清0(IcmpHeader *)icmp_data)-i_type=8;/类型为8(IcmpHeader *)icmp_data)-i_code=0;/代码为0(IcmpHeader *)icmp_data)-i_id=1;/(USHORT)GetCurrentProcessId();(IcmpHeader *)icmp_data)-i_seq=0;/序列号 0 memcpy(icmp_data+sizeof(IcmpHeader),attachdata,attachsize);/把ICMP包数据部分复制过来/计算ICMP包校验和(IcmpHeader *)icmp_data)-i_cksum=0;/使ICMP校验和字段初始化为0(IcmpHeader *)icmp_data)-i_cksum=checksum(USHORT *)icmp_data,datasize);/调用函数计算校验和printf(Pinging %s with %d bytes of data:nn,ICMP_DEST_IP,attachsize);DWORD timeuse;/往返时间int n=20;/发送数据包个数,循环次数int fromlen=sizeof(SOCKADDR);/地址长度char *recvbuf;/接收ICMP应答包存贮区域指针recvbuf=(char*)malloc(300);/接收应答ICMP的IP包存贮区,300字节的存贮区int ret;/API函数的返回值,接收数据函数的返回值DWORD start;/发送ICMP包起始时间for(int i=1;ih_len*4;/IP首部长度attachlen=ret-iphdrlen-sizeof(IcmpHeader);/计算附加数据段的大小printf(Reply from %s: bytes=%d time=%dms TTL=%dn,ICMP_DEST_IP,attachlen,timeuse,(IpHeader *)recvbuf)-ttl);/IP地址 附加数据长度 往返时间 TTLclosesocket(sockRaw);/关闭套接字WSACleanup();/释放动态链接库system(pause);/计算ICMP数据包校验和USHORT checksum(USHORT *buffer,int size)LONG cksum=0;while(size1)cksum=cksum+*buffer;buffer+;size-=sizeof(USHORT);if(size)cksum=cksum+*(BYTE*)buffer;cksum=(cksum16)+(cksum&0xffff);cksum=(cksum16)+(cksum&0xffff);return (USHORT) (cksum);实验五 聊天软件的开发1 实验目的与要求掌握互连网中继聊天协议IRC的原理,理解聊天软件的工作模式,基于VC+6.0设计一个简单的群聊程序.2、实验内容三人以上为一组,其中一个同学为群聊软件的服务器端,另外同学为群聊软件客户端,服务器开启后公布其IP地址和端口号,客户端用服务器的IP地址和端口号进行登录,观察服务器与客户端的显示的结果,然后由客户端发送群聊消息,观察服务器与各客户端的显示结果.3 实验原理聊天程序一般采用互连网中继聊天协议,即双方即时通信的过程中必须通过第三方中转,第三方为服务器,聊天程序一般采用UDP协议,在基于UDP协议的基础中,聊天天遵守一种约定某一种约定,这种约定规定了”进行聊天室”,”发送聊天信息”和”离开聊天室”数据传输格式,中转者(服务器)通过接收客户端不同的数据格式来进行判断消息发送者的欲进行的操作.然后对消息进行处理后再进行转发.登录消息格式:第一个字节为1+用户名离开消息格式:第一个字节为3+用户名群聊消息格式:第一个字节为2+用户名+”:”+群聊消息。服务器根据接收到的不同消息格式做出不同的处理。4、实验步骤3人以上为一组,一人确定为服务器,公布自己的IP地址和端口号,并针对该IP地址与端口号运行服务器程序,进行“开启服务器”操作,客户端针对服务器的IP地址与端口号运行客户端程序进行登录,发送聊天消息,离开聊天室。实验完成后,总结实验结果。主要仪器设备:安装有VC+6.0的PC机。要求撰写实验报告,填写实验结果。附录:操作指南注意,如采用复制操作,则自始至终均需与该附录的相同.一、服务器端1 建立工程SelfRoom基于对话框, 不包含window Sockets类添加控件如下图所示2 为控件添加成员变量编号控件名称ControlValue1IP地址ServerIP 2端口号ServerPortsPort :CString3显示列表框m_ListWords4开启按钮m_Start5关闭按钮m_Close6退出按钮m_Quit3 添加”开启”、”关闭”按钮的成员函数4 在SelfRoomDlg.h文件的类定义前添加如下几行代码#pragma comment(lib,ws2_32.lib”)#include #include #include /定义一个结构体,用户记录在线用户的信息typedef struct userchar usrname10;/用户名unsigned long ip;/IP地址unsigned short int port;/端口号 User,*pUser;在SelfRoomDlg.h文件的类定义中添加如下代码,即m_server等是该类的成员变量:SOCKET m_server;/套接字变量SOCKADDR_IN saddr,caddr;/两个三元组地址int usrcont;/记录聊天室在线人数的变量User user100;/用于保存在线用户的信息5 在CselfRoomDlg类的初始化成员函数的尾部(return语句前)添加如下代码WSADATA wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);/ 加载动态链接库usrcont=0;/在线人数初始化为0m_Close.EnableWindow(false);/关闭按钮不可用6 添加 ”开启”、”关闭”和”退出”按钮的成员函数的代码:” 开启”按钮UpdateData(true);m_server=socket(AF_INET,SOCK_DGRAM,0);WSAAsyncSelect(m_server,m_hWnd,20000,FD_READ|FD_CLOSE);BYTE nFild4;CString sIP;ServerIP.GetAddress(nFild0,nFild1,nFild2,nFild3);sIP.Format(%d.%d.%d.%d,nFild0,nFild1,nFild2,nFild3);saddr.sin_family=AF_INET;saddr.sin_port=htons(atoi(sPort);saddr.sin_addr.S_un.S_addr=inet_addr(sIP);int len=sizeof(SOCKADDR);bind(m_server,(SOCKADDR*)&saddr,len);/使套接字绑定地址m_ListWords.InsertString(-1,聊天室已开启,等待成员加入);m_Start.EnableWindow(false);/使开启按钮不可用m_Close.EnableWindow(true);/用离开按纽可用m_Quit.EnableWindow(false);/退了按纽不可用”关闭”按钮if(usrcont)AfxMessageBox(还有用户没有下线,不能关闭!);elsem_Start.EnableWindow(true);m_Close.EnableWindow(false);m_Quit.EnableWindow(true);closesocket(m_server);”退出”按钮WSACleanup();/释放动态链接库8 为主对话框类CSelfRoomDlg添加虚成员函数PreTranslateMessage(),并添加如下代码:if(pMsg-message=20000)this-ReceiveData();else9为主对话框类CSelfRoomDlg添加成员函数void ReceiveData();添加的方法是:先在头文件SelfRoomDlg.h的类定义中进行成员函数声明,然后在SelfRoomDlg.cpp文件中进行函数的实现,这两个函数的代码如下:ReceiveData()函数char buff100;/接收数据缓冲区memset(buff,0,100);/把缓冲区每个字节置0int len=sizeof(SOCKADDR);/地址长度int num=recvfrom(m_server,buff,100,0,(SOCKADDR*)&caddr,&len);/从套接字接收数据至buff中WSAAsyncSelect(m_server,m_hWnd,20000,FD_READ|FD_CLOSE);pUser ptemp;/定义一个结构体指针if(buff0=1)/接收的是登录信息ptemp=user+usrcont;/指向userusrcont,user数组的第一个空单元memcpy(ptemp-usrname,buff+1,10);/保存用户名ptemp-ip=ntohl(caddr.sin_addr.S_un.S_addr);/保存地址ptemp-port=ntohs(caddr.sin_port);/保存端口号CString sTemp;/定义一个临时变量sTemp.Format(%s,%s:%d,ptemp-usrname,inet_ntoa(caddr.sin_addr),ptemp-port); /存放用户名和地址信息至sTemp中m_ListWords.InsertString(-1,sTemp+已加入);/显示sTemp.Format(%s登录成功,sTemp);/sendto(m_server,sTemp,sTemp.GetLength(),0,(SOCKADDR*)&caddr,len);/向登录用户发登录成功的信息sTemp.Format(%s已加入,ptemp-usrname);/向已在线的用户发.已加入的消息for(int i=0;iip);caddr.sin_port=htons(ptemp-port);sendto(m_server,sTemp,sTemp.GetLength(),0,(SOCKADDR*)&caddr,len);usrcont+;/在线用户数增加1else if(buff0=3)User pptemp;/定义一结构体变量ptemp=&pptemp;/ptem指向这一结构体变量memcpy(ptemp-usrname,buff+1,10);/取出离开用户的用户名至ptemp-usrname成员中CString sname;sname.Format(%s,ptemp-usrname);/用户名取至sname变量中CString sTemp;sTemp.Format(%s,%s:%d,ptemp-usrname,inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port);m_ListWords.InsertString(-1,sTemp+已离开);sTemp.Format(%s与服务器断开,sTemp);sendto(m_server,sTemp,sTemp.GetLength(),0,(SOCKADDR*)&caddr,len);/向申请离开的用户发消息sTemp.Format(%s已离开,ptemp-usrname);int temp;/记录申请离开的用户在user数组的位置/向其它用户发送for(int i=0;iusrname,sname)=0)temp=i;elsecaddr.sin_addr.S_un.S_addr=htonl(ptemp-ip);caddr.sin_port=htons(ptemp-port);sendto(m_server,sTemp,sTemp.GetLength(),0,(SOCKADDR*)&caddr,len); /删除user数组中的第temp个元素,后面元素前移一个位置 for(i=temp;iip=ntohl(caddr.sin_addr.S_un.S_addr);ptemp-port=ntohs(caddr.sin_port);CString sTemp,sTemp1,sTemp2;sTemp.Format(%s:%s:%d,sname,inet_ntoa(caddr.sin_addr),ptemp-port);str=str.Right(str.GetLength()-(n+1);sTemp1.Format(%s,str);SOCKADDR_IN tempaddr;sTemp2.Format(%s说:%s,sTemp,sTemp1);m_ListWords.InsertString(-1,sTemp2);for(int i=0;iusrname,sname)tempaddr.sin_family=AF_INET;tempaddr.sin_addr.S_un.S_addr=htonl(ptemp-ip);tempaddr.sin_port=htons(ptemp-port);sendto(m_server,sTemp2,sTemp2.GetLength(),0,(SOCKADDR*)&tempaddr,len);以上工作完成后,便可以编译运行二、客户端1 建立工程SelfChat基于对话框, 不包含window Sockets类添加控件如下图所示2 为控件添加成员变量编号控件名称ControlValue1您的昵称编辑框m_Usrm_strName :CString2端口号m_portstrport :CString3发送信息框m_EditWordsm_strMessage :CString4显示列表框m_ListWords4聊天室IP地址ServerIP3 添加“登录”、“离开”、“发送”、“退出”按钮的成员函数4 打开文件SelfChatDlg.h,在SelfChatDlg.h类定义的前面添加如下代码#pragma comment(lib,”ws2_32.lib”)#include #include #include typedef struct infochar type;char sname10; INFO,*pINFO;在CSelfChatDlg类定义中添加如下代码,即m_client等是该类的成员变量:SOCKET m_client;SOCKADDR_IN saddr;5 在CSelfChatDlg类的初始化函数OnInitDialog()的尾部(return语句前)添加以下代码WSADATA wsaData;WSAStartup(MAKEWORD(2,2),&wsaData);/打开动态链接库6 添加“登录”、“离开”、“发送”、“退出”按钮的成员函数的代码:”登录”按钮成员函数代码UpdateData(true);m_client=socket(AF_INET,SOCK_DGRAM,0);WSAAsyncSelect(m_client,m_hWnd,10000,FD_READ);BYTE nFild4;CString sip;ServerIP.GetAddress(nFild0,nFild1,nFild2,nFild3);sip.Format(%d.%d.%d.%d,nFild0,nFild1,nFild2,nFild3);saddr.sin_family=AF_INET;saddr.sin_addr.S_un.S_addr=inet_addr(sip);saddr.sin_port=htons(atoi(strport);char *buff=(char*)malloc(sizeof(INFO);memset(buff,0,sizeof(INFO);pINFO pu=(pINFO)buff;pu-type=1;memcpy(pu-sname,m_strName,m_strName.GetLength();int len=sizeof(SOCKADDR);sendto(m_client,buff,sizeof(INFO),0,(SOCKADDR*)&saddr,len);”离开”按钮成员函数代码UpdateData(true);m_client=socket(AF_INET,SOCK_DGRAM,0);WSAAsyncSelect(m_client,m_hWnd,10000,FD_READ|FD_CLOSE);BYTE nFild4;CString sip;ServerIP.GetAddress(nFild0,nFild1,nFild2,nFild3);sip.Format(%d.%d.%d.%d,nFild0,nFild1,nFild2,nFild3);saddr.sin_family=AF_INET;saddr.sin_addr.S_un.S_addr=inet_addr(sip);saddr.sin_port=htons(atoi(strport);char *buff=(char*)malloc(sizeof(INFO);memset(buff,0,sizeof(INFO);pINFO pu=(pINFO)buff;pu-type=3;memcpy(pu-sname,m_strName,m_strName.GetLength();CString pp;pp.Format(%d%s,pu-type,pu-sname);int len=sizeof(SOCKADDR);sendto(m_client,buff,sizeof(INFO),0,(SOCKADDR*)&saddr,len);closesocket(m_client);”发送”按钮成员函数代码UpdateData(true);char *buff=(char*)malloc(sizeof(INFO);char pu=2;m_ListWords.InsertString(-1,本人已发送:+m_strMessage);CString pp;pp.Format(%d%s:%s,pu,m_strName,m_strMessage+0);int len=sizeof(SOCKADDR);sendto(m_client,pp,pp.GetLength(),0,(SOCKADDR*)&saddr,len);”退出”按钮成员函数代码WSACleanup();/释放socket库7为主对话框类CSelfChatDlg添加虚成员函数PreTranslateMessage(),并添加如下代码:if(pMsg-message=10000)this-ReceiveData();else8为主对话框类CSelfChatDlg添加成员函数void ReceiveData();添加的方法是:先在头文件SelfChatDlg.h的类定义中进行成员函数声明,然后在SelfChatDlg.cpp文件中进行函数的实现,这两个函数的代码如下:ReceiveData()函数char buff100;SOCKADDR_IN caddr;memset(buff,0,100);int len=sizeof(SOCKADDR);int num=recvfrom(m_client,buff,100,0,(SOCKADDR*)&caddr,&len);WSAAsyncSelect(m_client,m_hWnd,10000,FD_READ|FD_CLOSE);m_ListWords.InsertString(-1,buff);以上工作完成后,便可以编译运行实验四 数据报套接字的编程实验1、实验目的与要求:深入理解UDP协议,掌握API数据报套接字的编程方法,运用API相关函数实现UDP协议,进行客户端与服务器之间的数据通信,分别编写出客户端与服务器端的程序,并调试运行。2、实验内容:两位同学各选一台网络终端,彼此记住对方的IP地址,约定服务器的一个端口号(大于10000),运用Windows API函数实现UDP连接,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CAS 907-2024面向分布式天然气供应的智能化系统技术要求
- T/CCOA 76-2023浓香核桃油
- 北京市消费类预付费服务交易合同行为指引(试行)(标准版)5篇
- 有关印刷品订货合同7篇
- 专业版抵押房子借款协议8篇
- T/ZRCX 004-2018集成灶
- 眼科疾病常用穴位
- T/ZHCA 105-2022灵芝子实体
- 癫痫预防与急救
- 健康促进单位创建课件
- 2025年广东广州市高三二模高考英语试卷试题(含答案详解)
- 《公路技术状况评定》课件-任务三:路基技术状况指数SCI
- 交通运输行业反腐心得体会
- 基因突变和基因重组第1课时课件高一下学期生物人教版必修2
- 外墙清洗施工方案
- 中华民族共同体概论知到课后答案智慧树章节测试答案2025年春丽水学院
- 2024年山东枣庄事业单位招聘笔试真题
- 太阳能路灯采购安装方案投标文件(技术方案)
- 黑龙江商业职业学院《生活中的科学》2023-2024学年第二学期期末试卷
- 2025年中国校园外卖行业市场深度评估及投资战略规划报告
- 电网工程设备材料信息参考价(2024年第四季度)
评论
0/150
提交评论