基于Linux内核的socket编程(TCP)的C语言示例

原文地址:https://www.geeksforgeeks.org/socket-programming-cc/

服务端:

#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>#define PORT 8080int main(int argc, char const* argv[])
{int server_fd, new_socket;ssize_t valread;struct sockaddr_in address;int opt = 1;socklen_t addrlen = sizeof(address);char buffer[1024] = { 0 };const char* hello = "Hello from server";// AF_INET表示IPV4网络通信领域。SOCKET_STREAM表示TCP,即流式。0表示默认(也可以填6表示TCP)if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket failed");exit(EXIT_FAILURE);}// SOL_SOCKET表示套接字级别的选项。SO_REUSEADDR表示服务关闭后,地址和端口可重入。这段可删if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET; //设置协议簇为IPV4address.sin_addr.s_addr = INADDR_ANY; //设置服务端接收的套接字的IP地址,INADDR_ANY表示任何本地地址address.sin_port = htons(PORT);//设置端口号为8080// Forcefully attaching socket to the port 8080// 强制绑定,意思是不管之前是否有其他进程在使用8080端口if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}//最多允许3个请求处于半连接状态真正连接成功的会走到accept()函数if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("waiting for connecting...\n");if ((new_socket = accept(server_fd, (struct sockaddr*)&address, &addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}//从new_socket中读取数据,存入buffer中,长度-1是为了存放字符串的结束符valread = read(new_socket, buffer,1024 - 1);printf("%s\n", buffer);send(new_socket, hello, strlen(hello), 0);printf("Hello message sent\n");// closing the connected socketclose(new_socket);// closing the listening socketclose(server_fd);return 0;
}

客户端:

// 需要先运行服务端
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#define PORT 8080int main(int argc, char const* argv[])
{int status, valread, client_fd;struct sockaddr_in serv_addr;const char* hello = "Hello from client";char buffer[1024] = { 0 };if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("\n Socket creation error \n");return -1;}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);// 将地址转换成二进制if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {perror("Invalid address");return -1;}//TCP使用connect()函数建立连接,之后就可以send()和read()了。而UDP无需建立连接,直接使用sendto()和recvfrom()函数if ((status = connect(client_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) < 0) {perror("Connection Failed");printf("You should run server side firstly\n");return -1;}send(client_fd, hello, strlen(hello), 0);printf("Hello message sent\n");//从client_fd中读取数据,存入buffer中,长度-1是为了存放字符串的结束符valread = read(client_fd, buffer, 1024 - 1);printf("%s\n", buffer);// closing the connected socketclose(client_fd);return 0;
}

结果如下图:
在这里插入图片描述

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

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

相关文章

【Conda】详细讲解

Conda 1. 前言2. 关键特点3. Conda命令 1. 前言 Conda是一个流行的包管理器和环境管理器&#xff0c;主要用于Python编程语言&#xff0c;但也可以用来安装、运行和更新包和环境中的任何语言&#xff0c;如R、Ruby、Lua、Scala、Java等。Conda主要是为了方便数据科学、机器学习…

Python之Web开发中级教程----搭建Web框架二

Python之Web开发中级教程----搭建Web框架二 搭建虚拟环境 虚拟环境的作用 虚拟环境可以搭建独立的python运行环境, 使得单个项目的运行环境与其它项目互不影响. 搭建虚拟环境 &#xff08;1&#xff09;安装 sudo pip install virtualenv sudo pip install virtualenvwra…

17个工作必备的Python自动化代码分享(上篇)

引言 Python是一种流行的编程语言&#xff0c;以其简单性和可读性而闻名。因其能够提供大量的库和模块&#xff0c;它成为了自动化各种任务的绝佳选择。让我们进入自动化的世界&#xff0c;探索17个可以简化工作并节省时间精力的Python脚本。 目录&#xff08;上篇&#xff0…

在线答疑系统|基于springboot框架+ Mysql+Java+Tomcat的在线答疑系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 学生功能模块 教师后台功能模块 管理员功能模块 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研…

赚钱的秘密:如何利用资源为你谋利

想要赚钱&#xff0c;首先我们要知道钱到底代表着什么。金钱的真正意义是什么&#xff1f;我觉得&#xff0c;只有先明白任何事情背后的本质&#xff0c;你才能真正明白如何做好这件事。钱也是一样的&#xff0c;只有当你真正明白钱的真正含义时&#xff0c;你才能真正把钱挑出…

Java技术学习|感想1

从韩顺平老师的java基础开始&#xff0c;到国哥的javaweb。之后杨博超老师的spring6。Springmvc&#xff08;中间入门了Vue&#xff0c;了解了thyemeleaf&#xff09;&#xff0c;mybatis。怎么说呢&#xff0c;到现在&#xff0c;学习springboot&#xff0c;学着学着要用到red…

SpringBoot中引入了springcloud-gateway,路由不生效为什么?

今天闲来无事&#xff0c;想看看springcloud-gateway的&#xff0c;于是自开始搭建gateway但是&#xff0c;搭建完成后想验证&#xff0c;发现有问题总会报404&#xff0c;接下来详细说下操作过程&#xff0c; 1.首先创建2个springBoot的工程。一个作为gateway 一个可以作为路…

Redis实现分布式锁源码分析

为什么使用分布式锁 单机环境并发时&#xff0c;使用synchronized或lock接口可以保证线程安全&#xff0c;但它们是jvm层面的锁&#xff0c;分布式环境并发时&#xff0c;100个并发的线程可能来自10个服务节点&#xff0c;那就是跨jvm了。 简单分布式锁实现 SETNX 格式&…

Ribbon跟Nginx实现负载均衡的区别!

一&#xff0c; Ribbon是在客户端去进行请求的分发&#xff0c;而Nginx则是服务器端的 下面是Ribbon的源码 public Server choose(ILoadBalancer lb, Object key) { if (lb null) { log.warn("no load balancer"); return null; …

【ollama】linux、window系统更改模型存放位置,全网首发2024!

首先是window系统 so easy 直接进入系统环境变量添加就行 其次是linux系统 全靠自己试出来的,去Ollama官网找半天文档不知道在哪,而且linux也没有说:【 https://github.com/ollama/ollama/blob/main/docs/README.md https://github.com/ollama/ollama/blob/main/docs/li…

最大异或对(trie树)

题目描述&#xff1a; 思路&#xff1a; 1、首先此题我们要知道异或的规则&#xff0c;这里不赘述了&#xff0c;可以百度 2、如果利用trie树去找到一个数字与其异或能得到最大值 比如二进制数&#xff1a;1010.....是一个很大的数 我们想要异或得到的值更大&#xff0c;就需…

HarmonyOS(二十)——管理应用拥有的状态之LocalStorage(页面级UI状态存储)

LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内&#xff0c;在页面间共享状态。 本文仅介绍LocalStorage使用场景和相关的装饰器&#xff1a;LocalStorageProp和LocalS…

流畅的Python(十九)-动态属性和特性

一、核心要义 在Python中,数据的属性和处理数据的方法,统称属性。方法&#xff0c;只是可调用的属性。除了这两者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法(即读值方法和设值方法)修改数据属性。 二、代码示例 0、相关知识点 #!/usr/bin/env…

微服务技术栈之rabbitMQ高级(二)

我们该如何确保MQ消息的可靠性&#xff1f; 如果真的发送失败&#xff0c;有没有其它的兜底方案&#xff1f; 这些问题&#xff0c;在这一次的学习中都会找到答案。 生产者的可靠性 首先&#xff0c;我们一起分析一下消息丢失的可能性有哪些。 消息从发送者发送消息&#…

StarRocks实战——云览科技存算分离实践

目录 背景 一、平台现状&痛点 1.1 使用组件多&#xff0c;维护成本高 1.2 链路冗长&#xff0c;数据时效性难以保证 1.3 服务稳定性不足 二、StarRocks 存算分离调研 2.1 性能对比 2.2 易用性 2.3 存储成本 三、StarRocks 存算分离实践 3.1 查询优化 3.1.1 物化…

Linux网络编程: 以太网帧Frame/ARP/RARP详解

一、TCP/IP五层模型 物理层&#xff08;Physical Layer&#xff09;&#xff1a;物理层是最底层&#xff0c;负责传输比特流&#xff08;bitstream&#xff09;以及物理介质的传输方式。它定义了如何在物理媒介上传输原始的比特流&#xff0c;例如通过电缆、光纤或无线传输等。…

【论文阅读】Diffused Heads: Diffusion Models Beat GANs on Talking-Face Generation

Diffused Heads: 扩散模型在说话人脸生成方面击败GANs paper&#xff1a;[2301.03396] Diffused Heads: Diffusion Models Beat GANs on Talking-Face Generation (arxiv.org) code&#xff1a;MStypulkowski/diffused-heads: Official repository for Diffused Heads: Diffu…

R:简易的Circos图

library(grid) library(circlize) library(RColorBrewer) library(ComplexHeatmap) setwd("C:/Users/fordata/Downloads/Circos") # 创建颜色调色板 coul <- colorRampPalette(brewer.pal(9, "Set3"))(12) # 读取基因组数据 genome <- read.table(ci…

贪心算法(两个实例)

例一&#xff1a;调度问题 问题&#xff1a;由n项任务&#xff0c;每项任务的加工时间已知&#xff0c;从零时刻开始陆续加入一台机器上去加工&#xff0c;每个任务完成的时间是从0时刻到任务加工截至的时间。 求总完成时间&#xff08;所有任务完成时间最短计划方案&#xf…

情感分析技术调研:传统方法到深度学习的全景观

目录 基于规则的方法 字典 基于机器学习的方法 贝叶斯分类 支持向量机 基于深度学习的方法 Transformer系列&#xff0c;Bert家族--以Albert举例 自监督学习 迁移学习和领域适应 对抗训练 前言 本文讨论的是截止到本文发出时间&#xff08;2024年&#xff09;为止&am…