多线程通讯TCP聊天程序VC资料Word文件下载.docx

上传人:b****5 文档编号:18347888 上传时间:2022-12-15 格式:DOCX 页数:11 大小:19.91KB
下载 相关 举报
多线程通讯TCP聊天程序VC资料Word文件下载.docx_第1页
第1页 / 共11页
多线程通讯TCP聊天程序VC资料Word文件下载.docx_第2页
第2页 / 共11页
多线程通讯TCP聊天程序VC资料Word文件下载.docx_第3页
第3页 / 共11页
多线程通讯TCP聊天程序VC资料Word文件下载.docx_第4页
第4页 / 共11页
多线程通讯TCP聊天程序VC资料Word文件下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

多线程通讯TCP聊天程序VC资料Word文件下载.docx

《多线程通讯TCP聊天程序VC资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《多线程通讯TCP聊天程序VC资料Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。

多线程通讯TCP聊天程序VC资料Word文件下载.docx

聊天程序是在VISUALC++6.0上编译实现的,在WINDOWS2000,XP上测试运行成功。

对客户计算机配置无特殊要求,由于所设置的最大连接进程为50,所以对服务器要求也不高。

四、关键源程序及其详细的注释

<

一>

、服务器端:

1、Socket初始化

//初始化对话框

BOOLCCSocketDlg:

:

OnInitDialog()

{

count=0;

m_list.InsertColumn(0,"

消息"

);

m_list.SetColumnWidth(0,435);

m_edit.SetLimitText(99);

for(inti=0;

i<

50;

i++)//初始化SOCKET数组

msgsock=NULL;

serv.sin_addr.s_addr=htonl(INADDR_ANY);

//设定地址

serv.sin_family=AF_INET;

serv.sin_port=5000;

//htons(5000);

addlen=sizeof(serv);

m_button.EnableWindow(FALSE);

sock=socket(AF_INET,SOCK_STREAM,0);

//创建socket

if(bind(sock,(sockaddr*)&

serv,addlen))//绑定

m_edit.SetWindowText("

绑定错误"

}else

服务器创建成功"

//显示提示信息,表示服务器创建成功

//开始侦听

AfxBeginThread(&

thread,0);

//调用线程

}

returnTRUE;

2、接收线程

//服务器线程

UINTthread(LPVOIDp)

charbuff[100];

//定义缓冲区

CSizesize;

size.cx=0;

size.cy=30;

ints=1,msgcount,loop=1,flag=0;

CCSocketDlg*dlg=(CCSocketDlg*)AfxGetApp()->

GetMainWnd();

//获得当前运行对话框句柄

msgcount=dlg->

getcount();

//获取还没有被占用的数组序号

if(msgcount==-1)//如果不等于-1,则表示,还有空缺SOCKET

loop=0;

if(loop)

s=1;

dlg->

msgsock[msgcount]=accept(dlg->

sock,(sockaddr*)&

(dlg->

serv),&

addlen));

//

用空缺的SOCKET等待客户连接

if(dlg->

msgsock[msgcount]==INVALID_SOCKET)

Erroraccept"

//如果返回错误,则提示错误

else

AfxBeginThread(thread,0);

//如果和客户端连接成功,则再次启动一个线程

SetForegroundWindow();

//显示连机成功信息

m_list.InsertItem(dlg->

count++,"

连接成功"

count++,inet_ntoa(dlg->

serv.sin_addr));

m_list.Scroll(size);

m_button.EnableWindow(TRUE);

while(s!

=SOCKET_ERROR)//如果没有发生错误,则一直循环等待数据的到来

s=recv(dlg->

msgsock[msgcount],buff,100,0);

//循环接收数据

if(s!

=SOCKET_ERROR)如果接收成功,则显示接收到的数据

count++,buff);

sendtoall(dlg->

msgsock[msgcount],buff);

//发送信息到所有的客户端

send(dlg->

msgsock[msgcount],"

Disconnected"

100,0);

//如果发生错误,发送连接中断消息到客户端

//显示相关信息

msgsock[msgcount]=NULL;

//将该SOCKET设定为空

i++)//判断是否还有其他客户在保持连接

msgsock!

=NULL)

flag=1;

if(flag!

=1)//如果没有客户连接了,则将发送按钮设置为不可用

closesocket(dlg->

msgsock[msgcount]);

//关闭连接

AfxEndThread(0);

//终止线程

return0;

3、数据发送

当用户在文本框中输入要发送的信息后,然后单击“发送”按钮,则执行以下代码。

//发送数据

voidCCSocketDlg:

OnButton1()

m_edit.GetWindowText(buff,99);

//获得当前文本框中的信息

"

//清空文本框的信息

m_list.InsertItem(count++,buff);

//向列表框中插入要发送的数据

i++)//循环向所有客户发送信息

if(msgsock!

send(msgsock,buff,100,0);

二>

、客户端

1、

连接服务器

连接服务器的程序是在“连接”按扭的单击事件中处理的。

//连接服务器,连接按扭处理事件

voidCCSocketcliDlg:

OnButton2()

charipaddress[35];

//定义标量以保存服务器地址

m_edit2.GetWindowText(ipaddress,30);

//获得服务器地址

cli.sin_addr.s_addr=inet_addr(ipaddress);

//设定SOCKET需要连接的地址

cli.sin_family=AF_INET;

cli.sin_port=5000;

//设定服务器端口

clisock=socket(AF_INET,SOCK_STREAM,0);

//创建socket

ee=1;

//启动线程

2、

接收数据线程

当用户单击“连接”按钮以后,程序进行相关设定,最后调用了“AfxBeginThread(thread,0);

”启动了该线程。

UINTthread(LPVOIDv)

chararray[25][30]=//定义数组用来存放一些IP地址

{"

192.168.0.3"

…(这里省略了部分IP)

192.168.0.30"

};

ints=1,addcount=0;

CCSocketcliDlg*dlg=(CCSocketcliDlg*)AfxGetApp()->

//获得对话框

m_connect.EnableWindow(FALSE);

m_disconnect.EnableWindow(TRUE);

while(connect(dlg->

clisock,(sockaddr*)&

cli),sizeof(dlg->

cli))&

&

dlg->

ee!

=0)//连接到服务器

等待....."

=65000;

i++)//空循环

for(intj=0;

j<

=200;

j++);

if(addcount==25)

addcount=0;

cli.sin_addr.s_addr=inet_addr(array[addcount++]);

//如果连接不成功,则连接下一个地址

ee==1)//如果连接成功,则显示相关信息

m_button1.EnableWindow(TRUE);

//设定发送按钮为可用状态

=SOCKET_ERROR&

=0)//循环获得数据

clisock,buff,100,0);

//调用recv函数接收数据

=0)//如果没有发生错误,同时没有断开连接,则显示接收到的数据

clisock,"

//如果发生错误,发送断开命令

m_button1.EnableWindow(FALSE);

//设定相关控件属性

m_connect.EnableWindow(TRUE);

m_disconnect.EnableWindow(FALSE);

clisock);

//关闭SOCKET

//终止该线程

3、

数据发送

数据发送就是客户端向服务器及其他客户端发送信息,其中向其他用户发送信息是通过服务器实现的,因此,客户只需要将消息发送到服务器就可以了。

//用户单击发送按扭,发送信息

//获得发送信息

send(clisock,buff,100,0);

//发送数据

五、执行结果及其分析。

1、开启服务器端聊天程序。

附件:

您所在的用户组无法下载或查看附件

图一:

创建服务器端(提示:

服务器创建成功)

服务器端创建成功,并自动绑定了服务器的IP。

等待客户端的连接请求,此时的发送按扭是不可用的,当有客户端连接上时发送按扭就变为可用。

在下面的编辑框里输入信息就可以发送了。

图二:

有客户端连接成功(IP地址为服务器地址)

图三:

服务器端发送“你好”并接受“客户端回复”两条信息

图四:

有客户端断开连接(提示:

Disconnected)

2、客户端程序运行。

客户端程序中输入服务器端所在的IP,然后点连接,如果成功就会提示连接成功,然后在下面的编辑框里输入信息就可以发送了。

如果连接不成功就会提示等待,此时有可能是服务器IP输入错误或是服务器端达到了最大的进程。

客户端程序可以在程序源代码中预先设置一批服务器的IP,然后点连接,如果当前显示的服务器不能连接成功,则程序自动连接预先设置的第二个IP,一直循环测试连接,当与一台服务器连接成功为时,提示连接成功,并停止循环。

图五:

客户端运行(服务器地址显示的为预先设置的IP)

图六:

客户端连接成功

 

图七:

客户端发送“你好!

”并接受“服务器端回复”两条信息

六、心得体会

经过本次课程设计,基本掌握了Winsock编程的应用,对windowsAPI函数的调用有了一定的了解,面对当前网上流行各种聊天室有了一定的认识,不再是那么神秘。

另外就是对基于服务器的并发多机信息转发技术的了解。

在聊天室程序中是这样实现的:

当某一客户机向其它客户机发送信息时,不是直接发给它,而是先发给服务器,然后由服务器分发给其它所有连接到服务器的客户机。

还有就是对VC++的学习,通过这次课设让我对VC++有了更深的认识,也了解到了它的功能的强大。

最后最重要的是将操作系统课程中所学到了理论知识应用到了实践,对其有了更深刻的认识。

七、主要参考资料:

1、计算机操作系统教程;

2、Visualc++网络通讯协议分析与应用实现(人民邮电出版社),汪晓平钟军编著;

3、MSDN参考。

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

当前位置:首页 > 党团工作 > 党团建设

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

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