//服务器端:
#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 << "\n";
        }
        

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

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

[C++] C++socket套接字网络通讯实例的更多相关文章

  1. 【网络编程】Socket套接字网络编程模型

    一.Linux网络模型 -- Socket套接字编程 图片:Socket 抽象层 Socket编程--不同协议,统一接口 Socket的实质就是一个接口, 利用该接口,用户在使用不同的网络协议时,操作 ...

  2. C#2.0 Socket套接字编程之实例初探 200

    首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以 ...

  3. 网络编程初识和socket套接字

    网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...

  4. 19 网络编程--Socket 套接字方法

    1.Socket(也称套接字)介绍 socket这个东东干的事情,就是帮你把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装好了 ,你只需要调用几行代码,就可以给别的机器发消息 ...

  5. 网络编程基础之Socket套接字

    一.Socket介绍 1.什么是socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族 ...

  6. 8.7 day28 网络编程 socket套接字 半连接池 通信循环 粘包问题 struct模块

    前置知识:不同计算机程序之间的数据传输 应用程序中的数据都是从程序所在计算机内存中读取的. 内存中的数据是从硬盘读取或者网络传输过来的 不同计算机程序数据传输需要经过七层协议物理连接介质才能到达目标程 ...

  7. [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]

    [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...

  8. 网络编程之socket套接字

    目录 socket套接字简介 socket模块 通信循环 代码优化 连接循环 半连接池 黏包问题 解决黏包问题 黏包问题特殊情况(文件过大) socket套接字简介 由于操作OSI七层是所有C/S架构 ...

  9. java 25 - 3 网络编程之 Socket套接字

    Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...

随机推荐

  1. DNS域名解析之正向解析

    DNS域名解析之正向解析 1.DNS介绍 2.DNS正向解析实验 1.DNS定义:DNS是"域名系统"的英文缩写.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地 ...

  2. LNMP平台的redis对接安装

    LNMP平台的redis对接安装 目录 LNMP平台的redis对接安装 一.安装LNMP的各个组件 二.安装redis服务 三.安装redis扩展 四.修改php配置文件 五.测试连接 一.安装LN ...

  3. AI模型运维——NVIDIA驱动、cuda、cudnn、nccl安装

    目前大部分使用GPU的AI模型,都使用的英伟达这套. 需要注意的是,驱动.cuda.cudnn版本需要一一对应,高低版本互不兼容. 驱动和cuda对应关系:https://docs.nvidia.co ...

  4. 有序取出Map集合的元素

    最近写到一个程序,返回了map,但是经过查阅资料,map是没有顺序的,各种查阅资料无果,最后自己写了这个方法.. 1,通过map集合的keySet()方法,获取到一个包含map所有key的Set集合 ...

  5. 4、架构--NFS实践、搭建web服务、文件共享

    笔记 1.晨考 1.数据备份的方式有哪些 全量和增量 2.数据备份的命令有哪些,都有哪些优点缺点 cp : 本地,全量复制 scp :远程,全量复制 rsync :远程,增量复制 3.rsync的参数 ...

  6. Solution -「CF 855G」Harry Vs Voldemort

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的树和 \(q\) 次加边操作.求出每次操作后,满足 \(u,v,w\) 互不相等,路径 \((u,w ...

  7. axios请求方式

    `// 使用默认进行请求(默认是get) axios({ url: "http://localhost:9999/student/student/getAllStudent" }) ...

  8. Spark学习记录

    SpringStrongGuo Hadoop与Spark Hadoop主要解决,海量数据的存储和海量数据的分析计算. Spark主要解决海量数据的分析计算. Spark运行模式 1)Local:运行在 ...

  9. [题解]UVA658 It's not a Bug, it's a Feature!

    链接:http://vjudge.net/problem/viewProblem.action?id=22169 描述:有n个漏洞,m个修复漏洞的方法,每种方法耗时不一样,求修复漏洞的最短时间.每种方 ...

  10. Fedora 30的升级方法

    Fedora 30 已经发布了.你可能希望将系统升级到最新版本的 Fedora.Fedora 工作站版本有图形化升级的方法.另外,Fedora 也提供了一个命令行方法,用于将 Fedora 29 升级 ...