TCP简单链接的编程实现

TCP简单链接的编程实现

本文主要介绍TCP应用层的编码实现。
TCP是一种面向连接的、可靠的、基于字节流的传输层协议,它是互联网协议套件(TCP/IP)中的核心协议之一,广泛应用于需要可靠数据传输的场景,如:网页浏览、文件传输、电子邮件等。
网图

TCP简单链接的编程实现

  • TCP简单链接的编程实现
  • 编码实现
    • tcp简单服务器实现
    • tcp简单客户端实现
  • 实现tcp编程之前需要明确的数据条件
    • tcp服务端
    • TCP客户端
  • 相关函数介绍
    • `int socket(int domain,int type, int protocol);`
      • 参数说明
        • domain(协议族/地址族)
        • type(套接字类型)
        • protocol(协议)
      • 返回值

编码实现

tcp简单服务器实现

//头文件
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>#define PORT 8080 //端口号 
#define BUFFER_SIZE 1024 //接收buffer的缓存区大小int main() {  int server_fd;//绑定的套接字int new_socket;  //建立的tcp连接struct sockaddr_in server_address; //服务地址 int addrlen = sizeof(server_address);  struct sockaddr_in address; //建立连接时获取到的客户端地址 int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0}; //接受缓冲区 char *response = "Hello from server";  //发送数据// 1.创建套接字  /*AF_INET:域: IPV4:AF_INET;  IPV6: AF_INET6  本地通信:AF_UNIX或AF_LOCAL 底层数据包接口(用于直接访问网络层数据包): AF_PACKETSOCK_STREAM:类型,TCP填SOCK_STREAM;UDP填SOCK_DGRAM;原始套接字填SOCK_RAW0:协议,一般填0(根据 domain 和 type 自动选择合适的协议),原始套接字编程时需填充返回值:成功时:返回一个非负整数,表示套接字的文件描述符;失败时:返回 -1,并设置 errno 以指示错误类型。*/if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {  perror("Socket failed");  exit(EXIT_FAILURE);  }  //2.地址快速重用/*server_fd:套接字描述符SOL_SOCKET:表示选项的级别optname:表示要设置选项的名称&flag:指向设置值的指针len:设置值的大小返回值:成功返回0,失败返回-1,并设置 errno 以指示错误类型*/int flag=1;int len=sizeof(int);if(setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,&flag,len)!=0){perror(("setsockopt SO_REUSEADDR failed"));exit(EXIT_FAILURE);}//2.绑定套接字到端口  (设置域,ip,端口)address.sin_family = AF_INET;  address.sin_addr.s_addr = INADDR_ANY;  //INADDR_ANY 的值是 0x00000000,表示 0.0.0.0,这是一个特殊的 IPv4 地址。//当将套接字绑定到 INADDR_ANY 时,服务器会监听所有本地网络接口(包括环回接口 127.0.0.1 和所有物理网卡的 IP 地址)address.sin_port = htons(PORT);  //3.绑定if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {  perror("Bind failed");  close(server_fd);  exit(EXIT_FAILURE);  }  // 4.监听连接  if (listen(server_fd, 3) < 0) {  //3:backlog正在三次握手的客户端链表的上限=2*backlog+1perror("Listen failed");  close(server_fd);  exit(EXIT_FAILURE);  }  printf("Server listening on port %d\n", PORT);  // 5.接受连接  if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {  perror("Accept failed");  close(server_fd);  exit(EXIT_FAILURE);  }  // 读取客户端发送的数据  read(new_socket, buffer, BUFFER_SIZE);  printf("Message from client: %s\n", buffer);  // 发送响应给客户端  send(new_socket, response, strlen(response), 0);  printf("Response sent to client\n");  // 关闭套接字  close(new_socket);  close(server_fd); return 0;}

tcp简单客户端实现

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  #define PORT 8080  
#define BUFFER_SIZE 1024  int main() {  int sock = 0;  struct sockaddr_in serv_addr;  char *message = "Hello from client";  char buffer[BUFFER_SIZE] = {0};  // 创建套接字  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {  perror("Socket creation error");  return -1;  }  serv_addr.sin_family = AF_INET;  serv_addr.sin_port = htons(PORT);  // 将IPv4地址从字符串转换为二进制形式  if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {  perror("Invalid address/ Address not supported");  return -1;  }  // 连接到服务器  if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {  perror("Connection Failed");  return -1;  }  // 发送消息给服务器  send(sock, message, strlen(message), 0);  printf("Message sent to server\n");  // 读取服务器的响应  read(sock, buffer, BUFFER_SIZE);  printf("Response from server: %s\n", buffer);  // 关闭套接字  close(sock);  return 0;  
}  

实现tcp编程之前需要明确的数据条件

tcp服务端

(1)发送端口号
(2)接受数据的缓冲区
(3)发送端ip地址
(4)要发送的数据
(5)要设置三次握手的客户端链表的上限值

TCP客户端

(1)接收端口号
(2)接受数据的缓冲区
(3)接收端ip地址
(4)要发送的数据

相关函数介绍

int socket(int domain,int type, int protocol);

socket 函数是网络编程中用于创建套接字的核心函数。它定义在 <sys/socket.h> 头文件中,用于创建一个通信端点(套接字),并返回一个文件描述符,以便后续的通信操作(如绑定、监听、连接、发送和接收数据等)。

参数说明

domain(协议族/地址族)

指定通信的协议族,常见的值包括:

  • AF_INET:IPv4 协议族(用于 TCP/IPv4 和 UDP/IPv4)。
  • AF_INET6:IPv6 协议族(用于TCP/IPv6 和 UDP/IPv6)。
  • AF_UNIX 或 AF_LOCAL:本地通信(用于同一台机器上的进程间通信)。
  • AF_PACKET:底层数据包接口(用于直接访问网络层数据包)。
type(套接字类型)

指定套接字的类型
SOCK_STREAM:面向连接的流套接字(如 TCP)。
SOCK_DGRAM:无连接的数据报套接字(如 UDP)。
SOCK_RAW:原始套接字(用于直接访问网络层协议,如 ICMP)。

protocol(协议)

指定具体的协议,通常设置为 0,表示根据 domain 和 type 自动选择合适的协议。

  • 如果 domain 是 AF_INET 且 type 是 SOCK_STREAM,则默认使用 IPPROTO_TCP(TCP 协议)。
  • 如果 domain 是 AF_INET 且 type 是 SOCK_DGRAM,则默认使用 IPPROTO_UDP(UDP 协议)。
  • 如果使用原始套接字(SOCK_RAW),则需要显式指定协议,如 IPPROTO_ICMP。

返回值

  • 成功时:返回一个非负整数,表示套接字的文件描述符。
  • 失败时:返回 -1,并设置 errno 以指示错误类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Multiprocessing模块创建子进程,需要放到__main__中

1 场景说明 在Python中&#xff0c;使用multiprocessing模块创建子进程时&#xff0c;将创建子进程的代码放在if __name__ __main__: 块之外&#xff0c;如下面代码&#xff1a; import multiprocessing import timedef test_func(name):print(f"子进程 {name} 开始运行…

描述<canvas>标签的主要用途,如何在其上绘制简单图形?

大白话描述标签的主要用途&#xff0c;如何在其上绘制简单图形&#xff1f; <canvas> 标签的主要用途 <canvas> 标签是 HTML5 中新增的一个标签&#xff0c;它就像是一块“画布”&#xff0c;你可以在网页上用它来绘制各种图形、动画、制作游戏等。简单来说&…

【RHCE实验】搭建主从DNS、WEB等服务器

目录 需求 环境搭建 配置nfs服务器 配置web服务器 配置主从dns服务器 主dns服务器 从dns服务器 配置客户端 客户端测试 需求 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容…

Shell条件判断

一、使用if选择结构 if单分支的语法组成&#xff1a; if 条件测试;then 命令序列 fi if双分支的语法组成&#xff1a; if 条件测试;then 命令序列1 else 命令序列2 fi if多分支的语法组成&#xff1a; if 条…

理解langchain langgraph 官方文档示例代码中的MemorySaver

以下是langchain v0.3官方示例代码 from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph# 可以理解为&#xff1a;定义一个流程&#xff0c;这个流程中用到的数据类型是Messages。 <---定义一个有向图&…

【HarmonyOS Next之旅】DevEco Studio使用指南(三)

目录 1 -> 一体化工程迁移 1.1 -> 自动迁移 1.2 -> 手动迁移 1.2.1 -> API 10及以上历史工程迁移 1.2.2 -> API 9历史工程迁移 1 -> 一体化工程迁移 DevEco Studio从 NEXT Developer Beta1版本开始&#xff0c;提供开箱即用的开发体验&#xff0c;将SD…

vuex持久化存储,手动保存到localStorage

vuex持久化存储&#xff0c;手动保存到localStorage 一、vue21. 手动存储到localStoragestore/index.js 2. 使用持久化存储插件store/index.jsstore/modules/otherData.js保存到localStorage 二、vue31. index.ts2. store/modules/globalData.ts3. 在组件中使用App.vue 一、vue…

nodejs使用 mysql2 模块获取 mysql 中的 json字段,而不是 mysql

mysql 模块获取的 json 字段&#xff0c;是字符串mysql2 模块获取的 json 字段&#xff0c;是符合预期的 json 对象 mysql mysql2 最后编辑于&#xff1a;2025-02-24 22:16:53 © 著作权归作者所有,转载或内容合作请联系作者 喜欢的朋友记得点赞、收藏、关注哦&#xff01;…

鸿蒙(OpenHarmony)开发实现 息屏/亮屏 详情

官网参考链接 实现点击关闭屏幕&#xff0c;定时5秒后唤醒屏幕 权限 {"name": "ohos.permission.POWER_OPTIMIZATION"}代码实现 import power from ohos.power;Entry Component struct Page3 {private timeoutID: number | null null; // 初始化 timeout…

【网工第6版】第1章 计算机网络概论

目录 1计算机网络形成和发展 ■计算机网络 ■我国互联网发展 ■计算机网路分类 ■计算机网络应用 2 OSI和TCP/IP参考模型 ■网络分层的意义 ■OSI参考模型 ■TCP/IP参考模型 ■TCP/IP参考模型协议 3 数据封装与解封过程 ■封装 ■解封 1计算机网络形成和发展 ■计…

理解我们单片机拥有的资源

目录 为什么要查询单片机拥有的资源 所以&#xff0c;去哪些地方可以找数据手册 一个例子&#xff1a;STM32F103C8T6 前言 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite STM32 Common Repositorieshttps://github.com/C…

《我的Python觉醒之路》之转型Python(十五)——控制流

[今天是2025年3月17日&#xff0c;继续复习第一章节、第二章节的内容 ] 《我的Python觉醒之路》之转型Python&#xff08;十四&#xff09;——控制流

AndroidStudio+Android8.0下的Launcher3 导入,编译,烧录,调试

文章目录 编译完成搜索输出文件Android.mk配置gradle编译环境报错一报错二报错三输出文件下载INSTALL_FAILED_TEST_ONLY查找系统签名查找签名工具开始签名查看签名签名问题重新生成秘钥解决方案生成成功挽救错误:重新刷机更换testkey秘钥keystore生成keystoreINSTALL_FAILED_S…

Linux--gdb/cgdb

ok&#xff0c;我们今天学习gdb的安装和使用 调试器-gdb/cgdb使用 VS、VScode编写的代码一般都是release格式的&#xff0c;gdb 的格式一般是debug 换成debug模式命令 :-g gdb会记录最新的一条命令&#xff0c;直接回车就是默认执行该命令 一个调试周期下&#xff0c;断点…

Oracle GoldenGate 全面解析

Oracle GoldenGate 全面解析 Oracle GoldenGate 是一种实时数据集成和复制解决方案,广泛应用于数据同步、数据库迁移、高可用性和灾难恢复等场景。以下将详细解答您提出的关于 Oracle GoldenGate 的一系列问题。 1. Oracle GoldenGate 的架构组成及其核心组件的作用 架构组成…

ModBus TCP/RTU互转(主)(从)|| Modbus主动轮询下发的工业应用 || 基于智能网关的串口服务器进行Modbus数据收发的工业应用

目录 前言 一、ModBus TCP/RTU互转&#xff08;从&#xff09;及应用|| 1.1 举栗子 二、ModBus TCP/RTU互转&#xff08;主&#xff09; 2.1 举栗子 三、ModBus 主动轮询 3.1 Modbus主动轮询原理 3.2 Modbus格式上传与下发 3.2.1.设置Modbus主动轮询指令 3.2.2 设…

场景题:一个存储IP地址的100G 的文件, 找出现次数最多的 IP ?

和大文件中存id&#xff0c;然后要求排序问题一样的处理思路 使用MapReduce的思想解决&#xff0c;加上哈希分割&#xff0c;先将大文件中的IP地址按照哈希函数进行分割&#xff0c;存到多个文件上&#xff0c;接着每个分片单独处理&#xff0c;用Hashmap统计IP出现频次&#…

【操作系统安全】任务2:用户与用户组

目录 一、用户与用户组介绍 1.1 用户 1.2 用户组 1.3 用户与用户组的关系 二、用户与用户组管理 2.1 用户管理 2.1.1 创建用户 2.1.2 设置用户密码 2.1.3 删除用户 2.2 用户组管理 2.2.1 创建用户组 2.2.2 删除用户组 2.2.3 将用户添加到用户组 三、影子账户创建…

OpenCV计算摄影学(20)非真实感渲染之增强图像的细节函数detailEnhance()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此滤波器增强特定图像的细节。 cv::detailEnhance用于增强图像的细节&#xff0c;通过结合空间域和频率域的处理&#xff0c;提升图像中特定细节…

Git 使用指南

Git 是一种分布式版本控制系统&#xff0c;可以追踪文件的变化并协助多人协作开发项目。下面是 Git 的基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git 用来存储项目的地方&#xff0c;可以理解为项目的文件夹&#xff0c;包含项目的所…