《VC基于TCP和UDP的聊天室建立详细介绍(共13页).doc》由会员分享,可在线阅读,更多相关《VC基于TCP和UDP的聊天室建立详细介绍(共13页).doc(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上基本任务 VC TCP和UDP通信 编程语言:Visual C+语言版本:Visual C+ 6.0至 Visual Studio.NET 2008实施参考:略任务目标:建立一个VC程序,实施TCP和UDP通信。实施提示:略任务要求:1、编写两个VC程序,完成以下功能:l 一个程序为服务端,建立TCP服务端套接字。l 另外一个程序为客户端,建立TCP客户端套接字。l 这两个程序可以互联,完成一个基于TCP/IP网络的文本聊天程序。 首先,新建一个工程用来编写服务端,具体步骤是新建工程win32控制台程序工程名为PRJ1srv,然后文件新建文件C+源文件,文件名为TCP
2、srv。然后在此文件中添加如下代码:#include #include /=基于TCP聊天程序=/服务器端void main()/加载WinSock库/定义一个WORD类型的变量WORD wVersionRequested;WSADATA wsaData;int err;/使用MAKEWORD的宏去请求一个1.1版本的WinSockwVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) /如果返回值不等于0,程序退出return;/判断一下返回的版本
3、号低位值和高位值if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) /如果不是请求的winsock版本,程序调用WSACleanup函数终/止对winsock库的使用,然后返回WSACleanup( );return; /创建socket/创建流式套接字,基于TCP(SOCK_STREAM)SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);/Socket地址结构体的创建SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_
4、addr = htonl(INADDR_ANY);/转换Unsigned long型为网络字节序格式addrSrv.sin_family = AF_INET;/指定地址簇addrSrv.sin_port = htons(6000); /指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换/将套接字绑定到一个端口号和本地地址上bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR);/设置监听的最大连接数为5listen(socSrv, 5);char sendBuf100;/发送信息char recvBuf100;/接收信息
5、char tempBuf100;/存放中间数据 /定义用来接收客户端Socket的结构体 SOCKADDR_IN addrClient;int len = sizeof(SOCKADDR);/循环等待接受客户端发送请求while (1)SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len); /接收数据 recv(sockConn, tempBuf, 100, 0); if (q != tempBuf0)/如果不是q,表示是收到的数据sprintf(recvBuf, %s say: %s, inet_ntoa(addrCli
6、ent.sin_addr), tempBuf);/打印输出printf(%sn, recvBuf);printf(please input your data:n);/获取数据,得到一行数据gets(sendBuf);/发送数据send(sockConn, sendBuf, strlen(sendBuf) + 1,0);else/如果是q,表示要退出,发送一个qprintf(%s request to quit the chat platform, inet_ntoa(addrClient.sin_addr);send(sockConn, q, strlen(q) + 1, 0);break;
7、 closesocket(socSrv);WSACleanup();在使用之前须链接库函数:工程-设置-Link-输入ws2_32.lib。然后在工作区右键添加新工程到工作空间,如下图所示然后新建如下图所示工程。然后新建文件选择C+源文件,文件名为TCPclient,在此文件中添加如下代码:#include #include void main()WORD wVersionRequested;/版本号WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1, 1);/1.1版本的套接字err = WSAStartup(wVersionRequ
8、ested, &wsaData);if (err != 0)return;/加载套接字库,如果失败返回0if (LOBYTE(wsaData.wVersion) != 1 | HIBYTE(wsaData.wVersion) != 1)return;/判断高低字节是不是1,如果不是1.1的版本则退出while(1)/创建流式套接字,基于TCP(SOCK_STREAM)SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);/Socket地址结构体的创建SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr
9、 = inet_addr(127.0.0.1);/转换字符型为网络字节序格式addrSrv.sin_family = AF_INET;/指定地址簇addrSrv.sin_port = htons(6000); /指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换char sendBuf100;char tempBuf100;char recvBuf100; connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR);int len = sizeof(SOCKADDR);/while(1)/ printf(ple
10、ase input your data:n);gets(sendBuf);send(sockClient, sendBuf, sizeof(sendBuf) + 1,0);recv(sockClient, tempBuf,100,0); if (q != tempBuf0)sprintf(recvBuf, %s say: %s, inet_ntoa(addrSrv.sin_addr), tempBuf);printf(%sn, recvBuf);elseprintf(the server has been closed!n);send(sockClient, q, strlen(q) + 1,
11、0);break;/closesocket(sockClient);/关闭套接字WSACleanup();/必须调用这个函数清除参数同样在使用之前须链接库函数:工程-设置-Link-输入ws2_32.lib。必须先运行服务端程序,然后运行客户端程序,运行结果如下,详见PRJ1srv和PRJ1client1.因为服务端和客户端都是在本地机器运行,所以地址用127.0.0.1。2、编写两个新的VC程序,完成以下功能:l 一个程序为服务端,建立UDP服务端套接字。l 另外一个程序为客户端,建立UDP客户端套接字。l 这两个新程序可以互联,完成一个基于TCP/IP网络的文本聊天程序。 首先,新建一个工
12、程用来编写服务端,具体步骤是新建工程win32控制台程序工程名为PRJ2srv,然后文件新建文件C+源文件,文件名为UDPsrv。然后在此文件中添加如下代码:#include #include /=基于UDP聊天程序=/服务器端void main()/加载winsock的库WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return;if ( LOBY
13、TE( 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); /绑定套接字和本地服务端口bin
14、d(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR);char sendBuf100;/发送信息char recvBuf100;/接收信息char tempBuf100;/存放中间数据int len = sizeof(SOCKADDR); /定义一个地址结构体SOCKADDR_IN addrClient;while (1) /接收数据recvfrom(sockSrv, tempBuf, sizeof(tempBuf), 0, (SOCKADDR*)&addrClient, &len);if (q != tempBuf0)/如果不是q,表示是收到的数据
15、sprintf(recvBuf, %s say: %s, inet_ntoa(addrClient.sin_addr), tempBuf);/打印输出printf(%sn, recvBuf);printf(please input your data:);/获取数据,得到一行数据gets(sendBuf);/发送数据sendto(sockSrv, sendBuf, strlen(sendBuf) + 1,0, (SOCKADDR*)&addrClient, len);else/如果是q,表示要退出,发送一个qprintf(%s request to quit the chat platform
16、, inet_ntoa(addrClient.sin_addr);sendto(sockSrv, q, strlen(q) + 1, 0, (SOCKADDR*)&addrClient, len);break;/关闭套接字closesocket(sockSrv);WSACleanup();在使用之前须链接库函数:工程-设置-Link-输入ws2_32.lib。然后在工作区右键添加新工程到工作空间,新建win32控制台程序,名字为PRJ2Client,然后新建一个名为UDPclient的C+源文件,代码如下:#include #include void main()WORD wVersionRe
17、quested;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);/定义地址结构体变量
18、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 sendBuf100;/发送数据char tempBuf100;/临时数据存储char recvBuf100;/接收数据int len = sizeof(SOCKADDR);while(1)printf(please input your data:n);/获取键盘上面的数据gets(sendBuf)
19、;/发送数据sendto(sockClient, sendBuf, sizeof(sendBuf) + 1,0, (SOCKADDR*)&addrSrv, len);/等待回复信息recvfrom(sockClient, tempBuf, 100, 0, (SOCKADDR*)&addrSrv, &len); /如果第一个字符是q,表示要退出if (q != tempBuf0)sprintf(recvBuf, %s say: %s, inet_ntoa(addrSrv.sin_addr), tempBuf);printf(%sn, recvBuf);elseprintf(the server has been closed!n);sendto(sockClient, q, strlen(q) + 1,0, (SOCKADDR*)&addrSrv, len);break;closesocket(sockClient);WSACleanup();同样在使用之前须链接库函数:工程-设置-Link-输入ws2_32.lib。必须先运行服务端程序,然后运行客户端程序,运行结果如下,详见PRJ2srv和PRJ2client. 专心-专注-专业