9月9日

TCP
服務器端

#include <myhead.h>
#define ?SER_PORT ?8888 ? ? ? ?//服務器端口號
#define SER_IP ?"192.168.108.179" ? //服務器IP地址?

int main(int argc, const char *argv[])
{
//創建一個用于連接的套接字文件描述符
int sfd ?= socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfd)
{
perror("socket ?error");
return -1;
}

?? ?printf("socket 成功 sfd = %d\n", sfd);


//封裝地址信息結構體變量
struct sockaddr_in sin; ? ? ? ?//地址信息結構體變量
sin.sin_family = AF_INET; ? ? ?//IPV4
sin.sin_port = htons(SER_PORT); ? //端口號,主機轉網絡字節序
sin.sin_addr.s_addr = inet_addr(SER_IP); ?//ip地址轉網絡字節序

//給套接字綁定ip地址和端口號
if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) ==-1)
{
perror("bind ?error");
return -1;
}
printf("bind success\n");


//將套接字啟動監聽
if(listen(sfd, 128) == -1)
{
perror("listen ?error");
return -1;
}
printf("listen success\n");

?? ?//阻塞等等客戶端的連接,如果有新客戶端連接,則創建一個用于通信的新套接字
struct sockaddr_in cin; ? ? ? ? ? ?//用于接受客戶端套接字信息
socklen_t addrlen = sizeof(cin); ? //用于接受客戶端套接字的長度

?? ?int new_fd = accept(sfd, (struct sockaddr*)&cin, &addrlen);
if(-1 == new_fd)
{
perror("accept error");
return -1;
}
printf("[%s:%d]發來連接,new_fd = %d\n", inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),new_fd);

?? ?//使用新套接字跟客戶端進行通信
while(1)
{
//從套接字中讀取消息
char rbuf[128] = ""; ? ? ? ? ?//存放接受消息的容器
int res = recv(new_fd, rbuf, sizeof(rbuf), 0);
if(res == 0)
{
printf("客戶端已下線\n");
close(new_fd);
break;
}
if(res == -1)
{
perror("recv?error");
close(new_fd);
close(sfd);
return -1;
}
printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);

?? ??? ?//給當前消息加個笑臉還回去
strcat(rbuf, "*_*");

?? ??? ?//向套接字中寫入消息
send(new_fd, rbuf, strlen(rbuf), 0);

printf("發送成功\n");
close(new_fd);

?? ?}

?? ?//關閉監聽套接字
close(sfd);

?? ?
return 0;
}

客戶端

#include <myhead.h>
#define ?SER_PORT 8888 ? ? ? ? ? ? ? //服務器端口號
#define SER_IP "192.168.108.179" ? ? //服務器ip地址
#define CLIENT_PORT 9999 ? ? ? ? ? ? //客戶端端口號
#define CLIENT_IP "192.168.108.179" //客戶端ip地址

int main(int argc, const char *argv[])
{
//創建一個用于通信的套接字文件描述符
int cfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == cfd)
{
perror("socket error");
return -1;
}
printf("socket success ? cfd = %d\n", cfd);

//封裝服務器的地址信息結構體
struct sockaddr_in sin;
sin.sin_family = AF_INET; ? ? ? ? ? ?//通信域
sin.sin_port = htons(SER_PORT); ? ? //服務器端口號
sin.sin_addr.s_addr = inet_addr(SER_IP); ? ?//服務器ip地址

//連接服務器
if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
{
perror("connect ?error");
return -1;
}
printf("連接成功\n");

?? ?
//數據收發
while(1)
{
char wbuf[128] = ""; ? ? ? ? ? ?//用于發送數據的容器
fgets(wbuf, sizeof(wbuf), stdin); ? ?//從終端獲取消息
wbuf[strlen(wbuf)-1] = '\0'; ? ? ? ? //將換行改成'\0'
if(strcmp(wbuf, "quit") == 0)
{
break;
}

?? ??? ?//將數據發送給服務器
send(cfd, wbuf, strlen(wbuf), 0);
printf("發送成功\n");

?? ??? ?//接收服務器發送的消息
recv(cfd, wbuf, sizeof(wbuf), 0);
printf("收到的消息為:%s\n", wbuf);
}

//關閉套接字
close(cfd)


return 0;

UDP

服務器端

#include <myhead.h>
#define SER_IP "192.168.108.179"
#define SER_PORT 8888? ? ? ??


int main(int argc, const char *argv[])
{
//創建服務器套接字文件描述符
int sfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == sfd)
{
perror("socket error");
return -1;
}
printf("socket success ?sfd = %d\n", sfd);? ?


填充地址信息結構體
struct sockaddr_in sin;
sin.sin_family = AF_INET; ? ? ? ? ?//配置通信域
sin.sin_port = htons(SER_PORT); ? ? ?//配置端口號
sin.sin_addr.s_addr = inet_addr(SER_IP); ? //配置ip地址
//綁定操作
if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1)
{
perror("bind ?error");
return -1;
}
printf("bind ?success\n");

?? ?//數據收發
//定義用于接收對端地址信息結構體
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin); ? ? //接收地址信息的大小

?? ?while(1)
{
char rbuf[128] = ""; ? ? ? ? //定義接收消息的容器
//接收客戶端消息
recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr*)&cin, &addrlen);
printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);

?? ??? ?//給消息加個笑臉還回去
strcat(rbuf, "*_*");

?? ??? ?//向客戶端發送消息
sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr*)&cin, sizeof(cin));
printf("發送成功\n");

?? ?}

?? ?//4、關閉服務器
close(sfd);

return 0;
}

客戶端

#include<myhead.h>

#define SER_IP "192.168.108.179" ? ? ? //服務器ip地址
#define SER_PORT 8888 ? ? ? ? ? ? ? ? ?//服務器端口號
#define CLI_IP ?"192.168.108.179" ? ? ?//客戶端ip地址
#define CLI_PORT 9999 ? ? ? ? ? ? ? ? ?//客戶端端口號

int main(int argc, const char *argv[])
{
//創建用于通信的套接字文件描述符
int cfd = socket(AF_INET, SOCK_DGRAM, 0);
if(-1 == cfd)
{
perror("socket error");
return -1;
}
printf("socket success ?cfd = %d\n", cfd);


填充客戶端地址信息結構體
struct sockaddr_in cin;
cin.sin_family = AF_INET; ? ? ? ? ? ? ? ?//通信域
cin.sin_port = htons(CLI_PORT); ? ? ? ? ?//客戶端端口號
cin.sin_addr.s_addr = inet_addr(CLI_IP); ?//客戶端ip地址


//進行綁定工作
if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin)) == -1)
{
perror("bind error");
return -1;
}
printf("bind ?success\n");

?? ?//數據收發
//封裝服務器的地址信息結構體
struct sockaddr_in sin; ? ? ? ? ? ? //服務器地址信息結構體
sin.sin_family = AF_INET;
sin.sin_port = htons(SER_PORT); ? ? ? ? //服務器端口號
sin.sin_addr.s_addr = inet_addr(SER_IP); ?//服務器ip地址
socklen_t addrlen = sizeof(sin); ? ? ? ? ?//地址信息結構體的大小
while(1)
{
char wbuf[128] = "";
//從終端獲取一個字符串
fgets(wbuf, sizeof(wbuf), stdin);
wbuf[strlen(wbuf)-1] = 0;

?? ??? ?//將消息發送給服務器
sendto(cfd, wbuf, strlen(wbuf), 0, (struct sockaddr*)&sin, addrlen);

printf("發送成功\n");

?? ??? ?//接收服務器回復的消息
recv(cfd, wbuf, sizeof(wbuf), 0,NULL,NULL);
printf("收到消息為:%s\n", wbuf);

?? ?}

?? ?//4、關閉客戶端
close(cfd);

return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95973.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95973.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95973.shtml

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

相關文章

Docker生產部署

目錄 一、準備工作&#xff1a;理解 Docker 與 Spring Boot 的關系 1. Docker 是什么&#xff1f; 2. Spring Boot 為什么適合 Docker&#xff1f; 二、編寫Dockerfile 三、配置管理 掛載外部配置文件 四、用 docker-compose 編排多服務 一、準備工作&#xff1a;理解 Do…

ARM 基礎(3)

ARM匯編與C語言函數的相互調用及參數傳遞匯編調用C函數參數傳遞規則 前4個參數通過寄存器 R0-R3 傳遞&#xff0c;超出部分從右向左壓棧。32位返回值存于 R0&#xff0c;64位整數用 R0 和 R1&#xff0c;浮點數通過 S0/D0 返回。示例&#xff1a;ARM匯編調用C函數.global _star…

OpenCV計算機視覺筆記合集

參考課程&#xff1a; 【黑馬程序員 OpenCV入門教程】 [https://www.bilibili.com/video/BV1Fo4y1d7JL] ZZHow(ZZHow1024) 學習路線 基本的圖像處理方法&#xff1a;幾何變換&#xff0c;形態學變換&#xff0c;圖像平滑&#xff0c;直方圖操作&#xff0c;模板匹配&#…

Mybatis-12 第三方緩存-EhCache

配置文檔 Ehcache配置文件ehcache.xml Java Ehcache緩存的timeToIdleSeconds和timeToLiveSeconds區別 基本介紹 1.EhCache是一個純Java的緩存框架&#xff0c;具有快速、精干等特點 2.MyBatis有自己默認的二級緩存&#xff08;前面我們已經使用過了&#xff09;&#xff0c;…

元器件--電容器

文章目錄一、技術理論??1、電容定義??2、定義式??3、單位換算??4、電容作用??5、電容特性二、組成結構??1、極板&#xff08;電極&#xff09;??????2、介質&#xff08;絕緣層&#xff09;????3、引線&#xff08;電極引出端&#xff09;????4、封裝…

【Leetcode hot 100】146.LRU緩存

問題鏈接 146.LRU緩存 問題描述 請你設計并實現一個滿足 LRU (最近最少使用) 緩存 約束的數據結構。 實現 LRUCache 類&#xff1a; LRUCache(int capacity) 以 正整數 作為容量 capacity 初始化 LRU 緩存int get(int key) 如果關鍵字 key 存在于緩存中&#xff0c;則返回關…

MySQL超大數據量查詢與刪除優化

引言 在處理TB級數據時&#xff0c;傳統SQL操作可能導致性能崩潰。本文揭示MySQL超大數據量場景下的核心優化策略&#xff0c;通過生產環境案例展示如何將億級數據刪除耗時從8小時壓縮至8分鐘&#xff0c;并附完整監控方案與容災措施。 深度剖析海量數據操作痛點 1. 傳統刪除操…

【內存管理】常用的頁表映射函數

1、pgd_addr_end 根據當前虛擬地址 addr 和目標結束地址 end&#xff0c;計算當前 PGD 項 能夠覆蓋的最大虛擬地址范圍的結束地址 next。 如果 addr 和 end 跨越多個 PGD 項&#xff08;即 end 超出當前 PGD 項的地址范圍&#xff09;&#xff0c;則返回當前 PGD 項的地址邊界。…

XR數字融合工作站賦能新能源汽車專業建設的創新路徑

XR數字融合工作站作為集PC、VR、MR技術于一體的軟硬件集成平臺&#xff0c;憑借其多維交互、虛實融合、智能管理等特性&#xff0c;為新能源汽車專業的教學改革與創新提供了全新解決方案。一、教學場景革新&#xff1a;構建沉浸式、互動化學習環境XR數字融合工作站通過多形態拼…

C語言通用鏈表終章:優雅的收尾 - 清空與銷毀

各類資料學習下載合集 ?https://pan.quark.cn/s/8c91ccb5a474? 經過前面的學習,我們已經從零構建了一個功能強大的通用鏈表,它能自如地進行節點的插入和刪除。我們的“數據火車”已經可以馳騁在內存的世界里。然而,旅途終有終點,當火車完成任務后,如何安全、徹底地讓…

MATLAB R2025a安裝配置及使用教程(超詳細保姆級教程)

文章目錄前言什么是MATLAB&#xff1f;了解這款數據分析利器matlab安裝前準備工作MATLAB R2025a下載完整MATLAB R2025a安裝步驟MATLAB進階應用技巧前言 全網最新最全的MATLAB R2025a安裝教程來了&#xff01;2025年版本完整圖文指南&#xff0c;包含軟件下載、詳細安裝、密鑰激…

在Mybatis plus中如何使用自定義Sql

在演示UpdateWrapper的案例中&#xff0c;我們在代碼中編寫了更新的SQL語句&#xff1a;Test void testUpadateWrapper(){List<Long> ids List.of(1L,2L,4L);//生成SQLUpadateWrapper<User> wrapper new UpdateWrapper<User> ().setSql("balance balan…

Deepoc科技之暖:智能助盲設備如何為視障家人點亮生活

作為一名視障人士的家屬&#xff0c;我們或許都經歷過這樣的時刻&#xff1a;看著親人在書架前摸索&#xff0c;卻無法獨自獲取文字信息&#xff1b;擔心他們外出時遇到障礙物或交通危險&#xff1b;心疼他們因找不到日常物品而不得不一次次求助。這些細微的日常困境&#xff0…

大模型食材識別技術革新:AI重構精準營養管理

隨著健康意識的提升&#xff0c;飲食管理需求激增&#xff0c;但傳統手動記錄易出錯、效率低。大模型食材識別技術的突破&#xff0c;讓AI通過多模態輸入精準識別食材種類與重量&#xff0c;結合營養數據庫&#xff0c;系統可快速生成營養報告&#xff0c;實現從“經驗驅動”到…

使用 Altair RapidMiner 將機器學習引入您的 Mendix 應用程序

Altair RapidMiner 使機器學習更加容易&#xff1a;無論您喜歡使用 Python 編碼&#xff0c;還是在 Workflow Studio 中進行可視化工作&#xff0c;Altair AI Cloud 都能為團隊提供快速構建和部署 ML 模型的工具。 將機器學習與 Mendix 集成很簡單&#xff1a;通過 Mendix 的低…

EasyExcel:快速讀寫Excel的工具類

EasyExcel&#xff1a;快速讀寫Excel的工具類 項目介紹 ?EasyExcel是一個基于Java的、快速、簡潔、解決大文件內存溢出的Excel處理工具。 他能讓你在不用考慮性能、內存的等因素的情況下&#xff0c;快速完成Excel的讀、寫等功能。 pom地址 ? <!--exel--> <depe…

WSL Ubuntu Docker 代理自動配置教程

WSL Ubuntu Docker 代理自動配置教程 WSL Ubuntu Docker 代理自動配置教程 背景說明 在 WSL2 環境下使用 Docker 時&#xff0c;由于網絡環境限制&#xff0c;經常需要通過 Windows 主機上的代理來訪問 Docker Hub。但每次 Windows 重啟后&#xff0c;WSL 獲取到的主機 IP 地址…

踩坑實錄:Django繼承AbstractUser時遇到的related_name沖突及解決方案

一、問題現象分析 咱們在用Django開發時&#xff0c;有時候需要擴展用戶模型&#xff0c;就會去繼承AbstractUser。但這么做的時候&#xff0c;要是沒處理好groups和user_permissions這兩個多對多字段的反向查詢名稱&#xff0c;就會遇到這樣的報錯&#xff1a;主要就是這種錯誤…

push pop 和 present dismiss

push/pop 和 present/dismiss 文章目錄push/pop 和 present/dismiss前言push / poppresent普通的present多層present多層present后的父子關系問題多層彈出會遇到的問題showViewController 和 showDetailViewControllershowViewControllershowDetailViewControllerdismiss模態化…

服務器異常負載排查手冊 · 隱蔽進程篇

適用范圍 適用于 Linux 3.10 生產環境&#xff0c;發現 load 高但用戶態 CPU 接近 0 % 的場景。1. 現場凍結目標&#xff1a;在 rootkit 干預前保存易失數據。#!/bin/bash # freeze.sh TS$(date %s) mkdir -p /srv/ir/${TS} cd /srv/ir/${TS}# 1.1 進程樹&#xff08;busybox 靜…