网络编程简单例子

来源:互联网 发布:净水器 储水桶 知乎 编辑:程序博客网 时间:2024/05/01 15:38

                                                                     基于TCPC/S简单通信

之前看《VC深入详解》的时候就看过这样的例子,也在VC6.0下写过简单的C/S通信,今天看网络编程视频,在VS2008下在练习了一次。

所谓的通信简单来说就是双方socket的通信,服务器的监听socket用来监听客户端的连接请求,客户端的connect到来时,用accept后的socket进行通信。简单来说就是:

监听->连接->接受->双方通信。

具体的代码如下:

服务器端:#include "stdafx.h"#include "WinSock2.h"#include "stdio.h"#pragma comment(lib,"Ws2_32.lib")//导入库,lib表示库," "表示库的名称int _tmain(int argc, _TCHAR* argv[]){//加载WinSock库WORD wVersionRequested;WSADATA wsaData;    int err;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return 0;if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 ) {WSACleanup( );return 0;   }SOCKET lSocket,aSocket;SOCKADDR_IN AddrSer;AddrSer.sin_family=AF_INET;AddrSer.sin_port=htons(5000);AddrSer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY表示接受任何机器的请求lSocket=socket(AF_INET,SOCK_STREAM,0);//绑定服务器地址if(::bind(lSocket,(SOCKADDR*)&AddrSer,sizeof(SOCKADDR))==SOCKET_ERROR){printf("绑定套接字失败");return 0;}::listen(lSocket,1);//开始监听客户端的连接请求    SOCKADDR_IN AddrCli;//客户端的地址信息int len=sizeof(SOCKADDR);aSocket=::accept(lSocket,(SOCKADDR*)&AddrCli,&len);//连接成功时,产生新的socket用来与客户端通信char recBuf[1024];char senBuf[1024];while (1){//TCP下为recv与send,UDP下为recefrom与sendto::recv(aSocket,recBuf,1024,0);if (recBuf[0]=='#'){printf("客户端请求断开\n");printf("正在断开...");Sleep(3000);break;}printf("客户端:%s\n",recBuf);printf("服务器:");gets_s(senBuf);//warming:gets()is unsafeif (senBuf[0]=='#'){::send(aSocket,senBuf,1024,0);printf("正在请求断开...\n");Sleep(3000);return 0;}//printf("服务器:%s\n",senBuf);::send(aSocket,senBuf,1024,0);memset(recBuf,' ',1024);memset(senBuf,' ',1024);}::closesocket(aSocket);::closesocket(lSocket);::WSACleanup();return 0;}客户端:#include "stdafx.h"#include "WinSock2.h"#include "stdio.h"#pragma comment(lib,"Ws2_32.lib")int _tmain(int argc, _TCHAR* argv[]){WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 )return 0;if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 ) {WSACleanup( );return 0; }SOCKET cSocket;cSocket=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSer;addrSer.sin_family=AF_INET;addrSer.sin_port=htons(5000);addrSer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");if(::connect(cSocket,(SOCKADDR*)&addrSer,sizeof(SOCKADDR))==SOCKET_ERROR){printf("连接服务器失败");return 0; }char senBuf[1024];char recBuf[1024];while(1){printf("客户端:");gets_s(senBuf);if (senBuf[0]=='#'){::send(cSocket,senBuf,1024,0);printf("正在请求断开...\n");Sleep(3000);return 0;}//printf("客户端:%s\n",senBuf);::send(cSocket,senBuf,1024,0);::recv(cSocket,recBuf,1024,0);if(recBuf[0]=='#'){printf("与服务器断开");printf("正在断开...");Sleep(3000);break;}printf("服务器:%s\n",recBuf);memset(recBuf,' ',1024);memset(senBuf,' ',1024);}::closesocket(cSocket);::WSACleanup();return 0;}

 

之前用的比较多的是6.0,用VS起来还有点不熟。有一些地方要注意,在VC导入Ws2_32.lib库在项目LINK添加就可以了,在VS下是如何这样做的呢?另外在VS使用gets()函数都会出现警告,说是unsafe,也就是怕溢出,相应的有gets_s()函数来接受输入。我把VS2008的字体改成像VC6.0一样后,在编写的时候行头总会出现一些中文或乱码,但是过一会就消失,也不会出错,不知道怎么回事。希望有同样类似情况的朋友告诉我一下。

   以上实现的只是最简单的TCP通信,基于UDP的就更简单。最近买了网络编程实例的书,期待以后更深入的学习。