在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.pswp.cn/news/40589.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40589.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40589.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java解決四大查找(一)

Java解決四大查找 一.線性查找1.1 題目1.2 思路分析1.3 代碼演示 二.二分查找(雙指針法)2.1 題目2.2 思路分析(圖解加文字)2.3 代碼演示 一.線性查找 1.1 題目 在數組{1&#xff0c;8&#xff0c;1024&#xff0c;521&#xff0c;1889}中查找數字8&#xff0c;如果有&#xff…

【知識分享】高防服務器的防御機制

【知識分享】高防服務器的防御機制 易受到攻擊的網站選擇接入高防服務更安全&#xff0c;大家對于這個都清楚!但是對于高防服務如何實現防御來保障安全的&#xff0c;又了解多少呢?今天壹基比小源&#xff08;貳伍壹叁壹叁壹貳玖捌&#xff09;就來說說高防服務實現防御的常規…

地址解析協議-ARP

ARP協議 無論網絡層使用何種協議&#xff0c;在實際網絡的鏈路上傳輸數據幀時&#xff0c;最終必須使用硬件地址 地址解析協議&#xff08;Address Resolution Protocol&#xff0c;ARP&#xff09;&#xff1a;完成IP地址到MAC地址的映射&#xff0c;每個主機都有一個ARP高速緩…

【數據結構】二叉樹篇| 綱領思路02+刷題

博主簡介&#xff1a;努力學習的22級計算機科學與技術本科生一枚&#x1f338;博主主頁&#xff1a; 是瑤瑤子啦每日一言&#x1f33c;: 所謂自由&#xff0c;不是隨心所欲&#xff0c;而是自我主宰。——康德 目錄 一、前言二、刷題1、翻轉二叉樹 2、二叉樹的層序遍歷?3、 二…

線性代數再回顧

最近&#xff0c;在深度學習線性代數&#xff0c;之前大一的時候學過線性代數&#xff0c;但那純屬于是應試用的&#xff0c;考試一考完&#xff0c;啥都忘了&#xff0c;也說出不出個所以然&#xff0c;所以&#xff0c;在B站的MIT的線性代數以及3blue1brown線性代數的本質中去…

git命令使用

君子拙于不知己,而信于知己。——司馬遷 清屏&#xff1a;clear 查看當前面板的路徑&#xff1a;pwd 查看當前面板的文件&#xff1a;ls 創建文件夾&#xff1a;mkdir 文件夾名 創建文件&#xff1a;touch 文件名 刪除文件夾&#xff1a;rm -rf 文件夾名 刪除文件&#xff1a;r…

Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷達成像的高效實現

Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷達成像的高效實現 注1&#xff1a;本文系“無線感知論文速遞”系列之一&#xff0c;致力于簡潔清晰完整地介紹、解讀無線感知領域最新的頂會/頂刊論文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI…

爬蟲IP時效問題:優化爬蟲IP使用效果實用技巧

目錄 1. 使用穩定的代理IP服務提供商&#xff1a; 2. 定期檢測代理IP的可用性&#xff1a; 3. 配置合理的代理IP切換策略&#xff1a; 4. 使用代理IP池&#xff1a; 5. 考慮代理IP的地理位置和速度&#xff1a; 6. 設置合理的請求間隔和并發量&#xff1a; 總結 在爬蟲過…

python知識:什么是字符編碼?

前言 嗨嘍&#xff0c;大家好呀~這里是愛看美女的茜茜吶 我們的MySQL使用latin1的默認字符集&#xff0c; 也就是說&#xff0c;對漢字字段直接使用GBK內碼的編碼進行存儲&#xff0c; 當需要對一些有漢字的字段進行拼音排序時&#xff08;特別涉及到類似于名字這樣的字段時…

Docker網絡與資源控制

一、Docker 網絡實現原理 Docker使用Linux橋接&#xff0c;在宿主機虛擬一個Docker容器網橋(docker0)&#xff0c;Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP地址&#xff0c;稱為Container-IP&#xff0c;同時Docker網橋是每個容器的默認網關。因為在同一宿…

Oracle外部表ORACLE_LOADER方式加載數據

當數據源為文本或其它csv文件時&#xff0c;oracle可通過使用外部表加載數據方式&#xff0c;不需要導入可直接查詢文件內的數據。 1、如下有一個文件名為&#xff1a;test1.txt 的數據文件。數據文件內容為&#xff1a; 2、使用sys授權hr用戶可讀寫 DATA_PUMP_DIR 目錄權限&a…

探索未來:元宇宙與Web3的無限可能

隨著科技的奇跡般發展&#xff0c;互聯網已經成為了我們生活的不可分割的一部分。然而&#xff0c;盡管它的便利性和普及性帶來了巨大的影響&#xff0c;但我們仍然面臨著傳統互聯網體驗的諸多限制。 購物需要不斷在實體店與電商平臺間切換&#xff0c;教育依然受制于時間與地…

Unity如何把游戲導出成手機安裝包

文章目錄 前言使用環境步驟添加場景構建APK 前言 本文章主要演示了&#xff0c;如何將制作好的游戲&#xff0c;導出成APK&#xff0c;安裝到手機上。 使用環境 Unity2022。 步驟 首先打開你的項目&#xff0c;然后選擇菜單欄的“File” > “Build Settings…”&#xf…

QMainwindow窗口

QMainwindow窗口 菜單欄在二級菜單中輸入中文的方法給菜單欄添加相應的動作使用QMenu類的API方法添加菜單項分隔符也是QAction類 工具欄添加工具欄在狀態欄中添加控件工具欄添加其他類型的工具工具欄的屬性添加多個工具欄使用窗口添加使用代碼添加 狀態欄常用API在狀態欄顯示信…

NeuralNLP-NeuralClassifier的使用記錄(一),訓練預測自己的【英文文本多分類】

NeuralNLP-NeuralClassifier的使用記錄&#xff0c;訓練預測自己的英文文本多分類 NeuralNLP-NeuralClassifier是騰訊開發的一個多層多分類應用工具&#xff0c;支持的任務包括&#xff0c;文本分類中的二分類、多分類、多標簽&#xff0c;以及層次多標簽分類。支持的文本編碼…

C語言庫函數之 qsort 講解、使用及模擬實現

引入 我們在學習排序的時候&#xff0c;第一個接觸到的應該都是冒泡排序&#xff0c;我們先來復習一下冒泡排序的代碼&#xff0c;來作為一個鋪墊和引入。 代碼如下&#xff1a; #include<stdio.h>void bubble_sort(int *arr, int sz) {int i 0;for (i 0; i < sz…

面試熱題(最大子數組和)

給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 子數組 是數組中的一個連續部分。 輸入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 輸出&#xff1a;6 解釋&#xff1a;連續…

免費批量ppt轉pdf?一個方法教你完美轉換

隨著科技的不斷發展&#xff0c;電子文檔的使用越來越普遍。在商業、教育和個人領域&#xff0c;我們經常需要將PPT文件轉換為PDF格式&#xff0c;以便更方便地共享和存檔。幸運的是&#xff0c;現在有許多在線工具和軟件可以幫助我們輕松地完成免費批量ppt轉pdf。下面將介紹一…

【Linux】模擬實現linux的shell

#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> #define NUM 1024 #define SIZE 32 #define SEP " " int main() {//保存輸入后的字符串char …

Blazor前后端框架Known-V1.2.12

V1.2.12 Known是基于C#和Blazor開發的前后端分離快速開發框架&#xff0c;開箱即用&#xff0c;跨平臺&#xff0c;一處代碼&#xff0c;多處運行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…