【TCP回声服务器】一篇文章帮助你看懂TCP!

1、TCP回声服务器的概念

1.1 什么是TCP?

  TCP 的全称为传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

1.2 什么是回声服务器?

  回声服务器是指一种收到客户端发送的消息后,将消息回传至客户端服务器,这种服务器代码简单,但功能健全,非常适合帮助初学者理解网络编程中TCP协议。

2、TCP回声服务器的编程模型

2.1 编程模型

服务器端 S客户端 C
创建套接字socket创建套接字socket
准备通信地址(服务器的地址)准备通信地址(服务器的地址)
绑定套接字和通信地址连接服务器端S
监听
等待连接
接收/发送数据发送/接收数据
关闭套接字关闭套接字

2.2 服务器端编程步骤

  //创建套接字

  //准备通信地址

  //绑定socket与通信地址

  //监听

  //等待连接(因为TCP是有连接的通信,所以相比UDP多一个等待连接的过程)

  //接收数据,将接收到的数据存入缓冲区

  //发送数据,将缓冲区的数据发送出去

  //关闭套接字

2.3 客户端编程步骤

  //初始化网络库

  //创建套接字

  //准备通信地址

  //连接

  //发送数据

  //接收数据

  //关闭套接字

3、代码实现

3.1 服务器端代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

typedef struct sockaddr* SP;

int main(int argc,const char* argv[])
{
	// 创建socket
	int sockfd = socket(AF_INET,SOCK_STREAM,0);
	if(0 > sockfd)
	{
		perror("socket");
		return EXIT_FAILURE;
	}

	// 准备地址
	struct sockaddr_in addr = {};
	addr.sin_family = AF_INET;
	addr.sin_port = htons();
	addr.sin_addr.s_addr = INADDR_ANY;
	socklen_t addrlen = sizeof(addr);

	// 绑定
	if(bind(sockfd,(SP)&addr,addrlen))
	{
		perror("bind");
		return EXIT_FAILURE;
	}

	// 监听
	if(listen(sockfd,5))
	{
		perror("listen");
		return EXIT_FAILURE;
	}

	// 等待连接
	int clifd = accept(sockfd,(SP)&addr,&addrlen);
	if(0 > clifd)
	{
		perror("accept");
		return EXIT_FAILURE;
	}

	char buf[4096] = {};
	size_t buf_size = sizeof(buf);

	for(;;)
	{
		// 接收/返回数据
		size_t ret_size = read(clifd,buf,sizeof(buf));
		if(0 == strcmp("quit",buf))
		{
			printf("通信结束!\n");
			break;
		}	
		if(0 == ret_size)
		{
			printf("连接断开!\n");
			break;
		}
		printf("recv:[%s] bits:%d\n",buf,ret_size);
		strcat(buf,":return");
		write(clifd,buf,strlen(buf)+1);
	}

	// 关闭socket
	close(clifd);
}

3.2 客户端代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

int main(int argc, char const *argv[])
{
    // 初始化网络库
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(2,2),&wsaData))
    {
        perror("WSAStartup");
        return EXIT_FAILURE;
    }

    // 创建socket
    int clifd = socket(AF_INET,SOCK_STREAM,0);
    if(0 > clifd)
    {
        perror("socket");
        return EXIT_FAILURE;
    }

    // 准备通信地址(由服务端决定)
    struct sockaddr_in addr = {};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9876);
    addr.sin_addr.s_addr = inet_addr("47.97.229.46");

    // 连接
    if(connect(clifd,(struct sockaddr*)&addr,sizeof(addr)))
    {
        perror("connect");
        return EXIT_FAILURE;
    }

    char buf[4096] = {};
    size_t buf_size = sizeof(buf);

    for(;;)
    {
        printf(">>>");
        gets(buf);
        send(clifd,buf,strlen(buf),0);
        if(0 == strcmp("quit",buf))
        {
            printf("通信结束!\n");
            break;
        }
        size_t ret_size = recv(clifd,buf,buf_size,0);
        printf("recv:[%s],bits:%d",buf,ret_size);
    }

    // 关闭socket
    closesocket(clifd);
    return 0;
}

4、结尾

  本文主要展示了TCP回声服务器的基本概念,及代码的实现,旨在更好的帮助初学者理解TCP通信的规则及格式,代码较为简单,功能实现的也很简单,但相信通过阅读本文一定能对TCP模式的通信有一个更深的认识。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
随着物联网技术的不断发展,串口通信和TCP/IP通信的应用越来越广泛。在实际应用中,我们经常会遇到需要将串口数据转发到TCP服务器或将TCP服务器数据转发到串口的情况。因此,本文将介绍如何实现串口服务器TCP服务器之间的数据转发。 一、串口服务器 串口服务器是一种可以将串口设备连接到网络上的设备。它可以通过网络远程访问串口设备,从而方便地进行串口通信。 串口服务器通常具有以下特点: 1. 支持多个串口设备连接:一台串口服务器可以连接多个串口设备,提高了串口设备的利用率。 2. 支持多种网络连接方式:可以通过以太网、无线网络等多种方式连接到网络。 3. 支持多种协议:可以支持TCP/IP、UDP等多种网络协议。 4. 支持多种操作系统:可以运行在Linux、Windows等多种操作系统上。 二、TCP服务器 TCP服务器是一种通过TCP/IP协议进行通信的服务器。它可以接收客户端的连接请求,建立连接并提供服务。 TCP服务器通常具有以下特点: 1. 支持多个客户端连接:可以同时处理多个客户端连接请求。 2. 支持多种协议:可以支持HTTP、FTP等多种网络协议。 3. 支持多种编程语言:可以使用Java、C#、Python等多种编程语言进行开发。 三、串口服务器TCP服务器的数据转发 为了实现串口服务器TCP服务器之间的数据转发,我们需要编写一个数据转发程序。该程序需要完成以下功能: 1. 从串口读取数据,并将数据发送到TCP服务器。 2. 从TCP服务器读取数据,并将数据发送到串口。 下面是一个简单的串口服务器TCP服务器之间的数据转发程序: ```python import serial import socket # 串口配置 ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) # TCP服务器配置 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('0.0.0.0', 8888)) sock.listen(5) # 循环读取数据并转发 while True: # 从串口读取数据 data = ser.readline() if data: # 将数据发送到TCP服务器 conn, addr = sock.accept() conn.send(data) conn.close() # 从TCP服务器读取数据 conn, addr = sock.accept() data = conn.recv(1024) if data: # 将数据发送到串口 ser.write(data) conn.close() ``` 以上程序只是一个简单的示例,实际应用中需要根据具体情况进行修改。例如,可以添加数据校验、数据过滤等功能,提高程序的稳定性和可靠性。 四、总结 本文介绍了串口服务器TCP服务器的基本概念,并提供了一个简单的串口服务器TCP服务器之间的数据转发程序。通过学习本文,读者可以了解到如何实现串口服务器TCP服务器之间的数据转发,为实际应用提供参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值