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

2/22/2017来源:ASP.NET技巧人气:2979

[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;   }