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;
  }
  }
}
相关文章
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
239 6
|
5月前
|
监控 Linux 测试技术
C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
🌟 蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕C++与零拷贝网络编程,从sendfile到DPDK,实战优化服务器性能,毫秒级响应、CPU降60%。分享架构思维,共探代码星辰大海!
|
运维 监控 算法
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
|
缓存 网络协议 Linux
c++实战篇(三) ——对socket通讯服务端与客户端的封装
c++实战篇(三) ——对socket通讯服务端与客户端的封装
698 0
|
网络协议
网络通信的基石:TCP/IP协议栈的层次结构解析
在现代网络通信中,TCP/IP协议栈是构建互联网的基础。它定义了数据如何在网络中传输,以及如何确保数据的完整性和可靠性。本文将深入探讨TCP/IP协议栈的层次结构,揭示每一层的功能和重要性。
1078 5
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
260 1
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
1073 2
|
安全 编译器 C++
C++一分钟之-模板元编程实例:类型 traits
【7月更文挑战第15天】C++的模板元编程利用编译时计算提升性能,类型traits是其中的关键,用于查询和修改类型信息。文章探讨了如何使用和避免过度复杂化、误用模板特化及依赖特定编译器的问题。示例展示了`is_same`类型trait的实现,用于检查类型相等。通过`add_pointer`和`remove_reference`等traits,可以构建更复杂的类型转换逻辑。类型traits增强了代码效率和安全性,是深入C++编程的必备工具。
314 12
|
网络协议 Linux C++
超级好用的C++实用库之网络
超级好用的C++实用库之网络
225 0
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
220 3