C# Socket 入门5 UPD 结构体 与 C++ 通信

1. 同样, 我们先看看这一个比简单的 结构体

代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace CSharp_Socket_5
{
    
/// <summary>
    
/// 通信消息格式
    
/// </summary>
    [Serializable]
    [StructLayout(LayoutKind.Sequential, Pack 
= 1)]
    
public struct CP2PMessage
    {
        
public ushort id;
    }
}

 

 

C++ 版本

struct CP2PMessage
{
    WORD id;
};

 

 

2. C# 服务端,  和之前的一样滴~~  看来是不是很亲切也~

代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Runtime.InteropServices;

namespace CSharp_Socket_5
{
    
class Program
    {
        
/// <summary>
        
/// 服务端
        
/// </summary>
        
/// <param name="args"></param>
        static void Main(string[] args)
        {
            
// 1.创建套节字
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            
// 2.填充IP
            IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 4321);

            
// 3.绑定
            socket.Bind(ipe);

            
// 等待客户机连接
            Console.WriteLine("这个服务器, host name is {0}", Dns.GetHostName());
            Console.WriteLine(
"等待客户端连接....");

            
// 4.得客户机IP
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint remote 
= (EndPoint)sender;

            
// 5.接收客户机数据
            byte[] buffer = new byte[1024];
            socket.ReceiveFrom(buffer, 
ref remote);

            CP2PMessage msg 
= new CP2PMessage();
            msg 
= (CP2PMessage)BytesToStruct(buffer, msg.GetType());

            Console.WriteLine(
"接C++收的值为:{0}", msg.id);

            Console.ReadKey();

        }

        
public static byte[] StructToBytes(object obj)
        {
            
int size = Marshal.SizeOf(obj);
            
byte[] bytes = new byte[size];
            IntPtr structPtr 
= Marshal.AllocHGlobal(size); //分配结构体大小的内存空间
            Marshal.StructureToPtr(obj, structPtr, false); //将结构体拷到分配好的内存空间
            Marshal.Copy(structPtr, bytes, 0, size);       //从内存空间拷到byte数组
            Marshal.FreeHGlobal(structPtr);                //释放内存空间
            return bytes;
        }

        
public static object BytesToStruct(byte[] bytes, Type type)
        {
            
int size = Marshal.SizeOf(type);
            
if (size > bytes.Length)
                
return null;
            IntPtr structPtr 
= Marshal.AllocHGlobal(size); //分配结构大小的内存空间
            Marshal.Copy(bytes, 0, structPtr, size);       //将byte数组拷到分配好的内存空间
            object obj = Marshal.PtrToStructure(structPtr, type);
            Marshal.FreeHGlobal(structPtr);
            
return obj;
        }
    }
}

 

 

3. 重点了,,C++ 客户端

代码
#include <winsock2.h>
#include 
<stdio.h>
#pragma comment(lib, "WS2_32.lib")

struct CP2PMessage
{
    WORD id;
};

void main()
{
    
//初始化 WS2_32.dll
    WSADATA wsaData;
    ::WSAStartup(MAKEWORD(
2,2), & wsaData);

    
// 1.创建套节字
    SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    
// 2.填写服务器IP
    sockaddr_in sin;
    sin.sin_family 
= AF_INET;
    sin.sin_port 
= ::htons(4321);
    sin.sin_addr.S_un.S_addr 
= ::inet_addr("127.0.0.1");

    
// 3. 向服务器发送消息
    CP2PMessage msg;
    msg.id 
= 10;

    ::sendto(s, (
char*)&msg, sizeof(msg), 0, (sockaddr*)&sin, sizeof(sin));
}

 

 

4. 完成了,,,这么, 请看效果图!!

转载于:https://www.cnblogs.com/23shi/archive/2010/11/08/1871704.html

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

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

相关文章

坐标点获取并显示

在工作当中经常遇到根据名称获得相应坐标的情况,我们可以利用百度地图api来获取对应地点的坐标。 例如: 目前我们手中有需要获取大学坐标的名称,想要获取其坐标,并将其进行可视化显示。 以下是要查询的大学名称(现实当中可以是几千条数据) 以下是我们查询的结果 …

LSGO软件技术团队2015~2016学年第十周(1102~1108)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校…

matlab中GUI的属性检查器中的XLimMode是什么_如何在Matlab中使用GUI做一个简易音乐播放器? ---- (二)GUIDE...

咕咕怪由于昨天有重要的事情所以咕了一天的文章 &#xff08;感觉写得挺基础的&#xff0c;对各个部分有一定了解的童鞋可以直接跳过了解的部分用Matlab做一个app有几种办法呢&#xff1f;同样的&#xff0c;帮助文档告诉了我们答案&#xff1a;三种。英语好的童鞋看完这张图应…

DDMMSS.SS转为DD

有时候甲方会给我们一些坐标&#xff0c;但是在arcgis中是无法直接显示的 这是因为该格式是DDMMSS.SS的格式&#xff0c;而arcgis支持的是DD格式的&#xff0c;其中dd单位是度&#xff0c;mm单位是分&#xff0c;ss.ss单位是秒 所以要在arcgis中显示我们需要将其转换为DD的格式…

LSGO软件技术团队2015~2016学年第十一周(1109~1115)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…

maven springboot 除去指定的jar包_SpringBoot的运行机制

SpringBoot打包机制先看一眼spring-boot的maven插件打包后的target目录&#xff1a;其中有一个.jar.original的文件&#xff0c;一个.jar文件&#xff0c;其中.jar.original才是原始的jar包&#xff0c;而.jar文件是经过spring-boot的maven插件处理过后的jar&#xff0c;spring…

TVDI计算流程

TVDI计算过程 下载数据的网站: https://ladsweb.modaps.eosdis.nasa.gov/search/ 所需数据modis的16天的ndvi数据(MOD13A2)和每8天的LST数据(MOD11A2) 北半球选择Terra,南半前选择Aqua,因为两个卫星旋转是相对的,太阳高度角不同,会有些许误差 利用modis处理工具(MRT)…

LSGO软件技术团队2015~2016学年第十二周(1116~1122)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…

python append函数_让你python代码更快的3个小技巧!速度提高了一倍还多

大家好&#xff01;今天呢&#xff0c;我们来聊一聊如何加速你的 python 代码。Python 语言的优点可以列举出许多&#xff0c;语法简单易懂、模块丰富、应用广泛等等。但是世界上没有有完美的东西&#xff0c;python 一个明显缺点就是运行速度慢&#xff0c;至少跟 C 语言没法比…

栅格计算面积

1.进行栅格重分类 2.重分类 3.打开属性&#xff0c;查看像元大小 4.打开属性表 5.添加字段 6.打开字段计算器 7.计算结果如下&#xff08;单位一般为平方米&#xff09;

autotools使用

Makefile固然可以帮助make完成它的使命&#xff0c;但要承认的是&#xff0c;编写Makefile确实不是一件轻松的事&#xff0c;尤其对于一个较大的项目而言更是如此。那么&#xff0c;有没有一种轻松的手段生成Makefile而同时又能让我们享受make的优越性呢&#xff1f;本节要讲au…

LSGO软件技术团队2015~2016学年第十三周(1123~1129)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…

[转]揭开正则表达式的神秘面纱

揭开正则表达式的神秘面纱关闭高亮[原创文章&#xff0c;转载请保留或注明出处&#xff1a;http://www.regexlab.com/zh/regref.htm]引言正则表达式&#xff08;regular expression&#xff09;就是用一个“字符串”来描述一个特征&#xff0c;然后去验证另一个“字符串”是否符…

智能机器人及其应用ppt课件_一文了解!伺服系统机理及其在工业机器人等领域的应用...

更多&#xff0c;更及时的干货内容&#xff0c;请加我们的微信公众号&#xff1a;wc_sfdj诚邀业内人士及机构向我们投稿&#xff0c;投稿有礼投稿邮箱&#xff1a;tougao51wctt.com来源 | 网络欢迎阅读本篇文章&#xff0c;文末有福利哦&#xff01;(一)伺服系统综述1、伺服运动…

利用python爬取房价

​公众号二维码 爬取房价网站:(安居客)https://zb.fang.anjuke.com/loupan/all/ 由于该网站每隔一段时间需要进行验证(反爬虫),所以我们为了防止我们爬取信息的时候出现间断,所以需要借助execl来保证信息的连续性。 结果展示

python 计算订单_python实现apriori算法的关联规则之支持度、置信度、提升度

Apriori算法的简介 Apriori算法&#xff1a;使用候选项集找频繁项集 Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里&#xff0c;所有支持度大于最小支持度的项集…

LSGO软件技术团队2015~2016学年第十四周(1130~1206)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…

java安装和环境配置

下载jdk 网址为https://www.oracle.com/java/technologies/javase-downloads.html 2.安装jdk 3.配置环境 以下都是在系统变量下新建 为jdk安装目录 D:\Program Files\Java\jdk-15.0.2 .;%JAVA_HOME%\bin;%JAVA_HOME%\lib\tool.jar; %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 4.…

在Windows Azure中使用自己的域名

请参考:http://blog.smarx.com/posts/custom-domain-names-in-windows-azure 本文是对这篇文章部分解释和补充。 并请记住&#xff0c;此博客总是能给你在Windows Azure的开发中带来帮助。 域名解析机制浅析 域名解析&#xff0c;本是个很简单的事情&#xff1a;我们如若想将我…

LSGO软件技术团队2015~2016学年第十五周(1207~1213)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…