Tag: 网络编程

如何为Unity3d设计我的在线游戏服务器?

最近,我一直在unity3d做多人游戏开发。 我非常清楚Unity的MasterServer如何在统一中工作。 但现在我想从头开始制作自己的游戏服务器。 我研究并了解我们可以使用Google云计算和应用引擎来制作我们自己的配对服务器和游戏主机服务器。 但我完全无能为力,我们如何开始编写服务器代码。 我们使用简单的http请求和json结果吗? 或者还有其他技术可以实时与FPS类型的游戏一起使用。 我不认为发送http请求并等待它的结果可以足够快,可以在FPS类型的游戏中工作,每秒我们发送超过100个数据。 起初我想到编写PHP脚本并将其托管到某个URL,然后向该URL发送请求并等待其响应。 但我发现如果我使用这个过程然后只是从服务器获得一个响应它将花费我至少0.5秒或更多。 在这种情况下,游戏中会有很多延迟。 我知道游戏服务器可以在某种tcp或udp网络上运行。 但我的问题是,我应该为服务器提供什么样的应用程序来接收这些数据并快速发送处理结果。

高性能网络应用程序的最佳实践

在测试我在Windows 7 Ultimate x64上编写的UDP多播服务器时,我遇到了一个最奇怪的事情。 在背景中使用foobar2000播放音乐显着提高了服务器的传输速率,同时也导致了轻微的数据包丢失。 关闭音乐会立即将传输速率降低到可接受的水平以下,但也会产生0个数据包丢失。 (我有一个客户端应用程序与服务器通信并报告未确认的数据包) 我知道Vista的(和更高)限制行为使媒体和网络应用程序很好地协同工作,但我当然没想到播放音乐会提高网络性能,也不会让网络性能降低如此显着。 从我的服务器应用程序的代码角度来看 ,我能做些什么,以便无论是否在Vista上播放音乐,它都能始终如一地执行? 我当然希望避免告知我的所有客户如何调整他们的注册表以获得可接受的传输速率,并且还希望避免让他们简单地“播放音乐”以获得可接受的传输速率。 在我看来,应用程序应该“正常工作”。 我认为解决方案涉及过程优先级,MMCSS或可能的其他一些模糊的Windows API调用,以使其在此处执行The Right Thing(TM)。 此外,抱歉,创建一个可重现的测试用例是一项非常重要的工作。 仅当物理NIC的驱动程序正在主动执行工作且无法使用环回接口再现时,才会发生限制行为。 人们需要客户端实现,服务器实现和物理网络硬件来进行测试。

检查IP是否在LAN中(防火墙和路由器后面)

我现在已经在网上爬了大约5个小时,但找不到我的问题的解决方案: 我的公司正在开发一款教育游戏,我正在使用Monotorrent为它编写一个autoupdater。 该游戏将在学校中使用,但由于大多数学校只有非常弱的互联网连接,因此网络中只应有一台从httpseeder下载的计算机,而其他计算机应从从httpseed下载的一台计算机中获取。 因此,我从跟踪器获取大量IP地址,并且只需要过滤掉LAN中的IP地址。 当然,学校有时对防火墙非常严格,学校的某些计算机之间会有大量的路由器和交换机。 我已经尝试过大多数解决方案,比如 NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface iface in interfaces) { IPInterfaceProperties properties = iface.GetIPProperties(); foreach (UnicastIPAddressInformation address in properties.UnicastAddresses) { Console.WriteLine( “{0} (Mask: {1})”, address.Address, address.IPv4Mask ); } } 或者类似的技术只提供路由器/交换机/其他信息。 简而言之,我想要做的是检查是否可以通过LAN访问给定的IP。 我真的很感激任何帮助,因为这个function是剩下的最后一个:)

C#中multithreading网络服务器的模式

我可以遵循设计multithreading服务器的模板/模式/指南吗? 我通过谷歌搜索在网上找不到任何非常有用的东西。 我的程序将启动一个线程来使用TcpListener监听连接。 每个客户端连接都将由它自己的IClientHandler线程处理。 服务器将clientHandler.HandleClient包装在委托中,调用BeginInvoke,然后退出关心它。 我还需要能够干净地关闭监听线程,这是我没有找到很多在线的例子。 我假设将一些lock / AutoResetEvents / threading魔法与异步BeginAceptTcpClient和EndAcceptTcpClient混合在一起会让我在那里,但是当谈到网络代码时,对我而言,这一切都已完成。 所以我不得不相信只有一些模式我可以遵循并且不会被无数的multithreading角落情况完全混淆,我似乎无法完美。 谢谢。

如何使用Ping.SendAsync与datagridview一起使用?

我有一个应用程序ping datagridview中的每个IP,以编译响应的IP RoundtripTime列表。完成该步骤后,我将RoundtripTime推回到datagridview。 … foreach (DataGridViewRow row in this.gvServersList.Rows) { this.current_row = row; string ip = row.Cells[“ipaddr_hide”].Value.ToString(); ping = new Ping(); ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); ping.SendAsync(ip, 1000); System.Threading.Thread.Sleep(5); } … private static void ping_PingCompleted(object sender, PingCompletedEventArgs e) { var reply = e.Reply; DataGridViewRow row = this.current_row; //notice here DataGridViewCell speed_cell = row.Cells[“speed”]; speed_cell.Value = reply.RoundtripTime; […]

是否可以重置ServicePointManager?

我试图遵循类似于System.Net.Mail.SMTPClient如何进行本地IP绑定的代码我在具有多个IP地址的计算机上使用Windows 7和.Net 4.0。 我定义了BindIPEndPointDelegate private static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount) { string IPAddr = //some logic to return a different IP each time return new IPEndPoint(IPAddr, 0); } 然后我使用发送电子邮件 SmtpClient client = new SmtpClient(); client.Host = SMTP_SERVER; //IP Address as string client.Port = 25; client.EnableSsl = false; client.ServicePoint.BindIPEndPointDelegate = new System.Net.BindIPEndPoint(BindIPEndPointCallback); client.ServicePoint.ConnectionLeaseTimeout […]

NetworkStream不支持搜索操作

我正在创建简单的代理服务器,但我遇到了一个奇怪的情况,我遵循以下代码: var clientRequestStream = _tcpClient.GetStream(); var requestHeader = clientRequestStream.GetUtf8String(); GetUtf8String是Stream类的扩展方法,它读取流(包含HttpRequest头)。 我需要提取这些标头以访问Host和Requested Url。 一旦读完NetworkStream就完成了。 我需要执行搜索操作并设置其clientRequestStream.Position = 0; 因为我要读取该流并将其写入另一个远程NetworkStream 。 我不知道如何解决这个问题。任何建议都会有所帮助。 编辑:我也尝试将NetworkStream复制到MemoryStream然后对MemoryStream执行搜索操作,没有exception,但是当我想从NetworkStream读取时,它的缓冲区始终是空的。 我还使用了reflection器来查看Stream.CopyTo发生了什么。 见下面的代码: private void InternalCopyTo(Stream destination, int bufferSize) { int num; byte[] buffer = new byte[bufferSize]; while ((num = this.Read(buffer, 0, buffer.Length)) != 0) { destination.Write(buffer, 0, num); } } 这就是CopyTo所做的。 即使我使用CopyTo问题仍未解决。 因为它读取源(Here NetworkStream)到最后。 我有另一种处理这种情况的方法吗?

使用.NET’Async’API防止TIME_WAIT

我有一个问题,我开发了一个客户端和服务器包装器供我个人使用,但遗憾的是由于网络编程知识不足,我在客户端连接时遇到TIME_WAIT问题。 我的客户端现在尝试在短时间内与同一主机建立多个连接,我发现主要原因是因为我正在尝试重用套接字并且它进入TIME_WAIT状态因为我正在关闭没有正常关机的连接。 我想知道使用.NET套接字关闭连接的正确模式,以防我强烈使用’Async’API,即ConnectAsync,AcceptAsync,SendAsync,ReceiveAsync,DisconnectAsync等function(DisconnectAsync – 重用套接字)

WAN上的TCP / UDP套接字服务器

我在c#中编写了一个socket服务器,它将用作我所参与的小型游戏项目的基本设计。 套接字服务器在lan上运行良好。 我能够在服务器和客户端之间完全通信。 但是,在WAN上,服务器从客户端接收所有正确的消息,但客户端不从服务器接收消息。 客户端和服务器都在路由器后面,但只有服务器的路由器有端口转发。 当客户端连接到服务器时,我获得连接的IP地址。 由于客户端位于NAT后面,是否需要收集发件人的更多信息? 我假设客户端可以设置端口转发,但这对游戏来说非常适得其反。 我能得到的任何帮助表示赞赏。 如果您需要代码,请告诉我。 提前致谢。 用于从客户端建立TCP连接 public string ConnectionAttempt(string ServeIP, string PlayUsername) { username = PlayUsername; try { connectionClient = new TcpClient(ServeIP,TCP_PORT_NUMBER); connectionClient.GetStream().BeginRead(readbuffer, 0, READ_BUFFER_SIZE, new AsyncCallback(DoRead), null); Login(username); ipAddress = IPAddress.Parse(((IPEndPoint)connectionClient.Client.RemoteEndPoint).Address.ToString()); servIP = new IPEndPoint(ipAddress,65002); listenUDP = new IPEndPoint(ipAddress, 0); UDPListenerThread = new Thread(receiveUDP); UDPListenerThread.IsBackground = true; UDPListenerThread.Start(); […]

C#可以用管道传输吗?

我试图使用TCP和简单的文本命令控制网络上的程序(我最终可能会切换到二进制数据)。 但是,我想知道是否有办法对程序发送的数据进行编码并通过网络发送,然后对其进行解码并将其提供给收件人程序? 我目前的代码如下,但我试图找到一种更好的方法,而不是为ASCOM中的每个接口实现它。 显然,我还必须编写服务器端代码来实际执行请求的操作。 (仅供参考,这个是较小的一个。) 我相信它在通信中使用COM 。 因此,如果COM数据来自外部(调用方法,设置属性等),是否应该有一种方法来捕获该数据,将其通过网络传输,然后将其提供给另一台计算机上的收件人? class SwitchConverter : ASCOM.Interface.ISwitch { private Client client = new Client(); private string query(string query){ return client.query(query); } private void send(string command) { client.send(command); } public bool Connected { get { return bool.Parse(query(“SWITCHGETCONN”)); } set { send(“SWITCHSETCONN:” + value); } } public string Description { get { […]