C++实现基于TCP协议简单通信的服务端与客户端

本文介绍了使用C++实现基于TCP协议的简单服务端和客户端通信的基本步骤,包括TCP连接的三次握手和四次挥手过程。通过创建socket,绑定端口,监听,连接,读写等操作,展示了网络进程中如何利用socket进行通信。并提供了服务端、客户端及makefile的代码示例。
摘要由CSDN通过智能技术生成

前段时间复习了TCP协议相关知识,整理了一下之前所做的练习,一个很简单的服务端和客户端程序,虽然简单,但是对于刚接触的人来说还是很有意思。

前言

我们知道,TCP协议能够在网络通信中提供可靠的传输,其主要依靠的是TCP协议连接时的三次握手,断开时的四次挥手,以及超时重传,滑动窗口,拥塞控制的特质。
那么,网络中的进程之间是如何通信的呢?进程是通过socket来通信的;那socket又是什么呢?socket即是一种特殊的文件,一些socket函数就是对其进行的操作,操作包括读/写,打开,关闭等,socket正好提供了网络通信的接口。以TCP协议通信的socket为例,其通信的大概流程图如下:
TCP交互流程

这里再简单叙述一下交互流程:

  • 首先服务器根据地址类型(ipv4,ipv6)、socket类型,协议创建socket;
  • 服务器调用bind()函数为socket绑定端口;
  • 服务器socket调用listen()开始监听端口号请求,准备随时接收客户端发来的连接;
  • 现在客户端创建socket;
  • 客户端打开socket,根据服务器的IP地址及端口号尝试connect服务器的socket;
  • 此时服务器收到请求,被动打开,开始接收客户端请求,直到客户端返回连接信息;
  • 客户端连接成功,并向服务器发送连接状态信息,服务端accept方法返回,连接成功;
  • 客户端调用write()向socket写入信息;
  • 服务端调用read()接收读取socket信息;
  • 客户端和服务端进行关闭;

    注:著名的三次握手过程发生在connect()函数调用时,而accept()的发生是在三次握手过程之后。

    下面贴出具体代码:
    Server服务器代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#
  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用QT编写一个基于tcp/ip协议通信服务端客户端的步骤: 1. 创建一个QT项目,并添加QT网络库 2. 创建一个服务端 ```c++ QTcpServer *server = new QTcpServer(this); connect(server, SIGNAL(newConnection()), this, SLOT(newConnection())); if(!server->listen(QHostAddress::Any, 1234)) { qDebug() << "Server could not start!"; } else { qDebug() << "Server started!"; } void Server::newConnection() { QTcpSocket *socket = server->nextPendingConnection(); sockets.append(socket); qDebug() << "Client connected!"; } ``` 3. 创建一个客户端 ```c++ QTcpSocket *socket = new QTcpSocket(this); connect(socket, SIGNAL(connected()), this, SLOT(connected())); connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected())); connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead())); socket->connectToHost("127.0.0.1", 1234); if(!socket->waitForConnected(5000)) { qDebug() << "Error: " << socket->errorString(); } else { qDebug() << "Connected!"; } void Client::connected() { qDebug() << "Connected to server!"; } void Client::disconnected() { qDebug() << "Disconnected from server!"; } void Client::readyRead() { QByteArray data = socket->readAll(); qDebug() << "Received: " << data; } ``` 4. 在服务端中处理接收到的数据 ```c++ void Server::newConnection() { QTcpSocket *socket = server->nextPendingConnection(); sockets.append(socket); connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead())); qDebug() << "Client connected!"; } void Server::readyRead() { QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender()); if(socket) { QByteArray data = socket->readAll(); qDebug() << "Received: " << data; foreach(QTcpSocket *s, sockets) { s->write(data); } } } ``` 5. 在客户端中发送数据 ```c++ socket->write("Hello, server!"); ``` 这样就完成了基于tcp/ip协议通信服务端客户端的编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值