C++网络通信实例(TCP/IP协议,包括服务端与客户端通信)

简介: C++网络通信实例(TCP/IP协议,包括服务端与客户端通信)

TCP/IP是当下网络协议栈中的主流协议 TCP属于传输层的协议  可靠传输 包括经典的三次握手等等


IP协议是网络层协议 尽全力传输但不可靠 学过计算机网络的同学们对这个应该比较熟悉


以下是使用C++进行网络通信的实例


服务端


主要使用多线程技术建立连接 也就是一个服务端可以连接多个客户端 最大连接数可以限定


向客户端发送字符串this is server 并启动一个线程等待客户端发送信息过来


如果客户端发送A过来 服务器返回B 发送C过来 服务器返回D 发送exit之后服务器关闭线程


效果图如下

image.png

image.png


代码如下

#include<iostream>
#include<stdlib.h>
#include<WinSock2.h>
#define _WINSOCK_DEPRECATED_NO_WARNINGS
using namespace std;
#pragma comment(lib, "ws2_32.lib")
DWORD WINAPI threadpro(LPVOID pParam) {
  SOCKET hsock = (SOCKET)pParam;
  char buffer[1024];
  char sendBuffer[1024];
  if (hsock != INVALID_SOCKET)
  cout << "start receive" << endl;
  while (1)
  {
  int num = recv(hsock, buffer, 1024, 0);
  if (num >= 0)
    cout << "receive from clinet" << buffer << endl;
  if (!strcmp(buffer, "A"))
  {
    memset(sendBuffer, 0, 1024);
    strcpy_s(sendBuffer, "B");
    int ires = send(hsock, sendBuffer, sizeof(sendBuffer), 0);//回送信息
    cout << "send to client" << sendBuffer << endl;
  }
  else if (!strcmp(buffer, "C"))
  {
    memset(sendBuffer, 0, 1024);
    strcpy_s(sendBuffer, "D");
    int ires = send(hsock, sendBuffer, sizeof(sendBuffer), 0);//回送信息
    cout << "send to client" << sendBuffer << endl;
  }
  else if (!strcmp(buffer, "exit"))
  {
    cout << "client close" << endl;
    cout << "server process close" << endl;
    return 0;
  }
  else
  {
    memset(sendBuffer, 0, 1024);
    strcpy_s(sendBuffer, "ERR");
    int ires = send(hsock, sendBuffer, sizeof(sendBuffer), 0);//回送信息
    cout << "send to client" << sendBuffer << endl;
  }
  }
  return 0;
}
void main() {
  WSADATA wsd;
  WSAStartup(MAKEWORD(2, 2), &wsd);
  SOCKET m_SockServer;
  sockaddr_in serveraddr;
  sockaddr_in serveraddrfrom;
  SOCKET m_Server[20];
  serveraddr.sin_family = AF_INET;
  serveraddr.sin_port = htons(4600);//端口号
  //serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  m_SockServer = socket(AF_INET, SOCK_STREAM, 0);
  int i = bind(m_SockServer, (sockaddr*)&serveraddr, sizeof(serveraddr));//绑定数
  cout << "bind:" << i << endl;
  int imaxconnect = 20;
  int iconnect = 0;
  int ilisret;
  char buf[] = "this is server\0";
  char WarnBuf[] = "it is over max connect\0";
  int len = sizeof(sockaddr);
  while (1) {
  ilisret = listen(m_SockServer, 0);
  m_Server[iconnect] = accept(m_SockServer, (sockaddr*)&serveraddrfrom, &len);
  if (m_Server[iconnect] != INVALID_SOCKET)
  {
    int ires = send(m_Server[iconnect], buf, sizeof(buf), 0);
    cout << "accept:" << ires << endl;
    iconnect++;
    if (iconnect > imaxconnect)
    {
    int ires = send(m_Server[iconnect], WarnBuf, sizeof(WarnBuf), 0);
    }
    else
    {
    HANDLE m_handle;
    DWORD nThreadld = 0;
    m_handle = (HANDLE)::CreateThread(NULL, 0, threadpro, (LPVOID)m_Server[--iconnect], 0, &nThreadld);//启动 线程
    }
  }
  WSACleanup();
  }
}

客户端

#include<iostream>
#include<stdlib.h>
#include"winsock2.h"
#include<time.h>
#define _WINSOCK_DEPRECATED_NO_WARNINGS
using namespace std;
#pragma comment(lib,"ws2_32.lib")
void main() {
  WSADATA wsd;
  WSAStartup(MAKEWORD(2, 2), &wsd);
  SOCKET m_SockClient;
  sockaddr_in clientaddr;
  clientaddr.sin_family = AF_INET;
  clientaddr.sin_port = htons(4600);
  //clientaddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
  m_SockClient = socket(AF_INET, SOCK_STREAM, 0);
  int i = connect(m_SockClient, (sockaddr*)&clientaddr, sizeof(clientaddr));
  cout << "connect" << i << endl;
  char buffer[1024];
  char inBuf[1024];
  int num;
  num = recv(m_SockClient, buffer, 1024, 0);
  if (num > 0) {
  cout << "receive from server" << buffer << endl;
  while (1) {
    num = 0;
    cin >> inBuf;
    if (!strcmp(inBuf, "exit")) {
    send(m_SockClient, inBuf, sizeof(inBuf), 0);
    return;
    }
    send(m_SockClient, inBuf, sizeof(inBuf), 0);
    num = recv(m_SockClient, buffer, 1024, 0);
    if (num >= 0)
    cout << "reveive from server" << buffer << endl;
  }
  }
}
相关文章
|
3天前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
18 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
25天前
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
53 11
|
22天前
|
网络协议
计算机网络与通信
计算机网络基本概念:了解计算机网络的定义、功能、分类和拓扑结构(如总线型、星型、环型、树形、网状等)。 网络通信原理:了解网络通信的基本原理、协议和技术,如TCP/IP协议、网络通信设备等。
25 3
|
24天前
|
网络协议
网络通信的基石:TCP/IP协议栈的层次结构解析
在现代网络通信中,TCP/IP协议栈是构建互联网的基础。它定义了数据如何在网络中传输,以及如何确保数据的完整性和可靠性。本文将深入探讨TCP/IP协议栈的层次结构,揭示每一层的功能和重要性。
53 5
|
1月前
|
算法
数据结构之卫星通信网络(BFS)
本文介绍了卫星通信网络及其重要性,并探讨了广度优先搜索(BFS)算法在其中的应用。卫星通信网络通过在轨卫星提供全球覆盖的通信服务,尤其在偏远地区和紧急救援中发挥关键作用。BFS算法用于网络拓扑分析、路径规划和故障排除,确保通信网络的高效运行。文章还包括BFS算法的工作原理、特点、优缺点及其实现代码示例。
40 1
|
1月前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
87 3
|
1月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
83 2
|
1月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
51 13
|
1月前
|
传感器 自动驾驶 物联网
探秘 5G 核心网络之 5G RAN:开启高速通信新时代
探秘 5G 核心网络之 5G RAN:开启高速通信新时代
63 4
|
1月前
|
网络协议 算法 数据库
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
OSPF 与 BGP 的互操作性:构建复杂网络的通信桥梁
39 0
下一篇
DataWorks