c# - 将文件从客户端发送到服务器

标签 c# sockets

我正在尝试每 2 秒将多个文件发送到服务器,并且在发送文件后将其删除并重新启动程序以再次生成需要再次发送到服务器的文件。

但它一直工作到服务器在线...如果服务器重新启动,所有程序功能都会正常工作,但是当调用此功能时,它会继续显示 “无法建立连接,因为目标机器主动拒绝了它”无论服务器何时在线..

        private void sendfile()
    {
        timer.Stop();
        RegistryKey theLocalMachine = Registry.LocalMachine;
        RegistryKey theSystem2 = theLocalMachine.OpenSubKey(@"SOFTWARE\\NetworkUsagemonitoring\\", true);
        RegistryKey interfacekey4 = theSystem2.OpenSubKey("Usagerecorder", true);
        string serverno = interfacekey4.GetValue("serverno").ToString();
        for (int i = 0; i < netarr1.Length; i++)
        {
            for (int j = 0; j < netarr2.Length; j++)
            {
                if (netarr1[i].Name == netarr2[j])
                {
                    if (recorded[j] == 1)
                    {
                        try
                        {
                            IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(serverno), 5656);
                            Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

                            if (File.Exists(@"C:\" + netarr1[i].Name + "_record.xml"))
                            {
                                fileName = (@"C:\" + netarr1[i].Name + "_record.xml");
                                fileName = fileName.Replace("\\", "/");
                                while (fileName.IndexOf("/") > -1)
                                {
                                    filePath += fileName.Substring(0, fileName.IndexOf("/") + 1);
                                    fileName = fileName.Substring(fileName.IndexOf("/") + 1);
                                }
                                byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);
                                if (fileNameByte.Length > 850 * 1024)
                                {
                                    return;
                                }

                                byte[] fileData = File.ReadAllBytes(filePath + fileName);
                                byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length];
                                byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);

                                fileNameLen.CopyTo(clientData, 0);
                                fileNameByte.CopyTo(clientData, 4);
                                fileData.CopyTo(clientData, 4 + fileNameByte.Length);
                                clientSock.Connect(ipEnd);
                                clientSock.Send(clientData);
                                clientSock.Close();
                                recorded[j] = 0;
                                File.Delete(@"C:\" + netarr1[i].Name + "_record.xml");
                            }
                            else
                            {
                                UpdateNetwork_Interface();
                            }
                        }
                        catch (Exception ex)
                        {
                            LogEvent("No connection could be made because the target machine actively refused it", EventLogEntryType.Information);
                            break;
                        }
                        finally
                        {
                            j++;
                        }

                    }
                    else
                    {
                        UpdateNetwork_Interface();
                    }
                }
            }
        }
    }

我想要的是服务器离线或 “无法建立连接,因为目标机器主动拒绝了它”显示...程序应继续循环并不受阻碍地移动,直到服务器联机并将更新的文件发送到服务器。

最佳答案

好吧,你的异常处理是错误的。您正在捕获 (Exception ex) 并打印出您引用的错误消息。 ACTUALL 异常完全有可能与您正在写入和删除的文件有关。也许某些文件无法删除或打开。

查看代码,我怀疑问题是如果出现异常,您永远不会真正关闭套接字。

您应该在 finally 子句中添加以下内容。

if (clientSocket!=null)
   clientSocket.Close();

并且您应该将实际的异常消息打印到错误日志中,这样您就知道发生错误时到底发生了什么。

关于c# - 将文件从客户端发送到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5690521/

相关文章:

C#:将作业分包给多处理器机器上的工作进程

c# - 如何初始化AForge网络摄像头

c - C 中 send() 的最大 size_t 值

ruby - 网络 - 要发送到服务器的数据

sockets - 如果服务器和客户端都在同一台计算机上进行处理,对套接字的需求是什么?

c# toString() 性能

c# - Json.NET 在 DateTime 上禁用反序列化

c# - 将 C 转换为 C#

Python pythonw 子进程 check_output 不起作用

php - 如何以编程方式生成连接重置?