|
Posted on 2009-10-20 17:07 lantionzy 阅读(2556) 评论(12) 编辑 收藏 引用 所属分类: C++ Primer 、 VC/MFC
对于聊天程序来说,即使丢失一些数据,也不会影响信息的交流,可以根据上下文的情况,知道对方所要表达的意思,或者根据对方的信息,重新发送我们所说的话。对于TCP来说,在通信前,需要经过三步握手协议以建立连接,而建立过程往往是比较消耗时间的。建立连接后,在聊天过程中,可能经过好长一段时间,双方才会说一句话,那么连接应该保持还是应先断开,等对方说话时再建立呢?也就是说,TCP协议的面向连接、数据确认和重传机制将会影响聊天的效率。所以对于聊天类的软件来说,通常都采用基于UDP的方式来实现。其特点就是不需要建立连接,也没有数据确认和重传机制,因此适时性较高。 本示例的基本实现过程是:客户端通过键盘输入数据,数据被发送到服务器。后者接收到数据后,需要进行判断,如果发来的数据串为“quit”,表明对方向退出聊天过程,于是服务器端也发送字符串“quit”,聊天过程终止;否则将接收到的信息和对方的IP地址进行格式化后,在屏幕上输出。同样在客户端也需要进行相应的判断和输出。 首先编写服务器端程序,实现代码如下:
Chat Server #pragma comment(lib,"ws2_32.lib") #include <WINSOCK2.H> #include <stdio.h>
void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested, &wsaData); if( err != 0) { return; } if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { WSACleanup(); return; } SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000); bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); char recvBuf[100]; char sendBuf[100]; char tempBuf[200]; SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); while(1) { recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len); if(!strcmp("quit", recvBuf)) { sendto(sockSrv, "quit", strlen("quit") + 1, 0, (SOCKADDR*)&addrClient, len); printf("Chat end!\n"); break; } sprintf(tempBuf, "%s say:%s\n", inet_ntoa(addrClient.sin_addr),recvBuf); printf("%s\n",tempBuf); printf("Please input data:\n"); gets(sendBuf); sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrClient, len); } closesocket(sockSrv); WSACleanup(); }
下面编写聊天客户端程序,实现代码如:
Chat Client #pragma comment(lib,"ws2_32.lib") #include <WINSOCK2.H> #include <stdio.h>
void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested, &wsaData); if( err != 0) { return; } if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { WSACleanup(); return; } SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000); char recvBuf[100]; char sendBuf[100]; char tempBuf[200]; int len = sizeof(SOCKADDR); while(1) { printf("Please input data:\n"); gets(sendBuf); sendto(sockClient, sendBuf,strlen(sendBuf)+1, 0, (SOCKADDR*)&addrSrv, len); recvfrom(sockClient, recvBuf, 100, 0, (SOCKADDR*)&addrSrv, &len); if(!strcmp("quit", recvBuf)) { sendto(sockClient, "quit", strlen("quit") + 1, 0, (SOCKADDR*)&addrSrv, len); printf("Chat end!\n"); break; } sprintf(tempBuf, "%s say:%s\n", inet_ntoa(addrSrv.sin_addr), recvBuf); printf("%s\n", tempBuf); } closesocket(sockClient); WSACleanup(); }
这样我们就实现了一个非常简单的基于UDP的网络聊天程序。 剖析网络编程(1)-- 基于TCP的的网络应用程序剖析网络编程(2)-- 基于UDP的的网络应用程序剖析网络编程(3)-- 基于TCP/UDP网络编程应注意的几个地方转到博客首页查看更多随笔
Feedback
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-20 19:45 by
给楼主提个建议: 这样的文章可能对写作者来说意义和乐趣都很大, 但是作为一个读者, 我实在感觉不出来"阅读的快感".
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-21 09:15 by
@欲三更
既然对写作者来说意义和乐趣都很大,已经很不错了。不同的文章适合不同的人看,也许对有些读者来说这个是有用的。能写出来就不是坏事,哪个牛人不是一步步走过来的?
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-21 09:18 by
@幽灵
牛人是一步一步走过来的,说的好啊,可惜我还是个菜鸟,刚起步,还在一步一步的走,什么时候能是个牛人呢............
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-21 09:40 by
@欲三更
这位大哥,你一定是个牛人,我的文章水平太低,以后多向你学习。
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-21 09:41 by
@侠客西风
我也是个菜鸟,也正在一步步走。慢慢积累吧,网上牛人多,资源也多,加油!
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-22 20:17 by
blog是什么意思? 就是为了让别人有“阅读的快感”的? 拿这个来说事,简直本末倒置。
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-26 11:25 by
以前也做过一个TCP+UDP带注册登录,在线用户实时更新,消息,文件传送的CMD程序,所有一切都是命令,好怀念啊
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-26 15:07 by
本来是来看文章的。 看到大家说这个问题,我也说两句。既然写成Blog发表出来,就是share啦。既然要share 为什么不写的更可读呢。
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-26 15:11 by
看了一遍 觉得LZ的程序真的不太需要解释了。
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2009-10-28 14:19 by
楼主文章,收藏了
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2011-01-11 08:05 by
好吧,我承认我受益匪浅
# re: 剖析网络编程(4)-- 基于UDP的简单聊天程序 回复 更多评论
2015-12-07 12:58 by
@欲三更 尼玛,这不是孙鑫的那本书上的内容吗,不过我也才看到,正在测试
|