基于c语言的TCP客户端、服务端基础代码

news/2025/3/16 22:38:17/文章来源:https://www.cnblogs.com/zcx0326/p/18233679

基于c语言的TCP客户端、服务端基础代码

基本流程:

image

  1. 客户端:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*   tcp客户端(发送)
*
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int main(int argc, char *argv[])
{// 检查参数有效性if (argc != 3){fprintf(stderr, "argument is invaild ,errno:%d,%s\n", errno, strerror(errno));exit(1);}int sockfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addr;addr.sin_family = AF_INET;             // 协议族,是固定的addr.sin_port = htons(atoi(argv[1]));  // 服务器端口,必须转换为网络字节序addr.sin_addr.s_addr = inet_addr(argv[2]); // 服务器地址 "192.168.64.xxx"connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));char sendbuff[100];char recvbuff[100];while (1){bzero(sendbuff, 100);scanf("%s",sendbuff);// fgets(sendbuff, 100, stdin);// 向服务端发送数据write(sockfd, sendbuff, strlen(sendbuff));// 接收TCP回弹服务器的消息printf("收到消息recvbuff = %s\n", recvbuff);bzero(recvbuff, 100);}close(sockfd);return 0;
}
  1. 服务端:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>#include <unistd.h>
//TCP服务器代码   ./xxx   port/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*   tcp服务端(接收)
*
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int main(int argc, char const *argv[])
{//1.创建TCP套接字int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);if (tcp_socket == -1){fprintf(stderr, "tcp socket error,errno:%d,%s\n",errno,strerror(errno));exit(1);}//2.绑定自身的IP地址和端口struct sockaddr_in  host_addr;host_addr.sin_family 		= AF_INET; 						//协议族,是固定的host_addr.sin_port   		= htons(atoi(argv[1]));			//目标端口,必须转换为网络字节序host_addr.sin_addr.s_addr   = htonl(INADDR_ANY);		    //目标地址  INADDR_ANY 这个宏是一个整数,所以需要使用htonl转换为网络字节序bind(tcp_socket,(struct sockaddr *)&host_addr, sizeof(host_addr));//3.设置监听  队列最大容量是5listen(tcp_socket,5);//4.等待接受客户端的连接请求struct sockaddr_in  client;socklen_t client_len = sizeof(client);int connect_fd = accept(tcp_socket,(struct sockaddr *)&client,&client_len); //会阻塞char buf[128] = {0};//5.说明双方建立连接,此时可以接收数据while(1){read(connect_fd,buf,sizeof(buf));printf("recv from [%s],data is = %s\n", inet_ntoa(client.sin_addr) ,buf);bzero(buf,sizeof(buf));}return 0;
}
  1. 三次握手示意图:
    image

  2. 示意图解释:

第一次握手:发送一个SYN标记(请求同步标记)

​ 发送一个序列号seq:x

第二次握手:返回一个SYN标记

​ 返回一个ACK(应答标记,表示我知道了)

​ 返回一个序列号seq:y

​ 返回一个x+1序列号ack(告诉客户端希望下一次数据从+1开始)

第三次握手:发送一个ACK标记

​ 发送一个序列号seq:x+1

​ 发送一个序列号ack:y+1

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

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

相关文章

解决错误运行‘Tomcat 9.0.35‘: 地址 localhost:1099 已在使用

“Error running ‘Tomcat 9.0’: Address localhost:1099 is already in use”报错问题问题描述:idea运行项目时,左下方出现红色小方块提示问题“Error running ‘Tomcat 9.0’: Address localhost:1099 is already in use”。 这是因为端口被占用了。 解决问题: 按win+R打…

嵌入式 Linux LED 驱动开发实验学习

I.MX6U-ALPHA 开发板上的 LED 连接到 I.MX6ULL 的 GPIO1_IO03 这个引脚上,进行这个驱动开发实验之前,需要了解下地址映射。 地址映射 MMU 全称叫做 MemoryManage Unit,也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU,但是现在 Linux 内核已经支持无 MMU 的处…

囚徒5.4_基于texlive的PlotNeuralNet画深度学习框架图

首先下载并安装texlive 连接如下texlive安装教程 接着下载PlotNeuralNet项目 下载链接PlotNeuralNet对PlotNeuralNet的一些解释它其实是基于texlive语言,然后通过python语言按照texlive的语法格式进行拼接生成tex文档之后使用pdflatex命令生成pdf. PlotNeuralNet中有一系列的写…

第二次大作业BLOG心得

(1)前言: 知识点: ①ArrayLsit的知识点: ArrayList 是 Java 中的动态数组实现,它提供了自动调整大小的功能,可以根据需要动态增长或收缩。 ArrayList 可以存储任意类型的对象,并支持随机访问,即可以通过索引快速访问列表中的元素。 ArrayList 内部通过数组实现,当元素…

python 函数 形参前带*或者两个星** 收集元组或者字典,实参前带星*或者两个星** 解开序列或者字典

函数的形参前面带一个星*,代表着不定长参数,实际上是收集了不定长的实参,作为一个元组。 形参前面带两个星**,代表可以接收不定长参数,并且调用该函数时实参要指定参数名,实际上是收集了一个不定键个数的字典。 实参前带一个星*,表示解开当前的序列,再做为参数传递。 实…

Address localhost:1099 is already in use

端口号被占用 netstat -ano查出占用这个端口号的进程 在任务管理器里终止

作业总结

这学期才接触java,面向对象以前只在C里面用过一点,所以一开始对于怎么写,以及java语法有点不太适应。 个人体会: ​ 关于类: 1、类似C中的struct,构造函数、内置方法(函数 )都比较相似 2、但是无法重载运算符,这是比较难受的一点。 3、尽量避免代码的重复,把private和p…

TCP概述

概述 TPC:传输控制协议,TCP协议是面向连接的、可以实现端对端通信的可靠的协议。 TCP协议传输数据时会为每个字节分配一个序列号,通过这个序列号就可以判断数据是否重复到达以及数据是否丢失,还可以通过序列号对数据进行排序。 报首格式TCP建立连接的三次握手过程TCP三次挥手…

基于毫米波雷达的手势识别算法

摘要 基于毫米波的手势识别技术提供了良好的人机交互体验。先前的工作专注于近距离手势识别,但在范围扩展方面不够,即他们无法识别距离相当大的噪声运动超过一米的手势。在本文中,我们利用一种新的数据处理方法和定制的人工卷积神经网络(CNN)设计了一个远程手势识别模型。…

POSTGRESQL中时间戳的奥秘timestamptz

哈喽,大家好,我是木头左!一、前言 在日常的数据库操作中,经常会遇到各种时间相关的数据类型,如DATE、TIME、TIMESTAMP等。这些时间类型的处理方式和精度差异,直接影响到对数据的查询和分析结果。今天,就来深入探讨一下POSTGRESQL中的两个重要时间戳类型:timestamp和tim…

6.5数组--模拟、偏移量-螺旋矩阵

6.5打卡M:59.螺旋矩阵II 题意描述给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1:输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2: 输入:n = 1 输出:[[1]]提示:1 <= n <= 20思路这道题目…

【Java】JVM字节码分析

Java 字节码是Java源代码编译生成的中间形式,赋予Java跨平台特性,通过对字节码的分析,可以迅速找到代码的性能瓶颈。一、功能 1、工作原理2、解释和运行 jvm本质上是运行在计算机上的程序,负责运行java字节码文件 对字节码文件中的指令,实时的解释成机器码,供计算机执行 …