設計程式,要求程式可以加入到一個多播組中並等待伺服器發送數據包,並且程式還需要具有發送功能,如果收到數據包則把消息內容輸出到終端

来源:https://www.cnblogs.com/cwp-home/p/18231795
-Advertisement-
Play Games

目錄題目分析代碼結果 題目 小組實現,小組中的每位成員都需要設計程式,要求程式可以加入到一個多播組中並等待伺服器發送數據包,並且程式還需要具有發送功能,如果收到數據包則把消息內容輸出到終端, 消息內容格式 [消息來源IP 消息時間 ] : 消息內容 分析 1.發送端需設置套接字的廣播屬性,使用set ...


目錄

題目


小組實現,小組中的每位成員都需要設計程式,要求程式可以加入到一個多播組中並等待伺服器發送數據包,並且程式還需要具有發送功能,如果收到數據包則把消息內容輸出到終端, 消息內容格式 [消息來源IP 消息時間 ] : 消息內容

分析


1.發送端需設置套接字的廣播屬性,使用setsockopt()函數,第三個參數需添加SO_BROADCAST;

2.接收端需設置同一埠號並加入組播地址,才能接受同組發送的信息,也需要使用setsockopt()函數,第三個參數需添加IP_ADD_MEMBERSHIP。

代碼


/***********************************************************************************
*
*	file name:	udp_client.c
*	author	 :  [email protected] 
*	date	 :  2024/06/04
*	function :  該案例是小組實現,小組中的每位成員都需要設計程式,要求程式可以加入到一個
*				多播組中並等待伺服器發送數據包,並且程式還需要具有發送功能,如果收到數據
*				包則把消息內容輸出到終端,消息內容格式 [消息來源IP  消息時間 ]:消息內容
* 	note	 :  None
*   version  :
*
*	CopyRight (c)  2023-2024   [email protected]   All Right Reseverd 
*
* **********************************************************************************/
/************************************頭文件*****************************************/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
/***********************************************************************************/
/************************************全局變數***************************************/
int udp_socket;		//UDP套接字
/***********************************************************************************/
/*************************************結構體****************************************/
typedef struct lcd_time
{
    int year;		//年
    int mon;		//月
    int mday;		//日
    int wday;		//星期
    int hour;		//時
    int min;		//分
    int sec;		//秒

}LcdTime;
/***********************************************************************************/
/***********************************************************************************
*
*	name	 :	GetTime
*	function :  調用此函數可獲取開發板的時間
*	param :  
*				none
*				
*	retval	 :  char *
*	author	 :  [email protected] 
*	date	 :  2024/06/04
* 	note	 :  None
*   version  :
* 	
* *********************************************************************************/
//獲取開發板時間
char *GetTime()
{
	//申請堆記憶體並定義一個記錄LCD硬體時間的結構體指針
    LcdTime *tstm = (LcdTime *)calloc(1,sizeof(LcdTime));
	char * tstime = (char *)calloc(1,sizeof(char) * 32);
    //錯誤處理
    if (NULL == tstm)
    {
        printf("calloc for time failed\n");
		return NULL;
    }

	//4.獲取當前系統時間,並把時間轉換為特定格式“yy年mm月dd日 星期x tt:mm:ss”
	time_t Tseconds = time(NULL);
	struct tm *ft = localtime(&Tseconds);
	tstm->year = (ft->tm_year) + 1900;     //年從1900年開始
	tstm->mon  = (ft->tm_mon) + 1;         //月份從0開始
	tstm->mday = (ft->tm_mday);
	tstm->wday = (ft->tm_wday);
	tstm->hour = (ft->tm_hour);
	tstm->min  = (ft->tm_min);
	tstm->sec  = (ft->tm_sec);
	sprintf(
				tstime,
				"%d年%02d月%02d日,星期%d,%02d:%02d:%02d",
				tstm->year,
				tstm->mon,
				tstm->mday,
				tstm->wday,
				tstm->hour,
				tstm->min,
				tstm->sec
			);
        //fwrite(data_buffer,BUFFRSIZE,1,fp);
    return tstime;
}
/***********************************************************************************
*
*	name	 :	recv_udp_msg
*	function :  子線程的任務函數,該函數用於接收伺服器發送的數據包
*	param :  
*				none
*				
*	retval	 :  none
*	author	 :  [email protected] 
*	date	 :  2024/06/04
* 	note	 :  None
*   version  :
* 	
* *********************************************************************************/
void *recv_udp_msg(void *arg)
{

	//1.需要先綁定伺服器的埠和地址
	struct sockaddr_in  host_addr;

	host_addr.sin_family 		= AF_INET; 					//協議族,是固定的
	host_addr.sin_port   		= htons(60000);				//目標埠,必須轉換為網路位元組序
	host_addr.sin_addr.s_addr   = htonl(INADDR_ANY);		//目標地址 "192.168.64.xxx"  已經轉換為網路位元組序  INADDR_ANY

	bind(udp_socket,(struct sockaddr *)&host_addr, sizeof(host_addr));

	//3.調用recvfrom等待接收數據,並且接收客戶端的網路信息
	char buf[128] = {0};
	char *p = (char *)calloc(1,sizeof(char) * 32) ;
	struct sockaddr_in  client;
	socklen_t client_len = sizeof(client);

	while(1)
	{
		p = GetTime();
		recvfrom(udp_socket,buf,sizeof(buf), 0 ,(struct sockaddr *)&client,&client_len); //預設會阻塞
		printf("[%s,%s]:%s\n",inet_ntoa(client.sin_addr),p,buf);
		bzero(buf,sizeof(buf));
	}
}
// 運行客戶端可執行文件   ./xxx  伺服器埠  伺服器地址

int main(int argc,char *argv[])
{
	//檢查參數有效性
	// if (argc != 3)
	// {
	// 	fprintf(stderr, "argument is invaild ,errno:%d,%s\n",errno,strerror(errno));
	// 	exit(1);
	// }

	//1.創建UDP套接字             
	udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
	if (udp_socket == -1)
	{
		fprintf(stderr, "udp socket error,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	//設置組播選項
	struct ip_mreqn mreqn;
	mreqn.imr_multiaddr.s_addr = inet_addr("226.66.66.66");		//組地址
	mreqn.imr_address.s_addr = htonl(INADDR_ANY);				//本地地址 inet_addr("192.168.64.97")
	mreqn.imr_ifindex = 0;										//介面索引
	
	setsockopt(udp_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreqn,sizeof(mreqn));


	//設置廣播屬性
	int opt = 1;
	setsockopt(udp_socket,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));

	//設置組播屬性
	// setsockopt(udp_socket,IPPROTO_IP,IP_MULTICAST_TTL,&opt,sizeof(opt));

	//2.創建子線程
	pthread_t recv_thread;
	pthread_create(&recv_thread,NULL,recv_udp_msg,NULL);

	//2.向目標主機發送消息,需要設置目標埠和目標地址
	char buf[128] = {0};
	
	struct sockaddr_in  dest_addr;
	dest_addr.sin_family 		= AF_INET; 						//協議族,是固定的
	dest_addr.sin_port   		= htons(60000);					//伺服器埠,必須轉換為網路位元組序
	dest_addr.sin_addr.s_addr   = inet_addr("226.66.66.66");	//伺服器地址 "192.168.64.xxx"  

	//3.發送客戶端的上線時間
	while(1)
	{
		scanf("%s",buf);
		sendto(udp_socket,buf,strlen(buf),0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));

	}
	
	
	

	return 0;

}

結果


image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他的軟體在客戶那邊不知道什麼原因崩掉了,從windows事件日誌看崩潰在 clr 里,讓我能否幫忙定位下,dump 也抓到了,既然dump有了,接下來就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼崩潰在 clr 一般來說崩潰在clr ...
  • 問題 對於驗證複雜JSON數據是否合法的需求,通常的解決方式是標準JSON Schema,.Net下有對應的JSON Schema實現庫。應用程式通常需要將標準JSON schema傳入實現庫,來做後續的數據驗證。這裡有一種情況,就是如果使用者不太瞭解標準JSON Schema格式,但又希望能在自己 ...
  • 寫了個盯盤小工具,最近發現很多炒股的小伙伴,上班期間看手機頻繁是不是影響不好?電腦上打開交易軟體,那影響是不是更不好?所以我就寫了個小工具,給大家“摸魚”用。雖然是摸魚用,但是平常丟一邊,或者你自己改造下代碼,寫個死迴圈在控制台裡面刷新等等,或者輸出到VS的輸出欄裡面等等,都行,也不會影響你工作,還 ...
  • 前言:最近幾天有好幾個小伙伴玩WPF,遇到不同頁面,不知道要怎麼傳遞消息。於是,我今天就來演示一個事件聚合器的玩法,採用prism框架來實現。作為福利,內容附帶了主頁面打開對話框時候直接通過參數傳遞消息的一個小例子,具體請自行圍觀。 以下內容,創建wpf項目以及引用prism和實現依賴註入等細節,可 ...
  • 本文分享自天翼雲開發者社區《linux各個目錄的作用》,作者:技術小白 /bin/:存放系統命令的目錄,普通用戶和超級用戶都可以執行,不過放在/bin下的命令在單用戶模式下也可以執行; /sbin/:保存和系統環境設置相關的命令,只有超級用戶可以使用這些命令進行系統環境設置,但是有些命令可以允許普通 ...
  • 目錄傳輸控制協議(TCP)TCP協議 的特點TCP協議的可靠性TCP的連接機制 傳輸控制協議(TCP) 傳輸控制協議(TCP)用於作為包交換電腦通信網路中的主機以及此類網路的互連繫統中的高度可靠的主機對主機協議。 TCP協議 的特點 TCP協議是面向連接的,端到端可靠的協議,該協議被設計適應支持多 ...
  • 目錄題目一解析代碼實現題目二:解析代碼實現tcp_client.ctcp_server.c 題目一 設計程式實現解析www.baidu.com的功能變數名稱,把獲取到的百度的IP地址全部輸出到終端並驗證是否正確。 解析 主機打算響應某個網站的網路請求,但是只知道網站功能變數名稱是無法通信的,需要對功能變數名稱進行地址解析, ...
  • 移植 使用預設模板工程新建一個RT-Thread項目,BSP版本為1.1.1 打開RT-Thread Settings,點擊右側箭頭按鈕進入詳細頁,在硬體欄開啟以下幾個配置選項(LCD、觸摸屏、demo) 此時,打開board文件夾,發現下麵會有一個lvgl的目錄,package目錄下會有LVGL和 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...