2015-11-28 2 views
1

Я хотел бы создать простой UDP-сервер, который может получать сообщения различной длины. Однако кажется, что D's Socket.receiveFrom() ожидает массив буфера статической длины. Когда следующий код работает:Как использовать динамический массив для получения UDP в D?

void main() { 
    UdpSocket  server_s; 
    Address   client_addr; 
    ubyte[]   in_buf; 
    ptrdiff_t  bytesin; 

    server_s = new UdpSocket(); 
    server_s.bind(new InternetAddress(InternetAddress.ADDR_ANY, PORT_NUM)); 

    bytesin = server_s.receiveFrom(in_buf, client_addr); 
    if (bytesin == 0 || bytesin == Socket.ERROR) { 
     writeln("Error receiving, bytesin: ", bytesin); 
     return; 
    } 

    // Do stuff 
} 

receiveFrom() сразу проваливается с bytesin == 0. Почему это? Могу ли я использовать динамические массивы для приема UDP?

ответ

1

receive и receiveFrom не занимаются распределением. Вы можете передать массив некоторого фиксированного размера, достаточно большого для того, чтобы удержать любой ожидаемый пакет, а затем разрезать его на основе того, сколько байтов вы получили.

Если вы предустановили 64 КБ, это должно соответствовать всем, что вы могли бы получить. Тем не менее, я использую только 4 КБ буфера.

ubyte[4096] in_buf; 
bytesin = server_s.receiveFrom(in_buf, client_addr); 
// check for error first then 
auto message_received = in_buf[0 .. bytesin]; 
// process it 
// keep looping, reusing the buffer, to get more stuff 
+0

Спасибо, что делает. Должно было знать, что это именно то, для чего нужен битин. Это должно быть более хорошо документированное поведение в документации std.socket. Может быть, они должны создать версию, которая также распределяет динамически. – Nerve

+0

В основе функций ОС требуется буфер, но они работают точно так же, как и эти. Делать это по-другому было бы возможно, но сложно, но при этом мало пользы ... Мне все же хотелось бы, чтобы документы стали лучше использовать его с большим количеством примеров. –

+0

В принципе на любом языке вам необходимо выделить буферы перед получением. Также вы можете просто создать свою собственную функцию, которая сделает это. Я не вижу причины, чтобы он был частью библиотеки std. – Bauss