天道酬勤,学无止境

sockets

可能的网络连接数(Number of network connections possible)

问题 由于端口号限制为65536,所以连接数有限制吗? 每个连接之间有何不同? 如果是通过端口,那么同时连接数不可能超过 65536 个? 回答1 有许多不同的部分在玩。 由于连接是由(Src IP, Src Port, Dest IP, Dest Port)元组定义的,因此在任何给定时间,您可以在两个给定对等方之间建立 65536 ^ 2 个连接:从 1 到 1,从 1 到 2,..从 1 到 65535 等等。这只是在两个对等点之间——当然,您可以同时向许多对等点打开许多连接。 但是,大多数操作系统限制每个进程打开的文件描述符/句柄的数量。 此限制在历史上较低 (20),但现在通常更高(在我的系统上为 1024, ulimit -a将在bash(1)显示每个进程的限制)。 除了 Unix 系统上的setrlimit(3)限制之外,还有系统范围的限制; Linux 系统上的/proc/sys/fs/file-max将报告整个系统上允许的最大打开文件数。 (这是我系统上的 596118。)其他系统会有不同的限制。 而且,中间有状态防火墙强制执行的打开连接数可能会受到限制。 由于每个状态都需要防火墙表中的内存,任何状态都可能会强制执行一些任意限制以避免内存不足。 回答2 TCP 连接实际上是由对等 IP 地址 + 对等端口 + 本地 IP 地址 + 本地端口来标识的

2021-12-05 08:29:48    分类:技术分享    sockets   connection   port

通过套接字接收信息时应用程序停止(Application stops when receiving info through socket)

问题 我正在为学校开发我的 C# 客户端服务器应用程序,但我遇到了一个小问题。 当我在我的应用程序中使用管理员登录时,一切正常,信息通过套接字传递,但是当我需要通过套接字获取 ClientsList 时,在管理员表单上说没有响应,没有其他任何事情发生。 谁能告诉我为什么在登录时有效,之后就不再有效了? 谢谢 这是我的项目的一些部分: 登录部分,它工作正常: private void btnLogin_Click(object sender, EventArgs e) { String user = txtUser.Text; String pass = txtPass.Text; ClientConnectionHandler handler = ClientConnectionHandler.getInstance(); handler.sendMessage("#login#" + user + " " + pass + "#"); User u = (User) handler.receive(); if (u == null) { MessageBox.Show("Username/Password is wrong"); } else { if (u.getRang().Equals("admin")) { (new AdminWin(u)).Show(); this

2021-12-05 08:15:55    分类:技术分享    c#   sockets   client-server

GROOVY:如何使用 serverSocket 只编写 GET 请求?(GROOVY: how to write only GET request using serverSocket?)

问题 我想创建一个套接字,它只会对GET请求回复200 OK ,对其他方法回复500 。 输入返回我行,第一个有方法的名称。 我无法理解如何将GET与这样的输出相匹配。 static void main(String[] args) { def ss = new ServerSocket(1234) new File("OuTsocket.txt") while (true) { ss.accept { sock -> sock.withStreams { input, output -> output.withWriter { writer -> writer << "HTTP/1.1 200 OK\n" writer << "Content-Type: application/json\n\n" writer << '{"Name": "Anna"}\n' } } } } } } 回答1 您可以使用java中包含的内部sun http服务器来解析http请求并构建响应 import com.sun.net.httpserver.* import java.util.concurrent.Executors import groovy.json.* public class Web2{ private static int HTTP_SERVER_PORT=8000

2021-12-05 07:20:14    分类:技术分享    sockets   groovy   serversocket   http-method

重用异步套接字:后续连接尝试失败(Reuse asynchronous socket: subsequent connect attempts fail)

问题 我正在尝试在异步 HTTP 客户端中重用套接字,但我无法第二次连接到主机。 我基本上将我的异步 HTTP 客户端视为具有以下状态的状态机: 可用:插座可用 Connecting:套接字正在连接到端点发送:套接字正在向端点发送数据 Receiving:套接字正在从端点接收数据失败:套接字失败 Clean Up:清理socket状态 在连接状态下,我调用BeginConnect : private void BeginConnect() { lock (_sync) // re-entrant lock { IPAddress[] addersses = Dns.GetHostEntry(_asyncTask.Host).AddressList; // Connect to any available address IAsyncResult result = _reusableSocket.BeginConnect(addersses, _asyncTask.Port, new AsyncCallback(ConnectCallback), null); } } 成功建立连接后,回调方法将状态更改为“ Sending : private void ConnectCallback(IAsyncResult result) { lock (_sync) // re-entrant

2021-12-05 05:43:42    分类:技术分享    c#   http   sockets   asynchronous   httpclient

Java 中的 getHostAddress() 和 getInetAddress()(getHostAddress() and getInetAddress() in Java)

问题 我正在创建 TCP 套接字应用程序。 在服务器端, ss = new ServerSocket(10000); Socket socket = ss.accept(); String remoteIp = socket.getInetAddress().getHostAddress(); String RemotePort = ":"+socket.getLocalPort(); 我对最后两行有点困惑, getInetAddress() 用于返回套接字连接的地址,即主机地址? 那么为什么我们需要一个 getHostAddress()? 回答1 socket.getInetAddress()返回一个包含远程机器 IP 地址的InetAddress对象。 InetAddress.getHostAddress()返回带有该地址文本表示的String对象。 所以,为了得到一个你可以打印的String ,你就是这样做的。 编辑:如果您不熟悉,这称为“方法链”。 这和说的是一样的: InetAddress addy = socket.getInetAddress(); String remoteIp = addy.getHostAddress(); 回答2 除了 Brian Roachs 的回答: 您还可以查看 Java API 以查找类、方法和字段的描述: Socket

2021-12-05 05:38:05    分类:技术分享    java   sockets

sendto : 资源暂时不可用 (errno 11)(sendto : Resource temporarily unavailable (errno 11))

问题 我在使用 sendto 时遇到问题。 我有一个接收者使用 recvfrom 接收 UPD 数据包,然后使用 sendto 回复发送者。 不幸的是,我收到 errno 11(资源暂时不可用)。 我正在使用两个插座。 第一个数据包实际上被发送,但不是之后的: 发送到 :: 成功 错误:0。 sendto :: 资源暂时不可用 错误:11。 sendto :: 资源暂时不可用 ... 这是我的代码的摘录: int sockfd, sockSend; if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) perror("socket"); if ((sockSend = socket(AF_INET, SOCK_DGRAM, 0)) < 0) perror("socket"); if (fcntl(sockfd, F_SETOWN, getpid()) < 0) { perror("fcntl"); } if (fcntl(sockfd, F_SETFL, O_RDONLY | O_NONBLOCK | FASYNC) < 0) { perror("fcntl"); } if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) perror(

2021-12-05 05:18:02    分类:技术分享    c   sockets   udp   sendto

Java -- 如何从 inputStream (socket/socketServer) 中读取未知数量的字节?(Java -- How to read an unknown number of bytes from an inputStream (socket/socketServer)?)

问题 希望使用 inputStream 通过套接字读取一些字节。 服务器发送的字节数可能是可变的,客户端事先并不知道字节数组的长度。 如何做到这一点? byte b[]; sock.getInputStream().read(b); 这会导致来自 Net BzEAnSZ 的“可能无法初始化错误”。 帮助。 回答1 你需要扩大缓冲区根据需要,通过一次以字节为单位,1024块阅读在本示例代码我写了前一段时间 byte[] resultBuff = new byte[0]; byte[] buff = new byte[1024]; int k = -1; while((k = sock.getInputStream().read(buff, 0, buff.length)) > -1) { byte[] tbuff = new byte[resultBuff.length + k]; // temp buffer size = bytes already read + bytes last read System.arraycopy(resultBuff, 0, tbuff, 0, resultBuff.length); // copy previous bytes System.arraycopy(buff, 0, tbuff, resultBuff.length, k); //

2021-12-05 04:31:45    分类:技术分享    java   sockets   byte   inputstream

使用套接字发送和接收数据(Using Sockets to send and receive data)

问题 我正在使用套接字连接我的 Android 应用程序(客户端)和 Java 后端服务器。 每次与服务器通信时,我想从客户端发送两个数据变量。 1)某种消息(由用户通过接口定义) 2)消息的语言(由用户通过界面定义) 我如何发送这些以便服务器将每个解释为一个单独的实体? 在读取了服务器端的数据并做出了适当的结论后,我想向客户端返回一条消息。 (我想我会接受这个) 所以我的两个问题是如何确定正在发送的两个字符串(客户端到服务器)在客户端是唯一的,以及如何在服务器端分离这两个字符串。 (我正在考虑一个字符串数组,但无法确定这是否可能或合适。) 我打算发布一些代码,但我不确定这会有什么帮助。 回答1 我假设您使用 TCP 套接字进行客户端-服务器交互? 将不同类型的数据发送到服务器并使其能够区分两者的一种方法是将第一个字节(如果您有超过 256 种类型的消息,则更多)作为某种标识符。 如果第一个字节为 1,则为消息 A,如果为 2,则为消息 B。通过套接字发送此消息的一种简单方法是使用DataOutputStream/DataInputStream : 客户: Socket socket = ...; // Create and connect the socket DataOutputStream dOut = new DataOutputStream(socket

2021-12-05 04:19:12    分类:技术分享    java   android   sockets

如何获取重定向UDP消息的原始目标端口?(How to get original destination port of redirected UDP message?)

问题 使用这个东西我可以获得socket(PF_INET, SOCK_DGRAM, 0)套接字的原始目标IP地址。 如何获取原始目的端口? 回答1 取决于重定向机制。 如果您正在使用 REDIRECT(它是 NAT 底层),那么您需要使用 SO_ORIGINAL_DST 或 libnetfilter_conntrack 在应用 NAT 之前查询连接的原始目的地。 但是,由于您可以使用同一个侦听器套接字为多个连接提供服务,因此必须为每个数据包执行此查找。 您可以使用 conntrack 命令行工具试验 libnetfilter_conntrack 及其提供的服务。 另一种方法是使用 TPROXY 进行重定向,这意味着在这种情况下使用。 在那里您可以使用 recvmsg() 使用辅助消息获取数据包的原始目的地。 要查找的关键是 IP_RECVORIGDST setsockopt。 可以在内核文档目录中名为 tproxy.txt 的文件中找到有关 TPROXY 的更多信息。 它使用起来有点困难,但由于它是由堆栈而不是包过滤子系统实现的,因此工作起来更可靠。 编辑:添加如何使用 TProxy 查询 UDP 目标地址。 打开一个 UDP 套接字,将其绑定到 0.0.0.0 或更具体的 IP 您可以通过 setsockopt(fd, SOL_IP, IP_RECVORIGDSTADDR,

2021-12-05 03:09:34    分类:技术分享    linux   sockets   udp   redirect   iptables

Java:检测客户端与服务器端断开连接 [重复](Java: Detecting client disconnects from server side [duplicate])

问题 这个问题在这里已经有了答案: Java 套接字 API:如何判断连接是否已关闭? (9 个回答) 6 个月前关闭。 我正在使用 Socket 和 ServerSocket 编写 Java 客户端/服务器程序。 多个客户端同时连接到服务器。 检查客户端连接是否与服务器端断开连接的最佳方法是什么? 现在,在尝试写入断开连接的客户端时,我只是收到了 SocketException。 回答1 检测断开连接的最好方法是让另一端发送心跳,并在没有数据时让读取器超时。

2021-12-05 03:02:28    分类:技术分享    java   sockets   client   client-server