在C#中从服务器向客户端发送一些约束

6 c# sockets

我在C#中使用套接字编程创建了一个简单的服务器,它将从客户端接收文件.我的示例代码段如下所示.

我想添加一些限制.我想限制文件大小(例如4 KB或2 KB)和允许的文件格式(例如.doc,.txt,.cpp等),这些格式将在客户端发送到客户端连接到服务器,以便客户端可以相应地发送文件.我该怎么做?

示例代码段:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;

namespace FileTransfer
{
    class Program
    {
        static void Main(string[] args)
        {
            // Listen on port 1234

            TcpListener tcpListener = new TcpListener(IPAddress.Any, 1234);
            tcpListener.Start();

            Console.WriteLine("Server started");

            //Infinite loop to connect to new clients
            while (true)
            {
                // Accept a TcpClient
                TcpClient tcpClient = tcpListener.AcceptTcpClient();
                                Console.WriteLine("Connected to client");
                byte[] data = new byte[1024];
                NetworkStream ns = tcpClient.GetStream();
                int recv = ns.Read(data, 0, data.Length);
                StreamReader reader = new StreamReader(tcpClient.GetStream());

               //Will add some lines to add restrictions...

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我还需要添加哪些代码才能将限制发送给客户端?

Cod*_*ter 3

您似乎犯了经典的套接字错误。给定的代码和解释似乎假设套接字处理消息。他们不知道。当以这种方式使用时,您使用的是流式互联网套接字,它提供流,而不是消息

您没有显示任何执行实际发送的代码,因此我猜测您只是将文件的数据发送到另一端并关闭连接。否则您如何知道您已成功传输整个文件?

为了通过套接字有效地交换数据,客户端和服务器必须遵循的这套规则称为应用程序协议。你必须拥有一个,否则你只会将数据发送到$deity 知道的地方,而你根本无法控制它。这意味着服务器和客户端都知道发生了什么,他们只会发送和接收数据并希望一切顺利。因此,您不必在代码中添加“几行”,而是必须完全重构它。

定义应用程序协议的方法有很多种,也有很多选项可供选择,因此我将向您展示任意一种:以 ID 和有效负载长度(如果适用)为前缀的消息的文本解释,两者都在未指定的数值变量。例如,您可以选择小端四字节无符号整数。

这种格式的消息称为“类型/长度/值”或 TLV。所以我们定义这些消息:

ID  Name         Direction         Description                    Payload
1   ServerHello  Server -> Client  The server sends this message  None. 
                                   to every connecting client.    Or maybe server or 
                                                                  protocol version.
2   MaxUpload    Server -> Client  Sent after the ServerHello.    Maximum upload size 
                                                                  in bytes.
3   AllowedExts  Server -> Client  Allowed upload extensions,     The allowed extensions. 
                                   comma-separated. Sent after 
                                   MaxUpload message.
10  IncomingFile Client -> Server  There's a file coming.         The file name.
11  FileUpload   Client -> Server  The file to upload.            The file data.
                                   Sent after IncomingFile.
Run Code Online (Sandbox Code Playgroud)

现在所需要做的就是在服务器和客户端中实现此应用程序协议,然后就完成了。

您还必须决定如果客户端或服务器不遵守协议该怎么办。例如,它可以发送您无法解析的消息、未知的消息 ID、您不希望支持的消息长度、无序消息(FileUpload 在 IncomingFile 之前)或不支持的消息。与之前发送的消息保持一致,例如客户端上传的文件比服务器表示可接受的文件大或无效的扩展名。您还必须考虑“确认”或响应消息,例如服务器告诉客户端“好吧,继续,发送下一条消息”。

总而言之,这是一个非常广泛的问题,不容易回答。我试图在对你的问题的评论中解决这个问题,但该评论已被删除。所以在这里你有你的答案。

您可以在网上了解更多相关信息,例如Giorgi链接的Beej 的网络编程指南(请务必阅读整个指南)和Stephen Cleary 的博客