//服务器端:
#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. 「2022」打算跳槽涨薪,必问面试题及答案 -- ECMAScript 篇

    起点低怕什么,大不了加倍努力.人生就像一场马拉松比赛,拼的不是起点,而是坚持的耐力和成长的速度.只要努力不止,进步也会不止. 1.ECMAScript 与 JavaScript 的关系? ECMA(E ...

  2. 简单的JSON数组转树形结构

    function toTree(data) { let result = [] if(!Array.isArray(data)) { return result } data.forEach(item ...

  3. MATLAB基础学习(3)——数值数组及运算

    rand('state',s)表示随机产生数的状bai态state,一般情百况du下不用指定状态.rand('state',0)作用在于如果指容定zhi状态,产生dao随机结果就相同了.一般情况下不用 ...

  4. Spring系列11:@ComponentScan批量注册bean

    回顾 在前面的章节,我们介绍了@Comfiguration和@Bean结合AnnotationConfigApplicationContext零xml配置文件使用Spring容器的方式,也介绍了通过& ...

  5. Solution -「多校联训」轮回

    \(\mathcal{Description}\)   有 \(n\) 个黑盒,第 \(i\) 个黑盒可以让输入变量以 \(p_i\) 的概率保持不变,以 \(\frac{1-p_i}2\) 的概率加 ...

  6. Java并发基础之Compare And Swap/Set(CAS)

    什么是 CAS?CAS(Compare And Swap/Set)比较并交换, CAS 算法的过程是这样:它包含 3 个参数CAS(V,E,N). V 表示待更新的变量(内存值), E 表示预期值(旧 ...

  7. JAVA8学习——从使用角度深入Stream流(学习过程)

    Stream 流 初识Stream流 简单认识一下Stream:Stream类中的官方介绍: /** * A sequence of elements supporting sequential an ...

  8. 如何使用 Rancher Desktop 访问 Traefik Proxy 仪表板

    Adrian Goins 最近举办了关于如何使用 K3s 和 Traefik 保护和控制边缘的 Kubernetes 大师班,演示了如何访问 K3s 的 Traefik Proxy 仪表板,可以通过以 ...

  9. C# 使用技巧区

    1.事件中的技巧 (1)在事件发送者中,用delegate{}初始化事件.这样就不用每次在使用事件的时候判读事件是否为空了. delegate { }可以赋值给任何类型的委托.这个功能匿名方法特有的, ...

  10. 商城秒杀系统总结(Java)

    本文写的较为零散,对没有基础的同学不太友好. 一.秒杀系统项目总结(基础版) classpath 在.properties中时常需要读取资源,定位文件地址时经常用到classpath 类路径指的是sr ...