Linux学习/TCP Socket通信

news/2024/11/16 3:51:54/文章来源:https://www.cnblogs.com/songpoetry/p/18368018

案例

案例一

server.c

#include <stdio.h> // 标准输入输出
#include <stdlib.h> //提供通用的工具函数,例如内存分配和程序退出。
#include <string.h> //提供字符串处理函数。
#include <unistd.h> //提供对 POSIX 操作系统 API 的访问,包括对文件描述符的操作。
#include <arpa/inet.h> //提供与 Internet 地址转换相关的函数和数据结构。#define PORT 8082 //PORT 是服务器监听的端口号,设置为 8082。
#define BUFFER_SIZE 1024 //定义了缓冲区的大小,用于接收数据,设置为 1024 字节。int main()
{int server_fd; //用于存储服务器套接字的文件描述符int new_socket; //客户端连接的套接字描述符struct sockaddr_in address; //sockaddr_in 结构体,表示服务器的地址信息。int opt = 1; //用于设置套接字选项(端口重用)。int addrlen = sizeof(address); //服务器地址结构的大小。char buffer[BUFFER_SIZE] = {0}; //用于接收客户端发送的消息,并初始化为零。/*使用 socket 函数创建一个套接字。参数 AF_INET 指定使用 IPv4,SOCK_STREAM 表示使用 TCP 协议。*如果创建失败,函数返回值为 -1,输出错误信息并退出程序。*/if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("server create failed\n");exit(EXIT_FAILURE);}/*使用 setsockopt 函数允许套接字重用地址。设置选项 SO_REUSEADDR,这使得即使在套接字关闭后,新的套接字也可以绑定到同一端口。*如果设置选项失败,输出错误信息并退出程序。*/if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))){perror("setsockopt");exit(EXIT_FAILURE);}// 配置服务器地址结构address.sin_family = AF_INET; //设置 address 的地址家族为 AF_INET,表示 IPv4。// address.sin_addr.s_addr = INADDR_ANY; //使用 INADDR_ANY,表示服务器将监听所有可用的网络接口。inet_pton(AF_INET, "127.0.0.1", &address.sin_addr);address.sin_port = htons(PORT);//使用 htons 函数将主机字节序转换为网络字节序,以确保在不同平台上端口号的正确性。/*使用 bind 函数将套接字与指定的地址(包含 IP 和端口)进行绑定。如果绑定失败,输出错误信息并退出程序。*/if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0){perror("bind failed");exit(EXIT_FAILURE);}/*使用 listen 函数使套接字进入监听状态,准备接受客户端连接。第二个参数指定最大等待连接的数量(3)。*如果监听失败,输出错误信息并退出程序。*/if (listen(server_fd, 3) < 0){perror("listen");exit(EXIT_FAILURE);}printf("等待连接...\n");/*使用 accept 函数接受来自客户端的连接。如果接受失败,输出错误信息并退出程序。成功后,new_socket 用于与客户端进行通信。*/if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0){perror("accept");exit(EXIT_FAILURE);}/*使用 read 函数从与客户端连接的套接字读取数据,存储到 buffer 中,最多接收 BUFFER_SIZE 字节的数据。*/read(new_socket, buffer, BUFFER_SIZE);printf("接收到消息: %s\n", buffer);// 发送回应给客户端const char *msg = "Hello from server";/*使用 send 函数将这个消息发送到客户端,传入消息长度(strlen(msg))和标志参数(这里为 0)。*/send(new_socket, msg, strlen(msg), 0);/*使用 close 函数关闭与客户端的套接字(new_socket),释放相应的资源。*关闭服务器套接字(server_fd),释放相应的资源。*/close(new_socket);close(server_fd);return 0;
}

client.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <arpa/inet.h> #define PORT 8082 
#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){printf("\n Socket creation error \n");return -1;}// 配置服务器地址结构serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);/*使用 inet_pton 将字符串格式的 IP 地址("127.0.0.1")转换为二进制格式并存储在 serv_addr.sin_addr 中。这个IP地址指的是本机。*/if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0){printf("\nInvalid address/ Address not supported \n");return -1;}// 连接到服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){printf("\nConnection Failed \n");return -1;}// 发送消息到服务器send(sock, message, strlen(message), 0);printf("消息已发送\n");// 接收服务器消息read(sock, buffer, BUFFER_SIZE);printf("接收到回应: %s\n", buffer);// 关闭套接字close(sock);return 0;
}

终端执行结果
先执行server打开监听,再执行client开始连接

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

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

相关文章

Rockylinux 9.4 安装部署

Rockylinux安装部署 1、操作系统引入 2024 年 6 月 30 日,CentOS Linux 7 终止其生命周期(EOL),至此 CentOS 全系列版本也已停止维护,属于 CentOS 的时代彻底终结。CentOS 停止维护后,用户将无法获得包括问题修复和功能更新在内的任何软件维护和支持,宕机、服务中断、数…

Rockylinux安装部署

Rockylinux安装部署 1、操作系统引入 2024 年 6 月 30 日,CentOS Linux 7 终止其生命周期(EOL),至此 CentOS 全系列版本也已停止维护,属于 CentOS 的时代彻底终结。CentOS 停止维护后,用户将无法获得包括问题修复和功能更新在内的任何软件维护和支持,宕机、服务中断、数…

NSSCTF [SWPUCTF 2021 新生赛]pop

NSSCTF [SWPUCTF 2021 新生赛]pop进入就看见一串代码,直接开启代审<?phperror_reporting(0); show_source("index.php");class w44m{private $admin = aaa; protected $passwd = 123456;public function Getflag(){//通过该函数来获得flagif($this->admin ==…

性能测试之中间件:告诉你什么是 kafka 和 MQ ?

在如今这个数据驱动的时代,中间件在性能测试中扮演着至关重要的角色。你是否曾听说过Kafka和MQ,却不清楚它们在实际应用中具体的作用是什么?让我们一起来揭开它们的神秘面纱。 Kafka和MQ究竟是什么?它们在性能测试中如何发挥作用,又为何成为现代分布式系统中的关键组成部分…

tcp与udp的总结+connect阻塞+tcp三次握手、四次挥手+常见的服务器IO(发送数据+接收数据)模型

一,TCP与UDP的基本总结 TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。TCP是面向连接的,提供可靠、顺序的传输,适用于需要高可靠性的应用,如网页浏览和文件传输。它通过重传机制和流量控制确保数据完整性。UDP是无连接的,速度快但不保证数据的可靠性…

tcp与udp的总结+connect阻塞+tcp三次握手、四次挥手

一,TCP与UDP的基本总结 TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。TCP是面向连接的,提供可靠、顺序的传输,适用于需要高可靠性的应用,如网页浏览和文件传输。它通过重传机制和流量控制确保数据完整性。UDP是无连接的,速度快但不保证数据的可靠性…

【Linux_install】详细的Ubuntu和win双系统安装指南

@目录1.前期准备1.1 制作启动盘1.2关闭快速启动、安全启动、bitlocker1.2.1 原因1.2.2 进入BIOSshell命令行进入BIOSwindows设置中高级启动在开机时狂按某个键进入BIOS1.2.3 关闭Fast boot和Secure boot1.3 划分磁盘空间1.3.1 查看目前的虚拟内存大小2.开始安装2.1 使用启动盘启…

OpenCV-Python系列之对极几何

点击查看代码 import numpy as np import cv2 as cv img1=cv.imread("data1/1.png",0) # queryimage left image img2=cv.imread("data1/2.png",0) # trainimage right image sift=cv.SIFT_create() # sift1=cv.xfeatures2d.SIFT_create()kp1,des1=sift.d…

Centos7使用RPM包安装Oracle21c数据库(EE)

Centos7使用RPM包安装Oracle21c数据库(EE) 官方下载链接21c标准版 安装包信息: 文件名:LINUX.X64_213000_db_home.zip (64-bit) (3,109,225,519 bytes) (sha256sum - c05d5c32a72b9bf84ab6babb49aee99cbb403930406aabe3cf2f94f1d35e0916)21c xe版 安装包信息: 文件名:ora…

相交两圆

这篇写的太早了,我自己也看不懂,现在找不到啥基础题适合放了。反正把构型掌握了就好。 Reim引理如图,两圆交于 \(A,B\) 两点,若 \(CD,EF\) 是两圆的弦,满足 \(CAE,DBF\) 分别共线,则 \(CD//EF\) 逆定理:若 \(ABCD\) 共圆,\(E,F\) 分别在 \(CA,DB\) 的延长线上,并满足 …

Centos7使用RPM包安装Oracle21c数据库(XE)

Centos7使用RPM包安装Oracle21c数据库(XE) 官方下载链接21c标准版 安装包信息: 文件名:LINUX.X64_213000_db_home.zip (64-bit) (3,109,225,519 bytes) (sha256sum - c05d5c32a72b9bf84ab6babb49aee99cbb403930406aabe3cf2f94f1d35e0916)21c xe版 安装包信息: 文件名:ora…