在C中使用Socket实现多线程异步TCP消息发送

目录

  • 基础知识
  • 开始实现
  • 主要函数说明
  • 结束语

在本篇文章中,我们会探讨如何在C语言中使用socket来实现多线程,异步发送TCP消息的系统。虽然C标准库并没有原生支持异步和多线程编程,但是我们可以结合使用POSIX线程(pthread)库和socket来达到目的。
在这里插入图片描述

基础知识

TCP (Transmission Control Protocol) 是一种面向连接的、可靠的、基于字节流的通信协议。

Socket 是一种网络编程接口,它允许应用程序在网络上发送和接收数据。

多线程编程 是一个并发执行多个任务的方法,每个任务运行在一个单独的线程中。

异步消息发送 是一种编程模型,消息发送者不需要等待接收者处理消息,它可以立即返回并继续执行其它任务。

开始实现

首先,我们需要包含必要的头文件。

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>

然后,我们定义一个函数send_message,该函数将在一个新线程中被调用以发送消息。

void* send_message(void* arg)
{char* message = (char*)arg;int sock;struct sockaddr_in server;// Create socketsock = socket(AF_INET , SOCK_STREAM , 0);if (sock == -1){perror("Could not create socket");return NULL;}server.sin_addr.s_addr = inet_addr("127.0.0.1");server.sin_family = AF_INET;server.sin_port = htons(8888);// Connect to remote serverif (connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0){perror("Connect failed");return NULL;}// Send some dataif (send(sock, message, strlen(message), 0) < 0){perror("Send failed");return NULL;}close(sock);return NULL;
}

send_message函数首先创建一个socket,并连接到远程服务器。然后,它发送一条消息,并关闭socket。

现在,我们可以在main函数中创建多个线程,每个线程发送一条消息。

int main()
{// Array of messages to be sentchar* messages[] = {"Hello", "from", "C"};// Create a new thread for each messagepthread_t threads[sizeof(messages)/sizeof(char*)];for (int i = 0; i < sizeof(messages)/sizeof(char*); i++){if (pthread_create(&threads[i], NULL, send_message, messages[i]) < 0){perror("Could not create thread");return 1;}}// Wait for all threads to finishfor (int i = 0; i < sizeof(threads)/sizeof(pthread_t); i++){pthread_join(threads[i], NULL);}return 0;
}

在这段代码中,我们为每个要发送的消息创建了一个新的线程,并传递send_message函数作为线程函数。然后,我们等待所有的线程完成。

主要函数说明

1. socket函数

socket函数是用来创建一个套接字,并返回这个套接字的文件描述符,它在<sys/socket.h>头文件中定义。其函数原型如下:

int socket(int domain, int type, int protocol);
  • domain:此参数指定使用的协议族(Protocol Family)。常见的协议族有AF_INET(IPv4网络协议)、AF_INET6(IPv6网络协议)等。

  • type:此参数指定服务类型。常见的服务类型有SOCK_STREAM(提供面向连接的稳定数据传输,即TCP协议)、SOCK_DGRAM(提供无连接的不稳定数据传输,即UDP协议)等。

  • protocol:此参数通常设置为0,让系统根据type自动选择合适的协议,例如TCP或UDP。

如果socket函数成功,返回一个新的socket描述符;否则返回-1,并设置errno为错误号。

2. pthread_create函数

pthread_create函数用来创建一个新线程,并让这个新线程执行指定的函数。它在<pthread.h>头文件中定义。其函数原型如下:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
  • thread:这是一个输出参数,用于返回新创建的线程ID。

  • attr:一个指向线程属性结构的指针,用于设置新线程的属性。如果设置为NULL,则使用默认属性。

  • start_routine:一个函数指针,指向新线程要运行的函数。

  • arg:一个指针,指向要传递给start_routine的参数。

如果pthread_create函数成功,返回0;如果失败,则返回一个非0的错误码(注意,这个函数不会设置errno)。新创建的线程从start_routine函数的地址开始运行,一旦start_routine返回,那么这个线程就会自动结束。

结束语

这就是在C中使用socket实现多线程异步发送TCP消息的简单示例。这是一个基础的示例,实际使用时可能需要添加错误处理和异常处理代码。同时,因为C语言没有内置的异步或多线程支持,所以这种方法并不完全异步,但是我们可以通过使用多线程来模拟异步行为。

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

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

相关文章

【⑬MySQL | 数据类型(一)】简介 | 整数 | 浮点 | 定点类型

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL数据类型简介 | 整数 | 浮点 | 定点类型的分享✨ 目录 前言0.数据类型简介1 整数类型2 浮点类型3 定点类型4 日期/时间类型总结 0.数据类型简介 数据类型&#xff08;data_type&#xff09;是指系统中所允许的…

学会Mybatis框架:让你的代码更具灵活性、可维护性、安全性和高效性【二.动态SQL】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Mybatis动态SQL如何应用 1.需求 2.…

Win解答 | 解决键盘中 字母+空格 导致的输入法弹窗导致的一系列问题

近三个月来&#xff0c;一直都有一个键盘组合键的问题影响我的电脑使用&#xff0c;不管是打字还是打游戏&#xff0c;都会出现按键盘的 字母空格 弹出一个特殊符号的候选框&#xff0c;如下图所示 图片中为 S空格 所出现的弹窗 一个看似方便&#xff0c;实则难受的功能 其实打…

针对论坛系统进行功能测试和性能测试

项目链接:飞鸽论坛 目录 一. 项目背景 二. 项目功能 三. 功能测试 注册: 登录: 更改用户信息: 发布帖子: 更新帖子信息: 点赞: 评论: 发送私信: 测试报告 四. 性能测试 Virtual User Generator Controller Analysis 测试报告: 一. 项目背景 该论坛系统采用前…

JMeter使用方法

一、基础简介 界面 打开方式 双击 jmeter.bat双击 ApacheJMeter.jsr命令行输入 java -jar ApacheJMeter.jar 目录 BIN 目录&#xff1a;存放可执行文件和配置文件 docs目录&#xff1a;api文档&#xff0c;用于开发扩展组件 printable-docs目录&#xff1a;用户帮助手册 li…

【NEW】视频云存储EasyCVR平台H.265转码配置增加分辨率设置

关于视频分析EasyCVR视频汇聚平台的转码功能&#xff0c;我们在此前的文章中也介绍过不少&#xff0c;感兴趣的用户可以翻阅往期的文章进行了解。 安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各…

C语言刷题(13)

第一题 第二题 第三题 第四题 第五题 第六题 第七题 注意 1.nsqrt(n)&#xff0c;sqrt本身不会将n开根 2.初始化已经令sumn了&#xff0c;故相加的个数为m-1次

【业务功能篇74】三高微服务项目springboot-springcloud

三高指的是&#xff1a;高性能、高并发、高可用 2.项目架构 2.1 系统架构图 整体的项目架构图如下 2.2 业务组成 整体的项目业务组成如下

【Prometheus】概述及部署

目录 Prometheus 概述 Prometheus 的生态组件 Prometheus 的工作模式 Prometheus 的工作流程 Prometheus 的局限性 部署 Prometheus Prometheust Server 端安装和相关配置 部署 Exporters 监控 MySQL 配置示例 监控 Nginx 配置示例 部署 Grafana 进行展示 部署 Pro…

Linux centos7 高频词统计

如何统计文章中高频词?是我们经常遇到的问题&#xff0c;也是多场合考察个人知识整合能力的重要手段。招聘经典问题&#xff1a;linux中命令行统计文件中前10个高频词。 在讨论此问题中&#xff0c;主要应用到的知识点有&#xff1a;排序、去重、单词查询、grep、sed和awk使用…

一、数据库基础

数据库 一、数据库基础 1、一些概念 数据库&#xff1a;数据库&#xff08;DataBase &#xff0c;简称DB&#xff09;&#xff0c;就是信息的集合。数据库是由数据库管理系统管理的数据的集合&#xff1b;数据库管理系统&#xff1a;简称DBMS 。是一种操纵和管理数据库的大型…

redis7高级篇2 redis的BigKey的处理

一 Bigkey的处理 1.1 模拟造数 1.截图 2.代码 &#xff1a;使用pipe 批量插入10w的数据量 cat /root/export/monidata.txt | redis-cli -h 127.0.0.1 -a 123456 -p 6379 --pipe [rootlocalhost export]# for((i1;i<10*10;i)); do echo "set k$i v$i" >>…

网络安全(大厂)面试题

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

【了解一下常见的设计模式】

文章目录 了解一下常用的设计模式(工厂、包装、关系)导语设计模式辨析系列 工厂篇工厂什么是工厂简单工厂「模式」&#xff08;Simple Factory「Pattern」&#xff09;简单工厂代码示例&#xff1a;简单计算器优点&#xff1a;缺点&#xff1a; 静态工厂模式特点&#xff1a; 工…

Python(八十六)字符串的编码与解码

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Apache BeanUtils工具介绍

beanutils&#xff0c;顾名思义&#xff0c;是java bean的一个工具类&#xff0c;可以帮助我们方便的读取(get)和设置(set)bean属性值、动态定义和访问bean属性&#xff1b;细心的话&#xff0c;会发现其实JDK已经提供了一个java.beans包&#xff0c;同样可以实现以上功能&…

tomcat8的安装和部署启动jpress应用

首先准备tomcat&#xff0c;jdk&#xff0c;jpress安装包 一. tomcat8的安装 1. 使用xftp等工具将软件包上传至Linux 2. 将jdk移至/usr/local/tomcat并安装jdk mv jdk-8u261-linux-x64.rpm /usr/local/tomcat yum localinstall jdk-8u261-linux-x64.rpm -y 3. 将tomca…

React+Typescript 状态管理

好 本文 我们来说说状态管理 也就是我们的 state 我们直接顺便写一个组件 参考代码如下 import * as React from "react";interface IProps {title: string,age: number }interface IState {count:number }export default class hello extends React.Component<I…

基于空间的图卷积神经网络:GNN

目录 欧氏空间中神经网络发挥巨大最作用&#xff0c;DNA&#xff0c;知识图谱三维或者多维空间不行 邻接矩阵实现图结构的矩阵化表示&#xff1a;造梦师 局和操作实现层内消息传递&#xff1a;带线的连接机传递消息 GCN通过邻域聚合实现特征提取 SVM支持向量机 ​编辑 硬分…

8.23 类 构造函数 析构函数 拷贝构造函数

#include <iostream>using namespace std;class Per{string name;int age;float *high;float *weight; public:Per(string name,int age,float high,float weight):name(name),age(age),high(new float(high)),weight(new float(weight)){cout << "Per的构造函…