流套接字编程.docx

上传人:b****8 文档编号:8990012 上传时间:2023-02-02 格式:DOCX 页数:11 大小:140.66KB
下载 相关 举报
流套接字编程.docx_第1页
第1页 / 共11页
流套接字编程.docx_第2页
第2页 / 共11页
流套接字编程.docx_第3页
第3页 / 共11页
流套接字编程.docx_第4页
第4页 / 共11页
流套接字编程.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

流套接字编程.docx

《流套接字编程.docx》由会员分享,可在线阅读,更多相关《流套接字编程.docx(11页珍藏版)》请在冰豆网上搜索。

流套接字编程.docx

流套接字编程

实验四流套接字编程

一、实验目的:

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、此次实验耗费我很多时间,不知道可否继续下去,好好研究一下作为该科课程设计?

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1