C# Socket 入門4 UPD 發送結構體(轉)

來源:互聯網
上載者:User

標籤:style   blog   http   io   color   os   ar   for   sp   

今天我們來學 socket  發送結構體

1. 先看要發送的結構體

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

namespace Lin.p2p.Mo
{
    /// <summary>
    /// 通訊訊息格式
    /// </summary>
    [Serializable]
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct CP2PMessage
    {
        public sbyte nMessageTypes;
        public int Value;
    }
}

2. 請看服務端

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using Lin.p2p;
using Lin.p2p.Mo;

namespace ConsoleApplication1
{
    class Program
    {
        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("This is a Server, host name is {0}", Dns.GetHostName());
            Console.WriteLine("Waiting for a client...");

            // 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)Tool.BytesToStruct(buffer, msg.GetType());

            Console.WriteLine("接收的值為:{0}", msg.Value);

            Console.ReadKey();
        }
    }
}

2.其中重要的一段就是把  結構體轉為 byte數組

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;

namespace Lin.p2p.Mo
{
    public class Tool
    {
        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. 最後看用戶端

            // 1.建立套節字
             m_s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            // 2.填寫伺服器IP
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint ipe = new IPEndPoint(ip, 4321);


            //向伺服器發送本使用者資訊
             CP2PMessage msg = new CP2PMessage();
            msg.nMessageTypes = (sbyte)Cmd.UserLogin;
            msg.Value = 10;

            var buffer = Fun.StructToBytes(msg);

            m_s.SendTo(buffer, buffer.Length, SocketFlags.None, ipe);

            Console.ReadKey();

4. 哈哈,當然, 效果來也~~

C# Socket 入門4 UPD 發送結構體(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.