zoukankan      html  css  js  c++  java
  • [C++] C++socket套接字网络通讯实例

    //服务器端:
    #include "winsock2.h"  
    #include <string>
    #pragma comment(lib, "ws2_32.lib")  //附加依赖lib库 也可以在属性中设置
    #include<iostream>
    using namespace std;

    //数据库相关

    int main()
    {
            
            WSADATA         wsd;            //WSADATA变量  
            SOCKET          sServer;        //服务器套接字  用来监听
            SOCKET          sClient;        //客户端套接字  连接
            SOCKADDR_IN     addrServ;;      //服务器地址  
            const int BUF_SIZE = 500;
            char            buf[BUF_SIZE];  //接收数据缓冲区  
            char            sendBuf[BUF_SIZE];//返回给客户端得数据  
            int             retVal;         //返回值  
            //初始化套结字动态库  代码健壮
            if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
            {
                    cout << "WSAStartup failed!" << endl;
                    return 1;
            }

            //开始创建服务端socket
            //创建套接字  AF_INET:ipv4   SOCK_STREAM:使用tcp
            sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (INVALID_SOCKET == sServer)
            {
                    cout << "socket failed!" << endl;
                    WSACleanup();//释放套接字资源;  
                    return  -1;
            }

            //服务器套接字地址   
            addrServ.sin_family = AF_INET;//IPv4 
            addrServ.sin_port = htons(4999);//设置端口 建议大于1024
            addrServ.sin_addr.s_addr = INADDR_ANY; //表示接受任何客户端的请求

            //绑定套接字  绑定服务端socket 和 端口
            retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
            if (SOCKET_ERROR == retVal)
            {
                    cout << "bind failed!" << endl;
                    closesocket(sServer);   //关闭套接字  
                    WSACleanup();           //释放套接字资源;  
                    return -1;
            }

            //开始监听   
            retVal = listen(sServer, 10);
            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);//使用sClient进行数据收发
            if (INVALID_SOCKET == sClient)
            {
                    cout << "accept failed!" << endl;
                    closesocket(sServer);   //关闭套接字  
                    WSACleanup();           //释放套接字资源;  
                    return -1;
            }

            while (1)
            {
                    //接收客户端数据  
                    ZeroMemory(buf, BUF_SIZE);//初始化 buf  用 0填充
                    ZeroMemory(sendBuf, BUF_SIZE);
                    retVal = recv(sClient, buf, BUF_SIZE, 0);
                    if (SOCKET_ERROR == retVal)
                    {
                            cout << "recv failed!" << endl;
                            closesocket(sServer);   //关闭套接字  
                            closesocket(sClient);   //关闭套接字       
                            WSACleanup();           //释放套接字资源;  
                            return -1;
                    }

                    cout << "set:" << buf << endl;
                    //向客户端发送数据
                    cout << "go:";
                    cin >> sendBuf;
                    send(sClient, sendBuf, strlen(sendBuf), 0);
            }
            

            //关闭连接 释放资源
            closesocket(sServer);   //关闭套接字  
            closesocket(sClient);   //关闭套接字  
            WSACleanup();           //释放套接字资源;  

            system("pause");
            return 0;
    }

    //客户端:
    #include "winsock2.h"  
    #include <string>
    #include <iostream>  
    #pragma comment(lib, "ws2_32.lib")

    using namespace std;

    int main()
    {
            WSADATA wsd; //WSADATA变量  
            SOCKET sHost; //客户端套接字  
            SOCKADDR_IN servAddr; //服务器地址  

            const int BUF_SIZE = 500;
            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;
            //如果编译通不过 属性 c++ 常规  sdl 改成否
            char inte[20];
            scanf("%s",inte);
            servAddr.sin_addr.s_addr = inet_addr(inte);//设置服务端地址  这里表示本机
            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 (1)
            {
                    //向服务器发送数据  
                    ZeroMemory(buf, BUF_SIZE);
                    cout << "go:";
                    cin >> buf;
                    // 包装数据:   指令标记 :  内容
                    //                                                1-100 
                    //                                                1:登录  username - passeord 2:注册  3 查询  4 更新数据库 5 .....
                    /*
                            struct info
                            {
                                    int                flag; 指令
                                    char*  username;
                                    char* password;
                                    其他结构体
                            }
                            
                    */
                    retVal = send(sHost, buf, strlen(buf), 0);
                    if (SOCKET_ERROR == retVal)
                    {
                            cout << "send failed!" << endl;
                            closesocket(sHost); //关闭套接字  
                            WSACleanup(); //释放套接字资源  
                            return -1;
                    }
                    ZeroMemory(bufRecv, BUF_SIZE);
                    recv(sHost, bufRecv, BUF_SIZE, 0); // 接收服务器端的数据
                    cout << endl << "set:" << bufRecv;
                    cout << " ";
            }
            

            closesocket(sHost); //关闭套接字  
            WSACleanup(); //释放套接字资源  
            system("pause");
            return 0;
    }

    用dev-c++编译socket代码时需要更改 工具-编译器选项 的第二栏为-lwsock32

  • 相关阅读:
    栈的压入,弹出序列
    json格式实现批量删除
    ExtJS pagingtoolbar的使用
    Unknown initial character set index '45' received from server. Initial client ch
    事务的原子性
    整合Struts2.2+Spring3.0
    两种方法判断输入是否整数
    使用三种不同循环结构对1+2+3+...+100 求和
    使用循环的方式输出对应图形
    系统任务栏图标透明且无法打开解决办法 for Windows
  • 原文地址:https://www.cnblogs.com/56843268qqq/p/12335002.html
Copyright © 2011-2022 走看看