首页 > 编程 > C++ > 正文

Windows下C++服务端和客户端Socket通信简单代码

2019-11-08 00:48:14
字体:
来源:转载
供稿:网友
[cpp] view plain copy<PRe name="code" class="cpp">// Client.cpp : Defines the entry point for the console application.  //  #include "stdafx.h"  #include "winsock2.h"  #include <iostream>  #pragma comment(lib, "ws2_32.lib")  using namespace std;  BOOL    RecvLine(SOCKET s, char* buf);  //读取一行数据  int main(int argc, char* argv[])  {      const int BUF_SIZE = 64;      WSADATA         wsd;            //WSADATA变量      SOCKET          sHost;          //服务器套接字      SOCKADDR_IN     servAddr;       //服务器地址      char            buf[BUF_SIZE];  //接收数据缓冲区      char            bufRecv[BUF_SIZE];      int             retVal;         //返回值            //初始化套结字动态库      if (WSAStartup(MAKEWord(2,2), &wsd) != 0)      {          cout << "WSAStartup failed!" << endl;          return -1;      }            //创建套接字      sHost = socket(AF_INET, SOCK_STREAM, ipPROTO_TCP);        if(INVALID_SOCKET == sHost)      {          cout << "socket failed!" << endl;          WSACleanup();//释放套接字资源          return  -1;      }      //设置服务器地址      servAddr.sin_family =AF_INET;      servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");      servAddr.sin_port = htons((short)4999);      int nServAddlen  = sizeof(servAddr);      //连接服务器      retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));        if(SOCKET_ERROR == retVal)      {          cout << "connect failed!" << endl;            closesocket(sHost); //关闭套接字          WSACleanup();       //释放套接字资源          return -1;      }      while(true){          //向服务器发送数据          ZeroMemory(buf, BUF_SIZE);          cout << " 向服务器发送数据:  ";          cin >> buf;          retVal = send(sHost, buf, strlen(buf), 0);          if (SOCKET_ERROR == retVal)          {              cout << "send failed!" << endl;              closesocket(sHost); //关闭套接字              WSACleanup();       //释放套接字资源              return -1;          }          //RecvLine(sHost, bufRecv);          recv(sHost, bufRecv,5 , 0);     // 接收服务器端的数据, 只接收5个字符          cout << endl <<"从服务器接收数据:" << bufRecv;      }      //退出      closesocket(sHost); //关闭套接字      WSACleanup();       //释放套接字资源      return 0;  }  [cpp] view plain copy// Server.cpp : Defines the entry point for the console application.  //  #include "stdafx.h"  #include "winsock2.h"  #pragma comment(lib, "ws2_32.lib")  #include <iostream>  using namespace std;  int _tmain(int argc, char* argv[])  {   const int BUF_SIZE = 64;   WSADATA     wsd;    //WSADATA变量   SOCKET  sServer;    //服务器套接字   SOCKET  sClient;    //客户端套接字   SOCKADDR_IN     addrServ;;  //服务器地址   char    buf[BUF_SIZE]; //接收数据缓冲区   char    sendBuf[BUF_SIZE];//返回给客户端得数据   int     retVal;     //返回值   //初始化套结字动态库   if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)   {    cout << "WSAStartup failed!" << endl;    return 1;   }         //创建套接字   sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if(INVALID_SOCKET == sServer)   {    cout << "socket failed!" << endl;    WSACleanup();//释放套接字资源;    return -1;   }         //服务器套接字地址    addrServ.sin_family = AF_INET;   addrServ.sin_port = htons(4999);   addrServ.sin_addr.s_addr = INADDR_ANY;     //绑定套接字   retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));   if(SOCKET_ERROR == retVal)   {     cout << "bind failed!" << endl;    closesocket(sServer); //关闭套接字    WSACleanup();  //释放套接字资源;    return -1;   }         //开始监听    retVal = listen(sServer, 1);   if(SOCKET_ERROR == retVal)   {    cout << "listen failed!" << endl;      closesocket(sServer); //关闭套接字    WSACleanup();  //释放套接字资源;    return -1;   }         //接受客户端请求   sockaddr_in addrClient;   int addrClientlen = sizeof(addrClient);   sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);   if(INVALID_SOCKET == sClient)   {    cout << "accept failed!" << endl;      closesocket(sServer); //关闭套接字    WSACleanup();  //释放套接字资源;    return -1;   }         while(true){    //接收客户端数据    ZeroMemory(buf, BUF_SIZE);    retVal = recv(sClient, buf, BUF_SIZE, 0);    if (SOCKET_ERROR == retVal)    {     cout << "recv failed!" << endl;       closesocket(sServer);    //关闭套接字     closesocket(sClient);    //关闭套接字       WSACleanup();     //释放套接字资源;     return -1;    }    if(buf[0] == '0')     break;    cout << "客户端发送的数据: " << buf <<endl;        cout << "向客户端发送数据: " ;    cin >> sendBuf;        send(sClient, sendBuf, strlen(sendBuf), 0);   }         //退出   closesocket(sServer);  //关闭套接字   closesocket(sClient);  //关闭套接字   WSACleanup();   //释放套接字资源;         return 0;  }  
上一篇:c++读书简记

下一篇:protobuf C++ 使用示例

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选