我正在为自己的目的开发一个非常基本的DNS服务器.我理解它的方式,DNS服务器接收包含所请求域名的UDP数据包,并以某种标准格式返回相应的IP.
有一个标准库用于从/向二进制格式读/写UDP数据包.但是,在哪里可以找到用于序列化/反序列化DNS请求/响应的C#库?
我做了一个程序,从客户端发送UDP数据包到服务器这里是发送器代码
import java.io.IOException;
import java.net.*;
/**
*
* @author hp
*/
public class JavaApplication9 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws UnknownHostException, SocketException, IOException {
// TODO code application logic here
byte[] buffer = {10,23,12,31,43,32,24};
byte [] IP={-64,-88,1,106};
InetAddress address = InetAddress.getByAddress(IP);
DatagramPacket packet = new DatagramPacket(
buffer, buffer.length, address, 57
);
DatagramSocket datagramSocket = new DatagramSocket();
datagramSocket.send(packet);
System.out.println(InetAddress.getLocalHost().getHostAddress());
}
}
Run Code Online (Sandbox Code Playgroud)
接收器代码功能是
public void run(){
try{
DatagramSocket serverSocket = new DatagramSocket(port); …Run Code Online (Sandbox Code Playgroud) 在具有有线和无线接口的Linux系统(例如192.168.1.x和192.168.2.x子网)上,我想发送通过所有可用接口发出的UDP广播(即通过有线和无线接口发送) ).
目前我发送到()到INADDR_BROADCAST,但似乎广播只通过其中一个接口发送(并不总是相同,后续广播可能使用其他接口).
有没有办法可以发送通过每个接口发出的UDP广播?
我需要向连接到我的网络的所有机器(服务器)发送广播数据报.
我正在使用NodeJS Multicast
客户
var dgram = require('dgram');
var message = new Buffer("Some bytes");
var client = dgram.createSocket("udp4");
client.send(message, 0, message.length, 41234, "localhost");
// If I'm in the same machine 'localhost' works
// I need to do something 192.168.0.255 or 255.255.255
client.close();
Run Code Online (Sandbox Code Playgroud)
服务器
var dgram = require("dgram");
var server = dgram.createSocket("udp4");
server.on("message", function (msg, rinfo) {
console.log("server got: " + msg + " from " +
rinfo.address + ":" + rinfo.port);
});
server.on("listening", function () {
var address = server.address(); …Run Code Online (Sandbox Code Playgroud) 什么是"消息bonudaries"在以下背景下?
TCP和UDP之间的一个区别是UDP保留了消息边界.
我理解TCP和UDP之间的区别,但不确定"消息边界"的定义.由于UDP包含每个数据包中的目的地和端口信息,是否可以为消息提供"边界"?
我知道你不能使用相同的端口有两个不同的进程,但是如果一个使用tcp而另一个使用udp会发生什么?你有两个不同的进程,每个进程绑定一个套接字到同一个端口但不同的协议?
我能够通过UDP套接字正确地发送我的数据,但是当我收到数据时,它一直在等待接收命令我不知道是什么导致这个.请看下面的代码.
我能够从Android设备正确接收服务器端的数据,但是当我从服务器端向Android设备发送数据时,它无法接收.但是当我从服务器向任何其他客户端(例如PC应用程序)发送数据时,它会正确接收和显示数据
class Task implements Runnable {
@Override
public void run() {
try {
String messageStr = "feed";
int server_port = 8888;
InetAddress local = InetAddress.getByName("10.0.2.2");
int msg_length = messageStr.length();
byte[] message = messageStr.getBytes();
DatagramSocket s = new DatagramSocket();
//
DatagramPacket p = new DatagramPacket(message, msg_length, local, server_port);
s.send(p);//properly able to send data. i receive data to server
for (int i = 0; i <= 20; i++) {
final int value = i;
message = new byte[30000];
p = new …Run Code Online (Sandbox Code Playgroud) 我有以下代码发送udp在子网中广播的数据包.
from socket import *
s=socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
s.sendto('this is testing',('255.255.255.255',12345))
Run Code Online (Sandbox Code Playgroud)
以下代码用于接收广播包.
from socket import *
s=socket(AF_INET, SOCK_DGRAM)
s.bind(('172.30.102.141',12345))
m=s.recvfrom(1024)
print m[0]
Run Code Online (Sandbox Code Playgroud)
问题是它没有收到任何广播包.但是,它成功接收发送到该端口的普通udp数据包.
我的机器显然收到了我测试过的广播包netcat.
$ netcat -lu -p 12345
this is testing^C
Run Code Online (Sandbox Code Playgroud)
那么问题究竟在哪里呢?
背景:
我希望能够在我的iOS应用程序和服务器之间发送和接收UDP数据包.服务器将每个传入的消息回送给应用程序的客户端.服务器已经过测试并确认正常运行.我有一个StartViewController,启动两个实现GCDAsyncUdpSocketDelegate的类,一个用于发送,一个用于接收."发送套接字"正在工作,服务器接收消息.
问题:
应用程序在发送后永远不会收到回传消息.听取套接字设置的东西可能是错误的,因为didReceiveData永远不会被调用.
我完全错了吗?
开始:
class StartViewController: UIViewController {
var inSocket : InSocket!
var outSocket : OutSocket!
override func viewDidLoad() {
super.viewDidLoad()
inSocket = InSocket()
outSocket = OutSocket()
}
@IBAction func goButton(sender: UIButton) {
outSocket.send("This is a message!")
}
}
Run Code Online (Sandbox Code Playgroud)
接收:
class InSocket: NSObject, GCDAsyncUdpSocketDelegate {
let IP = "255.255.255.255"
let PORT:UInt16 = 5556
var socket:GCDAsyncUdpSocket!
override init(){
super.init()
setupConnection()
}
func setupConnection(){
var error : NSError?
socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
socket.bindToPort(PORT, error: &error)
socket.enableBroadcast(true, …Run Code Online (Sandbox Code Playgroud) 我有一个正在研究的游戏,我听说UDP对于实时游戏来说是优越的.我知道socket.io使用TCP,并想知道是否有某种方法将其切换到UDP.我试过查找它,但只发现了2012年左右的帖子,其中说UDP只是在浏览器中实验性的.