//服务器端:
#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. JSP页面乱码解决

    1. tomcat 设置端口处加上 URIEncoding="UTF-8" 2. tomcat 的bin文件夹下的catalina.bat中如下位置加上如下编码:-Dfile.en ...

  2. netty系列之:真正的平等–UDT中的Rendezvous

    目录 简介 建立支持Rendezvous的服务器 处理不同的消息 节点之间的交互 总结 简介 在我们之前提到的所有netty知识中,netty好像都被分为客户端和服务器端两部分.服务器端监听连接,并对 ...

  3. 痞子衡嵌入式:揭秘i.MXRT1060,1010上串行NOR Flash冗余程序启动设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060,1010上串行NOR Flash冗余程序启动设计. 工业产品设计里经常会有冗余程序/备份程序设计的需求,因为在工业 ...

  4. Java中==、equals、hashCode的区别

    "=="是运算符,用来比较两个值.两个对象的内存地址是否相等: "equals"是Object类的方法,默认情况下比较两个对象是否是同一个对象,内部实现是通过& ...

  5. sqli-labs 1-22关

    Page-1(Basic Challenges) Less 1-4 Less-(1-4)是最常规的SQL查询,分别采用单引号闭合.无引号.括号单引号闭合.括号双引号闭合,没有过滤:可以采用and '1 ...

  6. 【论文考古】联邦学习开山之作 Communication-Efficient Learning of Deep Networks from Decentralized Data

    B. McMahan, E. Moore, D. Ramage, S. Hampson, and B. A. y Arcas, "Communication-Efficient Learni ...

  7. Python中读写文件三部曲

    写入文件:要把第二个参数 'r' 改成 'w' ,表示write,即以写入的模式打开文件;  往文件中写入内容,使用write()函数. 例子如下:注意 'w' 写入模式会暴力清空掉原有文件,然后再写 ...

  8. restFul接口设计规范[仅供参考]

    域名 应该尽量将API部署在专用域名之下. https://api.example.com 如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下. https://www.example.or ...

  9. BI系统要自研还是采购?这篇文章告诉你

    首先说一下目前市面上的BI工具都有哪些吧.总体上,其实分为免费和付费两大阵营.免费阵营里,为首的当然是GA(也就是谷歌分析).PowerBI,但是由于有墙的限制,很多公司没法使用前者.付费阵营里,近两 ...

  10. Oracle之SQL的简单查询

    查询结构 --SQL语句的执行原理以及语法结构: /* SELECT * | 列名1[,列名2...] | 表达式 FROM 表名 [表的别名] WHERE 分组前的筛选条件 GROUP BY 列名1 ...