Articles of sockets

通过单个TCP连接复用多个TCP连接

我正在构build一个客户端服务器程序,客户端和服务器使用单个TCP连接进行连接。 在通信中有几个数据“通道”,我想在单个TCP连接上进行多路复用,同时在通道之间仍然具有良好的stream量控制(防止饥饿等)。 此外,隧道将是很好的,但不是一个要求。 我使用C,Windows。 我想过使用SSH,但我有几个问题: 我无法find一个很好的开源的Windows代码。 SSH中的大部分代码处理安全性,这是我不需要的。 对于我的需求来说,SSH似乎有些复杂,包括所有的X11,pty,shell等等。

Python原始套接字到以太网接口(Windows)

我试图创build一个DHCP服务器,第一步是我通过我的以太网端口发送数据包。 我试图发送数据包到我的以太网接口,并popup一个错误。 代码如下。 import socket def sendeth(src, dst, eth_type, payload, interface = "eth0"): """Send raw Ethernet packet on interface.""" assert(len(src) == len(dst) == 6) # 48-bit ethernet addresses assert(len(eth_type) == 2) # 16-bit ethernet type #s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW) s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) # From the docs: "For raw packet # sockets the address […]

在C#中使用Socket改进TCP转发器

我已经实现了一个连接到后端服务器的简单的TCP转发器。 该服务器在http://localhost:5000上设置,并且此TCP转发器正在侦听http://localhost:5001 。 使用另一台机器来产生负载使用wrk 这是一个HTTP基准testing工具来发电机负载 ,我有2个不同的结果。 当我将负载直接发送到基于asp.net core web api上时,每天处理超过230K个请求/秒,但是当我向这个TCP转发器发送负载时,可以处理83Krequest /秒。 这里是代码: using System; using System.Net; using System.Net.Sockets; namespace BrunoGarcia.Net { static void Main(string[] args) { new TcpForwarderSlim().Start( new IPEndPoint(IPAddress.Parse(args[0]), int.Parse(args[1])), new IPEndPoint(IPAddress.Parse(args[2]), int.Parse(args[3]))); } public class TcpForwarderSlim { private readonly Socket _mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); public void Start(IPEndPoint local, IPEndPoint remote) { […]

如何使用Windows套接字读取TCP窗口大小?

现在,我正在使用C语言编写一个轻量级的客户/服务器应用程序,以检查许多使用TCP将数据通过交换机发送到服务器的计算机的一些问题。 我需要读取一些stream量控制variables,例如窗口大小,重传数据包的数量等。 在Linux中,我用getsockopt,我读过这里的方法: http : //linuxgazette.net/136/pfeiffer.html,但我无法find一个等效的方法在Windows套接字API。

TCP连接在发送紧急数据后被重置

我目前正在debugging两个通过TCP连接交换数据的Java应用程序。 TCP客户端之一通过调用Socket#sendUrgentData(int) ,周期性地向另一个TCP服务器发送紧急数据。 在第18次尝试发送紧急数据时,TCP客户端将引发以下exception java.io.IOException:BrokenPipe at java.net.PlainSocketImpl.socketSendUrgentData(Native Method) at java.net.PlainSocketImpl.sendUrgentData(PlainSocketImpl.java:541) at java.net.Socket.sendUrgentData(Socket.java:927) TCP服务器引发此exception java.net.SocketException: Software caused connection abort: recv failed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(Unknown Source) at java.net.SocketInputStream.read(Unknown Source) 我相信这些exception是由于尝试写入/读取到一个closures的连接/套接字引起的。 我不明白为什么连接或套接字调用sendUrgentData()17次后closures。 我可以重复它,它总是发生在17次之后。 如果我在Windows上运行客户端和服务器,则会出现问题。 如果我在Solaris上运行客户端和服务器,则不会发生此问题。 如果我在Solaris上运行客户机,在Windows上运行服务器,则会出现问题。 如果我在Windows上运行客户端,在Solaris上运行服务器,则不会发生此问题。 这让我觉得它可能与Windows有关? 使用Wireshark我看到连接上的下列stream量 –> = from TCP client to TCP server <– = from TCP server to TCP client –> […]

用于UDP客户端的Windows C socket编程

我正在试图查找一些Windows套接字的例子程序。 特别是,我有兴趣编写一个C客户端(在Visual Studio中)使用UDP与服务器通信。 我没有find具体的材料。 我尝试了一些例子,但有一些链接错误。 有没有可用的图书馆。 请告诉我。 提前致谢。

从另一个线程的套接字closures调用总是使阻塞recv()线程唤醒?

我无法find很多文件来说明这是否应该发生: 某个线程打开一个TCP(或其他stream)套接字 线程1开始阻塞recv() 线程2使用SHUT_RDWR(或SHUT_RD我认为)在套接字上调用shutdown() 线程1现在被它的阻塞调用“唤醒”,并返回零,就像对方closures其套接字一样。 这种行为出现在现代Linux和FreeBSD系统上。 我没有和其他人一起testing过。 在这里的Microsoft MSDN帮助页面的评论: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms740481%28v=vs.85%29.aspx表明这种行为是“负责任”的视窗; 它也表示这是“目前不是这样”,但这可能已经过时。 这种行为在任何地方指定? 我可以依靠吗?

两个听众在同一个端口?

我惊讶地看到netstat报告两个进程在同一个端口上侦听: c:\Windows\System32>netstat -ao | find "8083" TCP 0.0.0.0:8083 ***qa-w2k8-05:0 LISTENING 5532 TCP 0.0.0.0:8083 ***qa-w2k8-05:0 LISTENING 1572 TCP [::]:8083 ***qa-w2k8-05:0 LISTENING 5532 TCP [::]:8083 ***qa-w2k8-05:0 LISTENING 1572 c:\Windows\System32>tasklist | find "5532" java.exe 5532 RDP-Tcp#0 2 1,448,776 K c:\Windows\System32>tasklist | find "1572" FrameworkService.exe 1572 Services 0 11,016 K Java进程是我的Web服务器,FrameworkService是Mcafee。 http请求甚至没有达到我的服务器,所以我假设它达到迈克菲。 不应该有一个人得到绑定错误/地址已经在使用或一些这样的错误? 我正在运行Microsoft Windows Server 2008 R2 Enterprise,6.1.7600 […]

TCP传入数据包logging器

我找不到有关在一本书中制作一个tcp / ip数据包logging器的任何信息。 有人可以指引我正确的方向或书籍参考将是有益的。

套接字服务器的高效重叠I / O

这两种不同型号中的哪一种会更有效率(考虑抖动,处理器caching的利用率,整体devise等等)? 1 IOCP并旋转X个线程(其中X是计算机具有的处理器数量)。 这将意味着我的“服务器”将只有1个IOCP(队列)的所有请求和X线程来提供/处理它们。 我已经阅读了许多文章,讨论这种devise的效率。 有了这个模型,我将有一个监听器也将被关联到IOCP。 让我们假设我可以弄清楚如何保持数据包/请求同步。 X IOCP(其中X是计算机具有的处理器数量),每个IOCP有1个线程。 这意味着每个处理器都有自己的队列和1个线程来处理/处理它们。 有了这个模型,我将有一个单独的监听器(不使用IOCP)来处理连接并将SOCKET分配给正确的IOCP(创build的X之一)。 让我们假设我可以找出负载平衡。 对两种devise(银行)使用过于简单的类比: 一行几个收银员交易。 每个人都在同一行,每个出纳员将下一个可用人员排队。 每个收银员都有自己的线路,人们被“安置”到其中一条线路上 在这两种devise之间,哪一种效率更高。 在每个模型中,重叠I / O结构将使用带有MEM_COMMIT的VirtualAlloc(与“新”相对),所以交换文件不应该成为问题(无分页)。 根据我的描述,使用带有MEM_COMMIT的VirtualAlloc,内存被保留,不会被分页。 这将允许SOCKETS将传入的数据写入我的缓冲区而不经过中间层。 所以我不认为颠簸应该是一个因素,但我可能是错的。 有人告诉我,#2会更有效率,但我没有听说过这种模式。 在此先感谢您的意见!