zoukankan      html  css  js  c++  java
  • C# Socket 怎么自定义文件传送协议

    服务端和客户是通过这样一个结构体进行通信的

    using System;
    using System.IO;
    using System.Runtime.InteropServices;

    namespace AUS.Common
    {
    /// <summary>
    /// 通信结构体
    /// </summary>
    [Serializable]
    [StructLayout(LayoutKind.Sequential, Pack
    = 1)]
    public struct Packet
    {
    public cmd cmd;
    public int len;
    public byte[] body;
    }
    }

     

    比如我现在要做一个 文件传输,,

    要把服务端两个文件( LinFx.dll,  AUS.Common.dll ) 传给客户端

    文件一个一个发送

                FileInfo[] files = FileRead.GetFiles();

    Packet p
    = new Packet();
    p.cmd
    = cmd.下载;


    //循环发送文件
    foreach (FileInfo file in files)
    {
    p.len
    = files.Length;
    using (FileStream fs = new FileStream(file.FullName, FileMode.Open))
    {
    int nRead;
    do
    {
    byte[] buf = new byte[1024];
    nRead
    = fs.Read(buf, 0, buf.Length);
    }
    while (nRead > 0);
    }

    //发送
    Send(p.ToBytes());
    }

      

    这里其在的协议要怎么样去定义好呢

    客户端收接

            void Client_EventRecv(RecvEventArgs e)
    {
    Packet p
    = Packet.FormBytes(e.Buffer, e.Offset, e.Lenght);

    if (p.cmd == cmd.返回清单)
    {
    Ver[] collection
    = H.FormBytes(p.body) as Ver[];
    p
    = new Packet();
    p.cmd
    = cmd.下载;
    p.body
    = H.ToBytes(collection);
    Send(p.ToBytes());
    }
    else if (p.cmd == cmd.下载)
    {
    //接到服务端传来的一个文件
    }
    }

    是不是这样一个场景:

        服务端发送一个 包,

    告诉客户端,,文件名, 文件大小,

    然后再文件的数据包,,

    客户端, 收到第一个包,,然后创建文件,,

    接着再接收数据

    服务端读取文件的时候, 是读一点就发送一点,,

    还是弄个大 buffer 一次读完, 发送

  • 相关阅读:
    GPO
    GPO
    GPO
    Active Directory
    Active Directory
    Ethical Hacking
    Tree and Queries CodeForces
    数颜色 HYSBZ
    Powerful array CodeForces
    Group HDU
  • 原文地址:https://www.cnblogs.com/LinFx/p/2153232.html
Copyright © 2011-2022 走看看