如何防止Java应用程序绑定到另一个进程已在Windows上绑定的套接字?
我有一个问题,我有一个正在侦听端口80的Java应用程序.应用程序启动正常并且报告没有异常.我无法弄清楚为什么我无法连接端口80.其他端口工作正常.我检查了netstat上其他正在监听80的进程并找到了Skype.我不认为这是可能的,但经过一些研究,我猜测Skype正在使用SO_REUSEADDR选项进行监听.在这种状态下,接受申请是不确定的.我希望我的Java应用程序在此实例中使用绑定异常(或其他)失败.
看起来如果我可以通过Java访问该选项,我可以使用SO_EXCLUSIVEADDRUSE,但我不认为这是可能的.围绕SO_REUSEADDR有很多问题和答案,但我找不到任何问题和答案.这不仅仅是关于Skype(我可以关闭收听部分),我希望我的程序在这种情况下更加强大.
这是来自Windows 7盒子上netstat -abn的片段:
Proto Local Address Foreign Address State
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING [java.exe]
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING [Skype.exe]
Run Code Online (Sandbox Code Playgroud)
这就是为什么我假设Skype正在使用SO_REUSEADDR
这些进程似乎没有在不同的接口上侦听.
这是代码的片段.端口是80:
myServerSocket = new ServerSocket(myTcpPort);
while (true) {
new HTTPSession( myServerSocket.accept(), threadPool );
}
Run Code Online (Sandbox Code Playgroud)
作为进一步的信息,我创建了一个示例程序,以尽量减少任何副作用或错误处理的消息
import java.net.ServerSocket;
public class PortTest
{
public static void main(String[] args)
{
System.out.println( "Hit Ctrl-C to stop.\n" );
try {
ServerSocket myServerSocket = new ServerSocket(80);
System.out.println( "Before the accept() call.");
myServerSocket.accept();
System.out.println( "After the accept() call." );
}
catch (Exception ex …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Python 2.7中创建一个简单的对等网络.问题是,我似乎无法在两台机器之间创建连接,在这两台机器上它们都充当服务器和客户机.当一个是服务器而另一个是客户端时,我可以让它工作,但两者都不是.我需要创建2个插座吗?我也使用TCP连接.
更新:
import socket, sys # Import socket module
s = socket.socket() # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.bind((host, port)) # Bind to the port
if sys.argv[1] == "connect":
host = sys.argv[2]
s.connect((host, port))
s.close
else:
s.listen(5) # Now wait for client connection.
while True:
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
c.send('Thank you for …Run Code Online (Sandbox Code Playgroud) 首先,我知道在同一个主题上还有其他几个主题,但是我无法在那些可以帮助我的内容中找到任何内容,所以我会尝试对我的情况非常具体.
我已经设置了一个简单的UDP客户端/ UDP服务器对,负责在几个并行模拟之间发送数据.也就是说,模拟器的每个实例都在一个单独的线程中运行,并在UDP套接字上发送数据.在主线程中,服务器正在运行,并在模拟之间路由消息.
(对于这个问题)服务器代码的重要部分如下所示:
UDPServer::UDPServer(boost::asio::io_service &m_io_service) :
m_socket(m_io_service, udp::endpoint(udp::v4(), PORT_NUMBER)),
m_endpoint(boost::asio::ip::address::from_string("127.0.0.1"), PORT_NUMBER)
{
this->start_receive();
};
void UDPServer::start_receive() {
// Set SO_REUSABLE to true
boost::asio::socket_base::reuse_address option(true);
this->m_socket.set_option(option);
// Specify what happens when a message is received (it should call the handle_receive function)
this->m_socket.async_receive_from( boost::asio::buffer(this->recv_buffer),
this->m_endpoint,
boost::bind(&UDPServer::handle_receive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
};
Run Code Online (Sandbox Code Playgroud)
这在我的Windows工作站上工作正常.
事情是; 我希望能够在Linux集群上运行它,这就是我编译它并尝试在集群节点上运行它的原因.代码编译顺利,但当我尝试运行它时,我得到错误
bind: address already in use
Run Code Online (Sandbox Code Playgroud)
我使用1024以上的端口号,并验证它没有被其他程序使用.如上所示,我也设置了reuse_address选项,所以我真的不知道还有什么可能是错的.
在阅读这个很棒的答案时,我了解到TCP套接字可以具有一个名为的状态TIME_WAIT.由于该状态,即使close(int fd)函数返回 ,TCP套接字也可能没有释放它已绑定到的地址0.
鉴于UDP是无连接的,并且它没有像TCP那样提供数据的可靠性要求,可以安全地假设一旦close(int fd)返回0,地址是未绑定的吗?
这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。
即使经过数小时的谷歌搜索,我也无法弄清楚如何在同一主机内路由多播数据报..!
下面是问题的详细描述:
Linux 机器“A”通过电缆连接到交换机/路由器(我们称交换机/路由器为“R”)。
在 linux box A 中,我有一个进程(A0)将 UDP 数据包发送到多播地址“224.0.0.0”,端口 5000。
同样,在同一个框 A 中,我有两个进程(A1 和 A2),都连接到 224.0.0.0、端口 5000 并消耗 UDP 数据包。
现在,box A 中的内核如何管理路由?
因此,A0 发送了一个数据报,该数据报被 A1 和 A2 消费。这样的数据报是否进行往返 A --> R --> A ?
.. 或者“A”中的内核路由是否足够智能以避免这种不必要的往返?(即数据报由 A0 发送并立即被 A1 和 A2 消耗,永远不会离开 A)。
当然,可以通过为多播创建和强制执行环回设备来确保多播数据报永远不会离开 A:
sudo ifconfig lo multicast
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
Run Code Online (Sandbox Code Playgroud)
但是现在,如果我想在另一个 linux 机器中同时使用 UDP 数据报,比如说“B”,它们就无法到达那里。
因此,理想情况下,(1)在 A 中消耗的数据报永远不应该离开 A(即没有往返 A --> R --> A),而(2)在 B 中消耗的数据报应该正常地作为 A --> …
为什么当我从两个不同的终端执行以下命令(在我的 Debian 8.4 机器上)时,它不会输出“地址已使用”类型的错误?
netcat -p 1234 -l
Run Code Online (Sandbox Code Playgroud)
我想知道为什么它不会抛出错误,因为它启动了两个进程侦听同一个端口。
netcat 不使用套接字吗?这怎么可能?
考虑这段代码:
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#define SERVADDR "::1"
#define PORT 12345
int main() {
int sd = -1;
if ((sd = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
fprintf(stderr, "socket() failed: %d", errno);
exit(1);
}
int flag = 1;
if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) == -1) {
fprintf(stderr, "Setsockopt %d, SO_REUSEADDR failed with errno %d\n", sd, errno);
exit(2);
}
if(setsockopt(sd, SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(flag)) == -1) {
fprintf(stderr, "Setsockopt …Run Code Online (Sandbox Code Playgroud) 我发现多个答案建议在多个 UDP 客户端需要侦听同一端口上的广播时使用 SO_REUSEPORT 套接字选项。但是,我收到一个错误,提示此选项不可用。使用 python 2.7
from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
try:
s.bind(('', MYPORT))
except:
print "Error connecting to the UDP stream."
Traceback (most recent call last):
File "qsorder.py", line 119, in <module>
s.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
NameError: name 'SO_REUSEPORT' is not defined
Run Code Online (Sandbox Code Playgroud)
我试过 SO_REUSEADDR 并且它没有给出错误但只有一个客户端接收广播。知道如何解决这个问题吗?
我有一个小型Web应用程序,它打开TCP套接字连接,发出命令,读取响应,然后关闭对特定REST端点的每个请求的连接.
我已经开始使用Apache JMeter对端点进行负载测试,并注意到在运行一段时间后,我开始看到"无法分配请求的地址"之类的错误,打开此连接的代码是:
def lookup(word: String): Option[String] = {
try {
val socket = new Socket(InetAddress.getByName("localhost"), 2222)
val out = new PrintStream(socket.getOutputStream)
val reader = new BufferedReader(new InputStreamReader(socket.getInputStream, "utf8"))
out.println("lookup " + word)
out.flush()
var curr = reader.readLine()
var response = ""
while (!curr.contains("SUCC") && !curr.contains("FAIL")) {
response += curr + "\n"
curr = reader.readLine()
}
socket.close()
curr match {
case code if code.contains(SUCCESS_CODE) => {
Some(response)
}
case _ => None
}
}
catch {
case e: Exception => …Run Code Online (Sandbox Code Playgroud) 这是服务器端代码:
import socket
import sys
HOST = '' # Symbolic name, meaning all available interfaces
PORT = 7800 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ('Socket created')
#Bind socket to local host and port
try:
s.bind((HOST, PORT))
except socket.error as msg:
print ('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
sys.exit()
print 'Socket bind complete'
#Start listening on socket
s.listen(10)
print ('Socket now listening')
#now keep talking with the client
while 1: …Run Code Online (Sandbox Code Playgroud) sockets ×9
tcp ×4
c ×2
linux ×2
python ×2
bind ×1
binding ×1
boost ×1
c++ ×1
java ×1
loopback ×1
macos ×1
multicast ×1
netcat ×1
networking ×1
p2p ×1
peer ×1
port ×1
python-2.7 ×1
python-3.x ×1
raw-sockets ×1
router ×1
scala ×1
scalability ×1
udp ×1