gpt4 book ai didi

java - 环回地址未接收数据报包

转载 作者:行者123 更新时间:2023-11-30 04:26:00 25 4
gpt4 key购买 nike

我要直截了本地说,这是与作业相关的,但作业是关于使用 UDP 实现 TCP 样式的数据可靠性保证,而不是 UDP 套接字愚蠢的行为,这就是我的问题所在。

所以我现在已经在 J​​ava 程序上辛苦工作了几个小时,并且我开始认为我不会找到答案。我正在 eclipse 中使用两个类,其中一个类发送 UDP 数据报包,我已使用 socketsniff 对其进行了验证,将其绑定(bind)并发送到环回地址,并具有正确格式的有效负载。

第二个是类,这是我遇到问题的地方。在接收类中,我尝试接收数据,但它永远不会到达那里。使用packetsniff,我发现该套接字上甚至没有接收调用。运行代码时,它在socket.receive()调用之前到达println语句,但它只是不运行它。奇怪的是,它会超时! 为什么收不到?

这是我的接收类代码。

package us.wsu.compnet.reliabletransfer;

import java.io.*;
import java.net.*;

/**
* This class implements a receiver of the Stop-And-Wait reliable transfer protocol
*/
public class MyServerSocket implements Runnable {

private PipedOutputStream internalOutputStream; // Stream to which we write data for the upper layer
private PipedInputStream upperLayerStream; // Stream given to upper layer, connected to internalOutputStream

private DatagramSocket sock;
private DatagramPacket pack;
private byte[] buf;
private int seqNum;

/**
* Creates a receiver socket on a given port.
*/
public MyServerSocket(int port) throws SocketException {
// Open the UDP socket.
sock = new DatagramSocket(port);
System.out.println("" + sock.getInetAddress() + " " + sock.getPort() + "\n");
buf = new byte[1000];
pack = new DatagramPacket(buf,buf.length);
seqNum = 0;

// Create stream to the upper layer.
internalOutputStream = new PipedOutputStream();
try {upperLayerStream = new PipedInputStream(internalOutputStream);}
catch (IOException e) {/* This should not happen. */}

// Start thread that will receive the data packets and reply with acks.
(new Thread(this)).start();
}

/**
* Returns the InputStream associated with the socket.
*/
public InputStream getInputStream() {
return upperLayerStream;
}

/**
* Implementation of the receiver protocol.
*/
public void run() {
try{
// Receive datagram.
int x = 0;
sock.setSoTimeout(10000);
while (x < 10000)
{
try{
System.out.println("Waiting to recieve packet");
sock.receive(pack);
System.out.println("Packet Recieved");
}
catch(Exception e){
System.out.println("Swingandamiss!");
}
x++;
}
// Extract sequence number and data payload.
MyDataPacket p;
pack.setData(buf,0,pack.getLength()-1);
p = new MyDataPacket(buf,buf.length-1);

// If packet is received for the first time, deliver to upper layer.
if ( p.getSeqNum() == seqNum)
{
internalOutputStream.write(p.getData(), 0, p.getData().length);
seqNum = (byte) (1-seqNum);
}

// Send ack.
MyAckPacket ack;
ack = new MyAckPacket(seqNum);
DatagramPacket pout;
pout = new DatagramPacket(ack.toByteArray(),ack.toByteArray().length);
DatagramSocket outSock;
outSock = new DatagramSocket(pack.getPort(),pack.getAddress());
outSock.send(pout);
}
catch (IOException e){/*Do Nothing*/}
}

}

最佳答案

您的代码错误。

  1. 您应该使用相同的 DatagramSocket 进行发送和接收。尝试使用源地址构造新代码的代码是完全错误的,甚至不适用于非本地源。它还会泄漏套接字。

  2. 您必须创建一个 DatagramPacket 以使用目标地址和端口进行发送。在响应的情况下,简单的方法是使用请求数据报并仅更改其数据,保持地址:端口不变。

  3. 您绝不能忽略异常。不要自欺欺人地认为它们不会发生,或者即使发生也可以被忽略。它们将会发生,而且不能被忽视。在这种情况下,如果您没有太忙而忽略了它,那么您在发送时会遇到一个异常,该异常会告诉您有关 (2) 的信息。

关于java - 环回地址未接收数据报包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15865020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com