流套接字编程.docx
《流套接字编程.docx》由会员分享,可在线阅读,更多相关《流套接字编程.docx(11页珍藏版)》请在冰豆网上搜索。
流套接字编程
实验四流套接字编程
一、实验目的:
1、熟悉并掌握socket的基本函数的使用。
2、应用流套接字实现网络程序。
二、实验平台:
Window2000
VC6.0
三、实验内容
应用流套接字编写客户端与服务端进行聊天的程序。
(1)VC的使用
(2)流套接字的通信模型
(3)windowAPI的线程应用
四、实验过程
1、调试聊天服务端的程序(由于时间有限下面只讲述客户端程序!
)
2、编写并调试客户端的程序
客户端程序实现步骤:
(1)新建只包含基本对话框的工程。
(2)在对话框中添加并设置以下控件:
控件列表(listctrl),两个文本框(edit1,edit2),发送及连接按钮(button1,button2,Button3).
(3)右击CSocketDlg类,给控件增加变量及方法
IDC_LIST1对应变量为:
m_ListText类型为control
IDC_Send(发送)m_Send类型control加功能函数
IDC_DestIP(IP地址)m_DestIP类型control
IDC_SendEdit(数据发送)加变量m_SendEdit
IDC_Connect(连接)加变量m_Connect,加功能函数
IDC_Apart(断开)加变量m_Apart.
(4)在CSocketDlg.h中导入winsock.h及#pragmacomment(lib,”wsock32.lib”),
同时增加以下成员变量:
(5)在CSocket.h中导入CSocketDlg.h,并声明线程函数
UINTthread(LPVOIDv)
(6)在CSocket.ccp中实现UINTthread(LPVOIDv)
5、一些重要函数及变量的映射设定
六、实验重要函数详细代码:
1)线程UINTthread(LPVOIDv)
UINTthread(LPVOIDv)
{
charbuff[100];
chararray[25][100]={"127.0.0.1"};
CSizesize;
size.cx=0;
size.cy=30;
ints=1,addcount=0;
CCSocketDlg*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(inti=0;i<=65000;i++)
for(intj=0;j<=200;j++);
if(addcount==25)
addcount=0;
dlg->cli.sin_addr.s_addr=inet_addr(array[addcount++]);
}
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!
=SOCKET_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);
return0;
}
2)发送函数OnSend()的实现:
voidCCSocketDlg:
:
OnSend()
{
charbuff[100];
CSizesize;
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)连接函数
voidCCSocketDlg:
:
OnConnect()
{
charipaddress[35]={'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表示连接申请
AfxBeginThread(thread,0);//调用线程实现通信
}
4)暂时断开
voidCCSocketDlg:
:
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、此次实验耗费我很多时间,不知道可否继续下去,好好研究一下作为该科课程设计?