Tag: tcp

C#中的高性能TCP服务器

我是一个经验丰富的C#开发人员,但到目前为止我还没有开发TCP服务器应用程序。 现在我必须开发一个高度可扩展和高性能的服务器,可以处理至less5-10个并发连接:从GPS设备通过GPRS获取字节数据。 一个共同的沟通过程应该是这样的: GPS设备启动到我的服务器的连接 我的服务器应答,如果我想获得数据 设备发送GPS数据 我的服务器向设备发送报告(比如校验和) 从GPS获取新的数据,报告和这一再发生 稍后GPS DEVICEclosures连接 所以,在我的服务器,我需要 跟踪连接/活动客户端 从服务器端closures任何客户端 捕捉事件,当一个设备closures连接 获取字节数据 发送数据给客户 我开始通过互联网阅读这个话题,但对我来说似乎是一场噩梦。 有很多方法,但我找不出哪一个是最好的。 asynchronous套接字方法似乎对我来说是最好的,但编写这种asynchronous样式的代码是可怕的,不容易debugging。 所以我的问题是:你认为在C#中实现高性能TCP服务器的最好方法是哪一个? 你知道有这么好的开源组件吗? (我尝试了几个,但我找不到一个好的。)

何时适合使用UDP而不是TCP?

由于TCP保证数据包传输,因此可以被认为是“可靠的”,而UDP不保证任何东西,数据包可能会丢失。 在应用程序中使用UDP而不是通过TCPstream传输数据的优点是什么? 在什么样的情况下UDP会是更好的select,为什么? 我假设UDP更快,因为它没有创build和维护stream的开销,但是如果一些数据永远不会到达目的地,那么这不是无关紧要的吗?

TCP和UDP的区别?

TCP和UDP有什么区别? 我知道在非时间关键型应用程序中使用TCP,UDP用于需要快速传输数据的游戏或应用程序。 我知道TCP用于HTTP,HTTP,FTP,SMTP和Telnet。 我知道UDP用于DNS和DHCP。 但为什么? TCP和UDP的哪些特性使其对于各自的用例有用?

使用QTcpSocket的TCP数据包

我知道TCP保证所有数据包都会到达。 但是,数据包可以分成两个或更多? 我正在使用类QTcpSocket的Qt,我想知道是只有当完整的数据包到达ReadyRead信号发射。 换句话说,在第一个字节中发送数据包的大小是否有意义,然后再循环直到所有字节到达? 或者我可以调用socket-> readAll(),我必须得到一个完整的数据包?

设置TIME_WAIT TCP

我们正试图调整一个应用程序接受通过TCP消息,并使用TCP的一些内部消息。 在进行负载testing时,我们注意到响应时间显着下降(然后完全停止),因为同时向系统发出更多的请求。 在此期间,我们看到很多TCP连接处于TIME_WAIT状态,有人build议将TIME_WAIT环境variables从默认的60秒降低到30秒。 据我所知 , TIME_WAIT设置本质上是设置连接closures后TCP资源再次可用的时间。 我不是一个“networking人”,对这些事情知之甚less。 我需要很多链接文章中的内容,但是有一点“虚弱”了。 我想我明白为什么TIME_WAIT值不能设置为0,但可以安全地设置为5? 什么10? 什么决定了这个值的“安全”设置? 为什么这个值的默认值是60? 我猜测,比我聪明的人有很好的理由select这个合理的默认值。 还有什么我应该知道压倒价值的潜在风险和好处?

如何使用java套接字实现客户端和服务器之间的传输文件

我已经实现了简单的TCP服务器和TCP客户端类,可以将消息从客户端发送到服务器,消息将在服务器端转换为大写,但是如何实现从服务器到客户端的传输文件并从客户端上传文件到服务器。 以下代码是我得到的。 TCPClient.java import java.io.*; import java.net.*; import java.util.Scanner; class TCPClient { public static void main(String args[]) throws Exception { int filesize=6022386; int bytesRead; int current = 0; String ipAdd=""; int portNum=0; boolean goes=false; if(goes==false){ System.out.println("please input the ip address of the file server"); Scanner scan=new Scanner(System.in); ipAdd=scan.nextLine(); System.out.println("please input the port number of the […]

Java检测丢失的连接

当我使用例如腻子和我的连接丢失(或当我在Windows上手动ipconfig /release ),它直接响应,并通知我的连接丢失。 我想创build一个Java程序来监视我的Internet连接(对于一些可靠的服务器),logging我的Internet失败时的date/时间。 我尝试使用Socket.isConnected()方法,但只是永远返回“真”。 我怎样才能在Java中做到这一点?

Python:绑定套接字:“地址已经在使用”

我有一个关于TCP / IPnetworking上的客户端套接字的问题。 假设我使用 try: comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) except socket.error, msg: sys.stderr.write("[ERROR] %s\n" % msg[1]) sys.exit(1) try: comSocket.bind(('', 5555)) comSocket.connect() except socket.error, msg: sys.stderr.write("[ERROR] %s\n" % msg[1]) sys.exit(2) 创build的套接字将绑定到端口5555.问题是,在结束连接后 comSocket.shutdown(1) comSocket.close() 使用wireshark,我看到双方的FIN,ACK和ACKclosures的套接字,我不能再次使用该端口。 我得到以下错误: [ERROR] Address already in use 我想知道怎样才能立即清除端口,以便下次我仍然可以使用同一个端口。 comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) setsockopt似乎不能解决问题谢谢!

socket API的accept()函数是如何工作的?

套接字API是TCP / IP和UDP / IP通信的实际标准(也就是我们所知道的networking代码)。 然而,其核心function之一accept()有点神奇。 借用一个半正式的定义: accept()在服务器端使用。 它接受从远程客户端接收到的尝试创build新的TCP连接,并创build一个与此连接的套接字地址对关联的新套接字。 换句话说, accept返回一个新的套接字,服务器可以通过它与新连接的客户端进行通信。 旧套接字(在其上调用accept )保持打开,在同一端口上,侦听新的连接。 accept工作如何? 它是如何实现的? 这个话题有很多困惑。 许多人声称接受打开一个新的港口,你通过它与客户沟通。 但这显然是不正确的,因为没有新的港口开放。 你实际上可以通过同一个端口与不同的客户进行通信,但是怎么样? 当几个线程在同一个端口上调用recv时,数据如何知道去哪里? 我想这是沿着与套接字描述符相关联的客户端地址的行,并且每当数据通过recv来传递它的路由到正确的套接字,但我不知道。 对这个机制的内部工作进行彻底的解释会很棒。

为什么在不尝试I / O的情况下,不可能检测到TCP套接字已被对方正常closures?

作为最近一个问题的后续,我想知道为什么在Java中不可能读取/写入TCP套接字来检测套接字是否被对方正常closures? 无论是使用pre-NIO Socket还是使用NIO SocketChannel似乎都是如此。 当对端正常closuresTCP连接时,连接两端的TCP协议栈都知道这个事实。 服务器端(启动closures的那个)以FIN_WAIT2状态结束,而客户端(没有明确响应closures的那一端)以状态CLOSE_WAIT结束。 为什么在Socket或SocketChannel没有可以查询TCP堆栈的方法来查看底层的TCP连接是否已经终止? TCP堆栈是不是提供这样的状态信息? 还是这是一个devise决定,以避免昂贵的内核调用? 在已经发布了这个问题的一些答案的用户的帮助下,我想我会看到问题可能来自哪里。 未明确closures连接的一端以TCP状态CLOSE_WAIT结束,意味着连接处于closures状态,并等待该端发出自己的CLOSE操作。 我想这是公平的isConnected返回true和isClosed返回false ,但为什么不是有像isClosing ? 以下是使用pre-NIO套接字的testing类。 但是使用NIO获得相同的结果。 import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void main(String[] args) throws Exception { final ServerSocket ss = new ServerSocket(12345); final Socket cs = ss.accept(); System.out.println("Accepted connection"); Thread.sleep(5000); cs.close(); System.out.println("Closed connection"); ss.close(); Thread.sleep(100000); } } import java.net.Socket; […]