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;三种。英语好的童鞋看完这张图应…

VxWorks下几种定时延时方法的小结

1 taskDelay taskdelay()提供了一个简单的任务睡眠机制&#xff0c;也常用于需要定时/延时机制的应用中。 它的格式是 STATUS taskDelay(int ticks /* number of ticks to delay task */ )&#xff0c; 可以看出使用该函数实现延时的单位为tick&#xff08;一般系统中一个…

C#中ToString格式大全

C 货币 2.5.ToString("C") &#xffe5;2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString("E") 2.500000E005 F 固定点 25.ToString("F2") 25.00 …

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…

VxWorks中Timer机制

[摘要] Timer是实时操作系统的一个重要组成部分。本文结合近阶段的学习和实验情况&#xff0c;对VxWorks中的时间函数和定时器作了一些探讨。主要介绍了Timer的机制&#xff0c;相关的函数&#xff0c;并给出了一些具体的例子。 一. Tick Tick是指每秒中定时器中断的次数。POS…

LINK : fatal error LNK1104: 无法打开文件“LIBCD.lib”

出现这类问题一般是由于所运行的项目是VC6&#xff08;或者vs2003)创建的&#xff0c;而后又用VS2005或者更高版本工具打开项目导致的&#xff0c;原因都是因为LIBCD.lib文件被更改了.要解决问题的话&#xff0c;只要在链接设置那里忽略它就没问题了。 解决办法是&#xff1a; …

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;研究方向为大数据处理与机器学习。成立几年来为学校…

POSIX定时器

最强大的定时器接口来自POSIX时钟系列&#xff0c;其创建、初始化以及删除一个定时器的行动被分为三个不同的函数&#xff1a;timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁它)。 创建一个定时器&#xff1a; int timer_create(clockid_t …

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

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

扣扣保镖我喜欢

扣-扣-保-镖还是挺好用的&#xff0c;上次360召回之后&#xff0c;网上的下载链接都失效了&#xff0c;不过今天偶然发现我的硬盘上还有一份。。就打开试试&#xff0c;结果没事的哈。 qq版本&#xff1a;qq2010正式版 sp2.1(1861) 趣盘下载地址&#xff1a;http://oskycar.qup…

栅格计算面积

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、伺服运动…