//服务器端:
#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. MySQL MHA 高可用集群部署及故障切换

    MySQL MHA 高可用集群部署及故障切换 1.概念 2.搭建MySQL + MHA 1.概念: a)MHA概念 : MHA(MasterHigh Availability)是一套优秀的MySQL高 ...

  2. 它来了,那个最帅的男人来了 Linux常用命令精华讲解 中部

    Linux 相对于上部,今天这些内容有点干巴 -ls         列表显示目录内容  -alias   设置别名 -du        统计目录及文件空间占用情况 -mkdir   创建新目录 - ...

  3. IDEA的使用和快捷键

    一.字体设置: 菜单:file->setting->Appearan 编辑区字体大小:file->setting->Font 字体加粗:file->setting-> ...

  4. Python实现不带头结点的单链表

    1 # 创建一个节点类 2 class Node: 3 def __init__(self, item): 4 self.item = item 5 self.next = None 6 7 8 # ...

  5. Solution -「ZJOI 2020」「洛谷 P6631」序列

    \(\mathcal{Description}\)   Link.   给定一个长为 \(n\) 的非负整数序列 \(\lang a_n\rang\),你可以进行如下操作: 取 \([l,r]\),将 ...

  6. interface中setup_time和hold_time

    interface中的setup_time和hold_time input:约束input信号提前T时间采样,然后在时钟沿更新到input信号上. output:约束output信号,在时钟沿T时间后 ...

  7. 菜鸟到大神之多图预警——从 RAID 到分布式系统中的副本分布

    我们知道,在面对大规模数据的计算和存储时,有两种处理思路: 垂直扩展(scale up):通过升级单机的硬件,如 CPU.内存.磁盘等,提高计算机的处理能力. 水平扩展(scale out):通过添加 ...

  8. Spring Boot 启动特别慢的问题

    Q:debug模式下代码编译没有问题,本来10 ms左右可以启动的项目,却耗时了3000多ms,why? A:删除项目中的断点,留几个要用的就行. 至于怎么一键删除所有断点,请自行搜索! 一度以为我的 ...

  9. SpringCloud微服务实战——搭建企业级开发框架(三十八):搭建ELK日志采集与分析系统

      一套好的日志分析系统可以详细记录系统的运行情况,方便我们定位分析系统性能瓶颈.查找定位系统问题.上一篇说明了日志的多种业务场景以及日志记录的实现方式,那么日志记录下来,相关人员就需要对日志数据进行 ...

  10. 【程序员的实用工具推荐】 Mac 效率神器 Alfred

    Alfred 是一款功能非常强大,能有效提升 Mac 电脑使用效率的神器.可以说有了 Alfred 你就基本上可以脱离鼠标实现各种操作.相比 Mac 自带的聚焦搜索,完全可以称得上拥有碾压性的优势. ...