Tag: 网络编程

.NET Ping()给出错误的超时?

我有一个循环的脚本,每秒向主机发送一次ping。 其目的是测试我的家庭网络上的无线性能。 问题是,我似乎从我的脚本中获得超时,而任一客户端(pingER和pingEE)上的标准“ping -t”都没有这样的超时。 事实上,在最后30分钟内没有一次超时,而我的脚本每隔几分钟就收到超时回复。 我的基本脚本如下。 在所有情况下,当它确实发生时,我的回复是TimedOut,响应时间为0ms。 我的脚本是否导致错误超时? 谢谢。 编辑:更新代码以反映最新的更改,仍然具有相同的行为。 while (true) { System.Threading.Thread.Sleep(delay); var builder = new StringBuilder(); hosts.ForEach(h => { var buffer = new byte[32]; var reply = ping.Send(h, 4000, buffer, new PingOptions(600, true)); var error = reply.Status != IPStatus.Success || reply.RoundtripTime > maxRoundTrip; if (verbose || error) { builder.AppendFormat(“{0}: {1} ({2}ms)”, h, […]

将Ping应用程序转换为multithreading版本以提高速度 – C#

我有一个应用程序,它会ping本地子网上的每个可能的IP,以便编译响应的IP地址列表。 目前,它一次ping所有255个。 是否可以将此应用程序转换为使用多个线程来通过一次ping多个来提高速度? 我是multithreading概念的新手,并认为这是一个很好的学习方法(只要当然可能)。 此外,您可以教育我的任何风格改进也会有所帮助。 提前谢谢 这是backgroundWorker1_DoWork事件中的当前ping方法。 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { count = 0; for (int i = 1; i < 255; i++) { Ping ping = new Ping(); PingReply pingreply = ping.Send(IPAddress.Parse(locip[0] + "." + locip[1] + "." + locip[2] + "." + i)); count += 1; if (pingreply.Status == IPStatus.Success) […]

C#套接字与管道

目前我正在开发Windows上的多进程桌面应用程序。 此应用程序将是一个收缩包装的应用程序,它将部署在世界各地的客户端计算机上。 虽然我们可以对机器有广泛的规格 – 例如带有.Net 4.0 CF的Windows XP SP3,但我们无法控制它们,我们无法对其配置过于具体 – 例如我们无法指定机器必须具有cuda 1.4图形处理器等等 其中一些进程是托管的(.Net 4.0),其他进程是非托管的(C ++ Win32)。 这些流程需要共享数据。 我迄今评估的选项是 Tcp套接字 命名管道 管道看起来好一点,但是对于我们的需求 – 两者的性能都是可以接受的。 套接字为我们提供了跨越机器(和操作系统 – 我们最终支持非Microsoft操作系统)边界的灵活性,因此我们倾向于使用套接字。 但是 – 我主要担心的是 – 如果我们使用Tcp套接字 – 我们是否可能遇到防火墙问题? 是否有其他人部署了使用TCP进行IPC和经历过问题的桌面应用程序/程序? 如果是这样 – 什么样的? 我知道这是一个相当开放的问题,我很乐意改写。 但我真的想知道我们可能会遇到什么样的潜在问题。 编辑:为了更轻松 – 我们只运送一些POD,整数,浮点数和字符串。 我们构建了一个抽象层,提供了两种范例 – 请求/响应和订阅。 传输层已被抽象出来,目前我们有两个实现 – 基于管道和基于TCP。

内部IP地址和外部IP地址之间的区别

谁能告诉我内部IP地址和外部IP地址有什么区别? 如何使用Java,C#或Adobe AIR等编程语言?

如何从服务器中的客户端池中识别客户端 – 设计

好的,我有一个我正在工作的客户端/服务器库。 服务器可以接受来自客户端的多个连接。 在每次调用Accept()时,如果成功,客户端套接字的句柄将被推送到地图,并将假定的唯一ID作为键。 因此,当服务器稍后想要向特定客户端发送消息时,它将使用此ID找到客户端。 我的问题:每个客户的唯一ID是什么? IP地址不可用,因为多个客户端可以来自同一IP地址。 如果没有,任何人都可以建议一些其他好的设计。 谢谢 插图: ClientSocket workerSock = Server.Accept(); Map.Add(workerSock); Map ____________________ |Key | Value | |——————| | ? |workerSock1| ———————— client application 1 |——————| | ? |workerSock2| ———————— client application 2 |——————| | ? |workerSock3| ———————— client application 3 ——————– 场景:服务器想要发送到特定客户端,因此它必须具有一些ID。

从麦克风听到传入的音频

我只是想听听我对使用NAudio的麦克风所说的话,这是我的代码到目前为止,但问题是我听不到任何声音。 任何帮助,将不胜感激。 public partial class frmMain : Form { private WaveIn waveIn; // Gets an audio from microphone private WaveOut waveOut; // Sends audio to speaker private BufferedWaveProvider waveProvider; // Gets an audio from stream public frmMain() { InitializeComponent(); } private void frmMain_Load(object sender, EventArgs e) { waveOut = new WaveOut(); waveIn = new WaveIn(); […]

获取当前网络连接的属性

如何确定或检查当前网络连接的连接配置文件(如果有)? 具体来说,我需要确定当前连接是否是私有网络或公共网络,并从那里确定网络发现是打开还是关闭。 看起来这些信息可以通过Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles()或NetworkInformation.GetInternetConnectionProfile()函数在Windowsapp store应用中随时可用, 但这是一个必须在Win 7和Server 2008上运行的标准桌面应用以及Win 8和Server 2012。 枚举计算机上的NIC不是问题,但这并不能解决我的问题 – 我需要获取连接的属性,而不是物理设备 。 是否有一种内置的方式来实现.Net框架? 或者可以用WMI完成吗? 或者作为一种粗略的替代方案,可以通过调用netsh命令来完成(虽然这似乎取决于要运行的dot3svc和/或wlansvc服务)?

从主机名创建IPEndPoint

我正在使用需要“IPEndPoint”的第三方DLL。 由于用户可以输入IP地址或主机名,因此我需要先将主机名转换为IP地址,然后才能创建IPEndPoint。 是否有任何function在.net中执行此操作,或者我将不得不编写自己的DNS查找代码?

关闭所有底层网络连接

背景: 我有一些代码连接到服务器来提取数据。 但是,在某些时候程序进入了无法连接到服务器的状态。 我们看到的问题是,当我们尝试重新连接时,服务器不断超时。 插入: 我们将超时设置为我们的网络插件(Thrift插件)使用的默认值。 这些值是100k毫秒超时和300k毫秒读写超时。 不完全是短暂的超时。 此外,每次我们尝试重新连接时,我们都会重新创建插件的类,因此每当我们尝试重新连接时,内部设置的值都会重置。 我认为超时不是问题。 我相信插件不是问题。 网络: 我们看到这些重复的超时发生了半个小时。 当我们重新启动服务(而不是机器)时,它立即重新上线。 所以,我知道这不是一个网络问题。 这让我相信我们的代码中的东西正在进入无效的网络状态。 此外,它是一个我们无法控制的状态,因为我们的插件隐藏了我们所有好的网络内容 – 包括超时,保持标记和连接组(以及其他)。 我们基本上无法访问HTTPWebReqest成员。 题: 当我们的网络设置进入此状态时,我们会尝试关闭所有连接并重新连接到服务器。 目标是杀死所有活动连接,以便重置我们进入的任何状态。 但是,当我们尝试重新连接时,我们的重新连接会超时。 不知何故(可能是由于KeepAlive和TCP Pipelining,我们无法控制),即使我们已关闭所有连接,网络连接仍保持打开状态。 这使我们处于不良状态并阻止我们将连接循环到服务器。 问题是: 我如何杀死服务器的所有底层连接以强制重新连接?

游戏网络弹丸实施/概念问题

我试图通过同步射弹射击和游戏网络来解决常见问题的某种解决方案,但我不确定什么是最合适的。 这是一个2D动作侧卷轴,带有几个射弹(没有即时击中武器),并且已经有很多框架(C#XNA框架和Lidgren库)。 此时我认为架构将被建模,类似于半衰期源引擎。 客户端将在过去(固定步骤30fps)并使用客户端侧预测插入远程实体~100ms或大约3帧。 服务器拥有模拟权限。 考虑使用移动编码实现似乎很好,但是当涉及到射弹时,我不确定如何最好地为所有玩家提供最佳游戏。 示例问题: 客户A. 客户B. 服务器 客户A和B只是站在一起面对面。 客户端B开始向A发射并像往常一样向服务器发送输入。 服务器检测到火灾输入并开始在其模拟中发射武器,同时将事件转发给客户端A. 客户端A接收消息但过去仍然在插入客户端B(同时射弹现在在服务器和客户端Bs机器上朝向A)。 客户端A的渲染最终到达B射击射弹并开始渲染的点。 客户A看到它并跳转,轻松地在屏幕上清除它。 然而,射弹击中了他在服务器上和客户端Bs的观点。 这也是2D sidescroller所以一切都是可见的。 这似乎是使用插值的一个基本的副作用(我认为这是必须的,但我愿意接受建议),因为即使没有任何网络延迟,也存在固有的插值延迟。 题: 我知道它不可能是完美的,但有没有更多或更好的方法可以实现混淆或改善它以使它看起来很好/无缝,或者我错过任何明显的东西? 在实际发射射弹之前,武器的发射确实有一个短暂的动画时间,我意识到我们可以利用那个时间来隐藏一些延迟,但是武器不会立即射击,而且任何我看它的方式总是与客户试图躲避射弹和其他客户看到他们的射弹击中它们之间存在巨大差距。 对于玩家正在移动的情况,我们可以在服务器上使用滞后补偿,但我不认为这可以帮助这种情况? 如果射弹击中导致客户A的位置被改变,我将不得不倒回客户A并用新数据重放他的输入,或者如果它没有,我必须从空中移除射弹(也许他们死了),丑陋无论哪种方式 :(。