【windows】C++网络编程一

来源:互联网 发布:mac秋冬色号推荐 编辑:程序博客网 时间:2024/05/21 09:03

  #include <winsock2.h>
#pragma comment(lib,"WS2_32.lib")

以下实现简单的基于TCP协议的C/S程序

         1. 编写服务端

           主要流程:

             加载ws2_32.dll    ==》 创建套字节 ==》 绑定端口  ==》监听  ==》 接收/发送  ==》 关闭套字节   ==》 释放ws2_32.dll

           

           SocketServer.cpp :

[cpp] view plain copy
  1. #include "StdAfx.h"  
  2. #include "SocketServer.h"  
  3.   
  4. using namespace std;  
  5. /** 
  6.  * 功能描述:服务端类 
  7.  * 作者:herong 
  8.  * 日期:2011/12/06 
  9.  */  
[cpp] view plain copy
  1. SocketServer::SocketServer(const char* ip,const u_short port)  
  2. {     
  3.     //用来接收winsocket实现的细节  
  4.     WSADATA wsaData;  
  5.     //初始化ws2_32.dll动态链接库  
  6.     //提供给调用方可使用的最高版本号,高位为副版本号,低位为主版本号  
  7.     WSAStartup(MAKEWORD(2,2),&wsaData);  
  8.     //创建套字节  
  9.     SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);  
  10.     sockaddr_in sockaddr;  
  11.     sockaddr.sin_family = PF_INET;  
  12.     sockaddr.sin_addr.S_un.S_addr = inet_addr(ip);  
  13.     sockaddr.sin_port = htons(port);  
  14.     //绑定IP地址和端口  
  15.     int iResult = bind(s,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));  
  16.     if (iResult == SOCKET_ERROR) {  
  17.         //关闭套字节  
  18.         closesocket(s);  
  19.         s = INVALID_SOCKET;   
  20.         //释放ws2_32.dll动态链接库  
  21.         WSACleanup();  
  22.         throw "绑定IP地址和端口失败!";  
  23.     }  
  24.   
  25.     //监听  
  26.     iResult = listen(s,1);  
  27.     if (iResult == SOCKET_ERROR) {  
  28.         //关闭套字节  
  29.         closesocket(s);  
  30.         s = INVALID_SOCKET;   
  31.         //释放ws2_32.dll动态链接库  
  32.         WSACleanup();  
  33.         throw "监听失败!";  
  34.     }  
  35.   
  36.       
  37.     SOCKADDR clientAddr;  
  38.     int nSize = sizeof(SOCKADDR);  
  39.     clientSock = accept(s,(SOCKADDR*)&clientAddr,&nSize);  
  40.     if (clientSock == INVALID_SOCKET) {  
  41.         //关闭套字节  
  42.         closesocket(s);  
  43.         s = INVALID_SOCKET;   
  44.         //释放ws2_32.dll动态链接库  
  45.         WSACleanup();  
  46.         throw "接受连接失败!";  
  47.     }  
  48.     cout<< "服务器已启动"<<std::endl;  
  49. }  
  50.   
  51.   
  52. SocketServer::~SocketServer(void)  
  53. {  
  54.     //关闭客户端套字节  
  55.     closesocket(clientSock);  
  56.     //关闭套字节  
  57.     closesocket(s);  
  58.     //释放ws2_32.dll动态链接库  
  59.     WSACleanup();  
  60. }  
  61.   
  62. int SocketServer::sendMsg(char* msg){  
  63.     return send(clientSock,msg,strlen(msg)+sizeof(char),NULL);  
  64. }  
  65.   
  66. int SocketServer::recvMsg(string& msg) {  
  67.     int recvByte = 0;  
  68.     char recvMsg[BUF_SIZE] = {0};  
  69.     recvByte = recv(clientSock,recvMsg,BUF_SIZE,0);  
  70.     msg.append(recvMsg);  
  71.     cout<<"收到信息("<<recvByte<<"):"<< msg <<std::endl;  
  72.   
  73.     return recvByte;  
  74. }  
  75.   
  76. void SocketServer::start() {  
  77.   
  78.     try {  
  79.         string msg;  
  80.         while (TRUE) {  
  81.             recvMsg(msg);  
  82.             dispacth(msg.c_str());  
  83.             msg.clear();  
  84.         }  
  85.   
  86.   
  87.     } catch (...) {  
  88.         cout << "出现异常";  
  89.         exit(-1);  
  90.     }  
  91.   
  92. }  
  93.    
  94. void SocketServer::dispacth(const char * msg) {  
  95.   
  96.     cout << "CMD:"<<msg<<std::endl;  
  97.     if (!strcmp(msg,"exit")) {  
  98.         cout<<"客户端退出!";  
  99.         exit(0);  
  100.     }   
  101.   
  102.     if (!strcmp(msg,"getInfo")) {  
  103.         char* getInfo ="查询结果!";  
  104.         sendMsg(getInfo);  
  105.         return;  
  106.     }   
  107.   
  108.     char* noneInfo ="无信息!";  
  109.     sendMsg(noneInfo);  
  110.   
  111.   
  112. }  


         2. 编写客户端程序

            主要流程:

             加载ws2_32.dll    ==》 创建套字节 ==》 连接服务端    ==》 接收/发送  ==》 关闭套字节   ==》 释放ws2_32.dll

           

           ClientSocket.cpp :

 

[cpp] view plain copy
  1. #include "StdAfx.h"  
  2. #include "ClientSocket.h"  
  3.   
  4. using namespace std;  
  5.   
  6. /** 
  7.  * 功能描述:客户端类 
  8.  * 作者:herong 
  9.  * 日期:2011/12/06 
  10.  */  
[cpp] view plain copy
  1. ClientSocket::ClientSocket(const char* ip,const u_short port)  
  2. {  
  3.     //用来接收winsocket实现的细节  
  4.     WSADATA wsaData;  
  5.     //初始化ws2_32.dll动态链接库  
  6.     //提供给调用方可使用的最高版本号,高位为副版本号,低位为主版本号  
  7.     WSAStartup(MAKEWORD(2,2),&wsaData);  
  8.     //创建套字节  
  9.     server = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);  
  10.     sockaddr_in sockaddr;  
  11.     sockaddr.sin_family = PF_INET;  
  12.     sockaddr.sin_addr.S_un.S_addr = inet_addr(ip);  
  13.     sockaddr.sin_port = htons(port);  
  14.     //连接服务器  
  15.     int iResult = connect(server,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));  
  16.     if (iResult == SOCKET_ERROR) {  
  17.         //关闭套字节  
  18.         closesocket(server);  
  19.         server = INVALID_SOCKET;  
  20.         //释放ws2_32.dll动态链接库  
  21.         WSACleanup();  
  22.         throw "连接服务器失败!";  
  23.     }  
  24. }  
  25.   
  26.   
  27. ClientSocket::~ClientSocket(void)  
  28. {  
  29.     //关闭套字节  
  30.     closesocket(server);  
  31.     server = INVALID_SOCKET;  
  32.     //释放ws2_32.dll动态链接库  
  33.     WSACleanup();  
  34. }  
  35.   
  36. int ClientSocket::sendMsg(char* msg,int len) {  
  37.     cout<<"发送信息:"<<msg<<std::endl;  
  38.     return send(server,msg,strlen(msg)+sizeof(char),0);  
  39.     //return send(server,msg,len,0);  
  40.   
  41. }  
  42.   
  43. int ClientSocket::recvMsg(string& msg) {  
  44.     int recvByte = 0;  
  45.     char recvMsg[BUF_SIZE] = {0};  
  46.     recvByte = recv(server,recvMsg,BUF_SIZE,0);  
  47.     msg.append(recvMsg);  
  48.     cout<<"收到信息("<<recvByte<< "):" << msg <<std::endl;  
  49.   
  50.     return recvByte;  
  51. }  
  52.   
  53. void ClientSocket::start(){  
  54.   
  55.     try {  
  56.         char cmd[512] = {0};  
  57.         string msg;  
  58.         while (TRUE) {  
  59.             cin >> cmd;  
  60.             sendMsg(cmd,1024);  
  61.             if (!strcmp(cmd,"exit")){  
  62.                 cout << "退出系统!";  
  63.                 break;  
  64.             }  
  65.             recvMsg(msg);  
  66.             msg.clear();  
  67.             msg.clear();  
  68.         }  
  69.   
  70.   
  71.     } catch (...) {  
  72.         cout << "出现异常";  
  73.         exit(-1);  
  74.     }  
  75.   
  76. }  


 

        3. 编写服务端主程序

[cpp] view plain copy
  1. // server.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "SocketServer.h"  
  6.   
  7. int _tmain(int argc, _TCHAR* argv[])  
  8. {  
  9.   
  10.     SocketServer server("127.0.0.1",8080);  
  11.     server.start();  
  12.     return 0;  
  13. }  


           4. 编写客户端主程序

[cpp] view plain copy
  1. // client.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "ClientSocket.h"  
  6.   
  7. int _tmain(int argc, _TCHAR* argv[])  
  8. {  
  9.     ClientSocket client("127.0.0.1",8080);  
  10.     client.start();  
  11.     return 0;  
  12. }  

           演示:

       

原创粉丝点击