TCP实现服务器和客户端通信

这篇具有很好参考价值的文章主要介绍了TCP实现服务器和客户端通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

TCP介绍

代码实现

server(服务器端)

代码分析

client(客户端)

代码分析

结果展示


TCP介绍

TCP (Transmission Control Protocol) 是一种面向连接的协议,用于在计算机网络中传输数据。TCP 可以确保数据的可靠传输,即使在网络环境不稳定的情况下也能够保证数据的完整性和顺序。以下是 TCP 通信的一些特点:

  1. 面向连接:在 TCP 通信中,通信的双方必须先建立一个连接,然后才能进行数据的传输。连接的建立需要经过三次握手过程,确保双方都能够进行通信。
  2. 可靠传输:TCP 可以保证数据的可靠传输,它使用确认和重传机制来确保数据的完整性和顺序。每当发送方发送数据包时,接收方都会发送一个确认信息来表示已经收到数据。如果发送方没有收到确认信息,它会重新发送数据,直到接收方确认为止。
  3. 流量控制:TCP 可以根据接收方的处理能力来控制数据的发送速度,防止发送方发送过多的数据导致接收方无法处理。
  4. 拥塞控制:TCP 可以根据网络状况来调整发送方的数据发送速度,防止网络拥塞导致数据丢失和传输延迟。

总之,TCP 是一种可靠的协议,它在网络传输中发挥了重要的作用,特别是在需要确保数据完整性和顺序的场合,如 Web 浏览器、电子邮件、文件传输等应用中。

代码实现

server(服务器端)

/server*****/
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
//1.使用socket函数-创建流式套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建IPv4的TCP套接字
if (sockfd < 0)
{
perror("scoket err");
return -1;
}
//socket第一个参数已经是AF_INET ipv4,是用bind函数得填充ipv4结构体
struct sockaddr_in saddr;
saddr.sin_family = AF_INET; //设置地址族为IPv4
saddr.sin_port = htons(atoi(argv[1])); //端口占了两个字节,将小端转换为大端
saddr.sin_addr.s_addr = inet_addr("0.0.0.0"); //绑定任意可用的IP地址

//2.绑定套接字,ip和端口
if (bind(sockfd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0)
{
    perror("bind");
    return -1;
}
else
{
    printf("bind ok\n");
}

//3.监听-被动状态
if (listen(sockfd, 5) < 0) //设置监听队列大小为5
{
    perror("listen err");
    return -1;
}

//4.阻塞等待客户端链接
int accept_fd = accept(sockfd, NULL, NULL); //接受客户端的连接请求
if (accept_fd < 0)
{
    perror("accept err");
    return -1;
}

//5.循环接受消息
char arr[128];
ssize_t ret;
while (1)
{
    ret = recv(accept_fd, arr, sizeof(arr), 0); //从客户端接收数据
    if (ret < 0)
    {
        perror("recv err");
        return -1;
    }
    else if (ret == 0)
    {
        perror("clien exit");
        break;
    }
    else
    {
        write(1, arr, ret); //将接收到的数据输出到终端
    }
}

close(sockfd); //关闭套接字
close(accept_fd);

return 0;
}

代码分析

具体分析如下:

第1行到第15行,定义了程序的主函数main(),并进行了如下操作:
使用socket函数创建一个IPv4的TCP套接字。
利用bind函数将套接字绑定到指定IP和端口上。
使用listen函数将套接字设置为监听状态,设置了监听队列的长度为5。
使用accept函数等待客户端连接请求,并返回连接套接字的文件描述符。
在一个while循环中循环接收客户端发送的消息,然后将接收到的消息输出到终端。
关闭套接字。
第17行到第22行,定义了一个IPv4的套接字地址结构体sockaddr_in,并设置IP地址和端口号。

第24行到第32行,利用bind函数将套接字绑定到指定IP和端口上,并检查绑定是否成功。

第35行到第41行,使用listen函数将套接字设置为监听状态,并设置监听队列的长度为5,如果监听失败则输出错误信息并退出程序。

第44行到第50行,使用accept函数阻塞等待客户端连接请求,如果接受失败则输出错误信息并退出程序,否则返回连接套接字的文件描述符。

第53行到第64行,在一个while循环中循环接收客户端发送的消息,如果接收失败则输出错误信息并退出程序,如果接收到的消息长度为0则说明客户端已经关闭连接,退出循环;否则将接收到的消息输出到终端。

第67行到第70行,关闭套接字并退出程序。

该程序实现了一个简单的TCP服务器,可以接收客户端的连接并循环接收客户端发送的消息,将接收到的消息输出到终端。

client(客户端)

/client**********/
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <netinet/in.h>
#include <netinet/ip.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
//1. 使用socket创建流式套接子
int socket_fd;
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
if (socket_fd < 0)
{
perror("socket_fd err"); // 打印错误信息
return -1;
}

//2. 请求链接
struct sockaddr_in cnt;
cnt.sin_family = AF_INET;
cnt.sin_port = htons(atoi(argv[1])); // 将输入的字符串参数转换为整数端口号
cnt.sin_addr.s_addr = inet_addr("0.0.0.0"); // 设置服务器的IP地址
if (connect(socket_fd, (struct sockaddr *)&cnt, sizeof(cnt)) < 0)
{
    perror("connect err"); // 打印错误信息
    return -1;
}

char buf[128];
int ch;
while (1)
{
    ch = read(0, buf, 128); // 从标准输入读取用户输入的数据
    if (send(socket_fd, buf, ch, 0) < 0) // 发送数据到服务器
    {
        perror("send err"); // 打印错误信息
        return -1;
    }
}

close(socket_fd); // 关闭套接字
return 0;
}

代码分析

这是一个TCP客户端代码,它的主要功能是连接到指定的服务器并发送数据。下面是代码的逐行分析:

socket_fd = socket(AF_INET, SOCK_STREAM, 0);:创建一个流式套接字。

cnt.sin_family = AF_INET;:设置服务器地址的协议族为IPv4。

cnt.sin_port = htons(atoi(argv[1]));:将从命令行参数获取的字符串端口号转换成网络字节序的整数端口号,并将其存储在 sockaddr_in 结构体的 sin_port 字段中。

cnt.sin_addr.s_addr = inet_addr("0.0.0.0");:设置服务器IP地址为 0.0.0.0,表示客户端可以连接到任何一个可用的IP地址。

connect(socket_fd, (struct sockaddr *)&cnt, sizeof(cnt)):连接到服务器。这个函数将套接字连接到 sockaddr_in 结构体中描述的IP地址和端口号。如果连接失败,将返回一个负数值。

ch = read(0, buf, 128);:从标准输入读取最多128个字节的数据,并将其存储在 buf 中。

send(socket_fd, buf, ch, 0):将读取的数据发送到服务器。如果发送失败,将返回一个负数值。

close(socket_fd);:关闭套接字。

在主循环中,该客户端将不断地从标准输入读取数据并将其发送到服务器,直到程序被强制终止。

结果展示

服务器向客户端发送数据,网络编程,tcp/ip,服务器,网络

 文章来源地址https://www.toymoban.com/news/detail-606623.html

到了这里,关于TCP实现服务器和客户端通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络通信(13)-C#TCP服务器和客户端同时在一个进程实现的实例

    有时项目需求中需要服务器和客户端同时在一个进程实现,一边需要现场接收多个客户端的数据,一边需要将数据汇总后发送给远程服务器。下面通过实例演示此项需求。 C#TCP服务器和客户端同时在一个进程实现的实例如下: 界面设计 UI文件代码

    2024年01月22日
    浏览(65)
  • S7-200SMART 实现MODBUS TCP通信的具体方法示例(客户端读写+服务器响应)

    前面和大家介绍了MODBUS TCP的基本使用方法,具体可参考以下链接中的内容: S7-200SMART实现MODBUS TCP通信(客户端+服务器)的具体方法和步骤示例 本次继续和大家分享S7-200SMART 中实现MODBUS TCP通信的具体方法 , 任务要求:

    2024年02月16日
    浏览(51)
  • 简易TCP客户端和服务器端通信

    #includeiostream #include winsock2.h   #include ws2tcpip.h   #includestdlib.h using namespace std; #define  BUF_SIZE  1024 int main() {     cout \\\"客户端\\\" endl;     //设置Winsock版本,     WSADATA   wsaData;     if (WSAStartup(MAKEWORD(2, 2), wsaData) != 0)     {         cout \\\"error\\\" endl;         exit(1);     }     //创建通

    2024年04月29日
    浏览(49)
  • 网络编程3——TCP Socket实现的客户端服务器通信完整代码(详细注释帮你快速理解)

    本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下! 今天分享的内容是TCP流套接字实现的客户端与服务器的通信,一定要理解 DatagramSocket,DatagramPacket 这两个类的作用以及方法

    2024年02月12日
    浏览(63)
  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(64)
  • TCP/IP客户端和服务器端建立通信过程

    使用Qt提供的类进行基于 TCP 的套接字通信需要用到两个类: QTcpServer 类用于监听客户端连接以及和客户端建立连接,在使用之前先介绍一下这个类提供的一些常用API函数: 构造函数 给监听的套接字设置监听 listen() 函数 在代码中 通过启动监听按钮 设置监听 参数: address :

    2024年02月07日
    浏览(65)
  • Linux下TCP网络服务器与客户端通信程序入门

    实现客户端连接服务器,通过终端窗口发送信息给服务器端,服务器接收到信息后对信息数据进行回传,客户端读取回传信息并返回。 服务器当前IP地址要知道 建立socket 绑定本地IP地址并设置端口号 知道服务器的IP地址和端口号 然后进行连接

    2024年02月14日
    浏览(62)
  • TCP通信之QTcpServer和QTcpSocket,服务器和客户端通讯

    TCP传输控制协议 是一个可靠的(相对于UDP),面向流,面向连接的运输协议。 Socket 俗称“套接字”。就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地

    2024年02月12日
    浏览(66)
  • 【网络原理】使用Java基于TCP搭建简单客户端与服务器通信

    TCP服务器与客户端的搭建需要借助以下API ServerSocket 是创建TCP服务端Socket的API。 ServerSocket 构造方法 : 方法签名 方法说明 ServerSocket(int port) 创建一个服务端流套接字Socket,并绑定到指定端口 ServerSocket 方法: 方法签名 方法说明 Socket accept() 开始监听指定端口(创建时绑定的端

    2024年03月12日
    浏览(80)
  • GEC6818网络编程——服务器端与客户端tcp的双向通信

    网络编程之实现服务器和客户端的tcp双向通信,前面是双向通信的详细流程介绍,后面附上完整的代码o(  ̄▽ ̄ )ブ 1.1 服务器端双向通信的详细流程叙述 创建TCP套接字 : 使用 socket 函数创建一个TCP套接字。这里使用了IPv4地址族 AF_INET 和流式套接字 SOCK_STREAM 。 绑定IP和端口

    2024年02月21日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包