1、流套接字编程实验四 流套接字编程一、 实验目的:1、 熟悉并掌握socket的基本函数的使用。2、 应用流套接字实现网络程序。二、 实验平台: Window 2000 VC6.0三、实验内容应用流套接字编写客户端与服务端进行聊天的程序。(1)VC的使用(2)流套接字的通信模型(3)windowAPI的线程应用四、实验过程1、调试聊天服务端的程序(由于时间有限下面只讲述客户端程序!)2、编写并调试客户端的程序客户端程序实现步骤:(1) 新建只包含基本对话框的工程。(2) 在对话框中添加并设置以下控件: 控件列表(listctrl),两个文本框(edit1,edit2),发送及连接按钮(butto
2、n1,button2, Button3).(3)右击CSocketDlg类,给控件增加变量及方法IDC_LIST1对应变量为:m_ListText类型为control IDC_Send(发送) m_Send 类型 control加功能函数IDC_DestIP(IP地址) m_DestIP 类型 controlIDC_SendEdit(数据发送) 加变量 m_SendEditIDC_Connect(连接) 加变量 m_Connect,加功能函数IDC_Apart(断开) 加变量 m_Apart.(4)在CSocketDlg.h中导入winsock.h及#pragma comment (lib,”
3、wsock32.lib”),同时增加以下成员变量:(5)在CSocket.h中 导入CSocketDlg.h,并声明线程函数UINT thread(LPVOID v)(6)在CSocket.ccp中实现UINT thread(LPVOID v)5、一些重要函数及变量的映射设定六、实验重要函数详细代码:1)线程UINT thread(LPVOID v) UINT thread(LPVOID v) char buff100; char array25100=127.0.0.1; CSize size; size.cx=0; size.cy=30; int s=1,addcount=0; CCSoc
4、ketDlg *dlg=(CCSocketDlg*) AfxGetApp()-GetMainWnd(); dlg-m_Connect.EnableWindow(FALSE); dlg-m_Apart.EnableWindow(TRUE); /连接到服务器 while(connect(dlg-clisock,(sockaddr*)&(dlg-cli),sizeof(dlg-cli)&dlg-ee!=0) dlg-m_SendEdit.SetWindowText(等待.); /空循环 for(int i=0;i=65000;i+) for(int j=0;jcli.sin_addr.s_addr=
5、inet_addr(arrayaddcount+); if(dlg-ee=1&dlg-Exit=0)/申请连接且断开的时候 dlg-m_ListText.InsertItem(dlg-count+,连接成功!); dlg-m_Send.EnableWindow(TRUE); dlg-SetForegroundWindow(); /循环获得数据 while(dlg-Exit=0&s!=SOCKET_ERROR&dlg-ee!=0) /调用recv函数接收数据 s=recv(dlg-clisock,buff,100,0); dlg-SetForegroundWindow(); if(s!=SOCK
6、ET_ERROR&dlg-ee!=0) dlg-m_ListText.InsertItem(dlg-count+,buff); dlg-m_ListText.Scroll(size); /发送断开命令 send(dlg-clisock,Disconnected,100,0); dlg-m_Send.EnableWindow(FALSE); dlg-m_Connect.EnableWindow(TRUE); dlg-m_Apart.EnableWindow(FALSE); closesocket(dlg-clisock); AfxEndThread(0); return 0;2)发送函数OnSe
7、nd()的实现:void CCSocketDlg:OnSend() char buff100; CSize size; size.cx=0; size.cy=30; m_SendEdit.GetWindowText(buff,99);/从编辑框中获得发送信息 m_SendEdit.SetWindowText();/刷新编辑框 m_ListText.InsertItem(count+,buff);/拆入到列表控件 m_ListText.Scroll(size);/滚动条向上滚动30个单位send(clisock,buff,100,0);/发送100个字符到clisock套接口 3)连接函数 vo
8、id CCSocketDlg:OnConnect() char ipaddress35=0,0;/定义并设置IP Exit=0;/把信息填入套接字 m_DestIP.GetWindowText(ipaddress,30); cli.sin_addr.s_addr=inet_addr(ipaddress); cli.sin_family=AF_INET; cli.sin_port=htons(8001);/设置信息出去端口号为8001,该端口必须与服务器端口号匹配 clisock=socket(AF_INET,SOCK_STREAM,0);/创建套接口 ee=1;/设置为1表示连接申请 AfxB
9、eginThread(thread,0);/调用线程实现通信 4)暂时断开void CCSocketDlg:OnApart() Exit=1;/设置断开变量为真 m_Send.EnableWindow(FALSE);/使发送无效 m_Apart.EnableWindow(FALSE);/使断开无效 m_Connect.EnableWindow(TRUE);/连接有效七、运行结果展示: 1)运行服务器端:2)运行客户端点击连接等待连接: 3)服务器端接受: 4)连接成功:5)服务器端发送消息两个客户端接收结果:6)客户端发送消息:7)客户端暂时断开:8)再次连接:9)一个客户端退出:八、实验注意(实验总结体会): 1、在界面的listctrl设置时因未明原因要设置成list,而老师讲课时说的是report !不然即使联通了也不会显示信息内容。2、此次实验的主要目地在于了解客户端与服务器端的通信主要原理,因而该试验还有不少之处有待完善。譬如:断开之时客户端无法工作了可是服务器端却认为还是连着的,又如当客户端发送数据给服务器后服务器又会返发回来(如上图),这个与通信的协议有关。3、此次实验耗费我很多时间,不知道可否继续下去,好好研究一下作为该科课程设计?
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1