- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我要直截了本地说,这是与作业相关的,但作业是关于使用 UDP 实现 TCP 样式的数据可靠性保证,而不是 UDP 套接字愚蠢的行为,这就是我的问题所在。
所以我现在已经在 Java 程序上辛苦工作了几个小时,并且我开始认为我不会找到答案。我正在 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*/}
}
}
最佳答案
您的代码错误。
您应该使用相同的 DatagramSocket 进行发送和接收。尝试使用源地址构造新代码的代码是完全错误的,甚至不适用于非本地源。它还会泄漏套接字。
您必须创建一个 DatagramPacket 以使用目标地址和端口进行发送。在响应的情况下,简单的方法是使用请求数据报并仅更改其数据,保持地址:端口不变。
您绝不能忽略异常。不要自欺欺人地认为它们不会发生,或者即使发生也可以被忽略。它们将会发生,而且不能被忽视。在这种情况下,如果您没有太忙而忽略了它,那么您在发送时会遇到一个异常,该异常会告诉您有关 (2) 的信息。
关于java - 环回地址未接收数据报包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15865020/
尝试从环的底部到顶部裁剪一个环 (50%),但结果并不像我预期的那样有效。 我的解决方案是 using bg_point_type = boost::geometry::model::d2::poin
上下文 我查看了 Google 上“Clojure、Ring、SSL”的前三个结果,对于使用 Clojure + Ring 设置 SSL 的“正确方法”似乎没有达成共识。 问题: 理想的答案是以下形式
这个问题在这里已经有了答案: 8年前关闭。 Possible Duplicate: Create random number within an annulus 我想在 annulus 内获得一个统一
对于我的应用程序,我需要组织一个循环(环形)队列。这意味着任何已处理的消息都会立即进入队列末尾继续处理。 例如: 队列:A、B、C。 接收方处理 A。 队列:B、C、A。 2 和 3 应以原子方式执行
我有一些源,其坐标(xn,yn,zn)相对于环的中心C和沿着我的视线的单位 vector (ns_ux,ns_uy,ns_uz)。我想计算这些源是否分别穿过内半径和外半径分别为 9.5 和 10.5
我想为 iOS 制作一个应用程序,我在 cocos2d 方面有一定的专业知识。我搜索了很多,但我发现的只是使用 webkit 实现此动画的 CSS,除了 C、Objective C、VHDL 之外,我
我有一个关于冷聚变和循环的问题。我有这个程序,我要求用户输入用户信息。用户可以为每种食物输入一些东西。 #GET_ITEM.ITEM_NBR#
安装后我遇到了 python key 环问题。这是我的步骤: $ python >>> import keyring >>> keyring.set_password('something','oth
我正在尝试从书中学习 MFC:MV C++ Windows Application by Example(2008)。有示例应用程序。我可以在其中绘制填充女巫所选颜色的戒指: void CRingVi
我正在寻求一些关于在 CSS 中创建“环形”形状的建议。以下是我需要实现的一些重要的详细目标: 环形边框粗细必须是百分比数字,而不是 rm 或绝对像素数,这样环形才能根据容器大小完全响应; 环形边框需
我真的很难掌握 Jade。我想做一些非常非常简单的事情:打印“一些文本”3次。我有一个 mixin 函数: mixin outputText() - for (var i = 0; i <= 3; i
如果用户已登录(即 session 的 user-id 键具有非零值),则路由到一个页面的最佳方法是什么;如果用户未登录,则路由到另一个页面的最佳方法是什么?理想的情况是有 2 组不同的路线。 谢谢!
我最近完成了一个程序,该程序将公钥下载到内存中,然后使用所有公钥创建一条加密消息。但是,我在创建仅包含我下载的 key 的列表时遇到了一些困难。首次下载时,它们存储在 gpgme_data_t 中。我
我需要在通过谷歌云运行的mysql中安装 key 环插件,但我不能,因为用户没有SUPER权限。有人遇到过同样的情况吗? mysql 安装插件 keyring_file SONAME 'keyrin
这是一个新手安全/控制台问题......我在我的项目中在欧洲的一个特定(错误)位置创建了一个 key 环。 我在控制台中看不到任何编辑甚至删除 key 环的方法。 key 圈完全是空的……里面没有 k
当我尝试从命令行(例如 svn)执行许多不同的操作时,我收到 gnome-keyring 警告。示例: $ lp README.txt WARNING: gnome-keyring:: couldn'
我的目标是使用 compojure 创建一个 Web 应用程序并附加 datomic 作为数据库。单独来看,这两个组件工作得很好。但是,当我尝试启动服务器时leinring server-headle
设置: 使用 GnuPG 的 Linux 或使用 GPG4Win(OpenPGP) 的 Windows 2048 RSA key 对已由可以访问 key 环的特权用户创建 已创建第二个较低权限的用户,
要创建加密表,可以使用以下查询: CREATE TABLE `t1` ( `intcol1` int(32) DEFAULT NULL, `intcol2` int(32) DEFAULT N
我对 Spring 框架很陌生。 我尝试迭代列表中的 10 个项目。我使用 thymeleaf 模板。 这是我的代码; 此代码无法正常工作,我找不到运行该代码的方法。 感谢您的关
我是一名优秀的程序员,十分优秀!