D语言中的UDP套接字

2024-06-16 12:27:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将python程序转换为D;该程序用于发送Art-NetDMX包。在

Python:

import sys, socket, math, time
from ctypes import *

class ArtNetDMXOut(LittleEndianStructure):
    PORT = 0x1936
    _fields_ = [("id", c_char * 8),
                ("opcode", c_ushort),
                ("protverh", c_ubyte),
                ("protver", c_ubyte),
                ("sequence", c_ubyte),
                ("physical", c_ubyte),         
                ("universe", c_ushort),
                ("lengthhi", c_ubyte),
                ("length", c_ubyte),
                ("payload", c_ubyte * 512)]
    def __init__(self):
        self.id = b"Art-Net"
        self.opcode = 0x5000
        self.protver = 14
        self.universe = 0
        self.lengthhi = 2

def main():
    hostIP = "localhost"
    S = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    packet = ArtNetDMXOut()

    packet.payload[0] = 255
    S.sendto(packet, (hostIP, ArtNetDMXOut.PORT))

if __name__ == "__main__":
    main()

D:

^{pr2}$

我的Python代码完全按照预期工作,但是在D中,s.send(packet);行出现了错误function std.socket.Socket.send (const(void)[] buf, SocketFlags flags) is not callable using argument types (ArtNetDMX)。在

我正确地处理这个问题吗?我做错什么了?在


Tags: importselfidpacketmainportsocketopcode
2条回答

对于初学者来说,您希望ArtNetDMXstruct,而不是class-因为D中的类是引用类型,并且不能保证类字段的布局;而且由于是通过网络发送的,请指定适当的对齐方式(如果每个字段都要打包在一起,则通常为1):

struct ArtNetDMX {
    align(1):
    ....
}

main中,现在可以在堆栈上分配它的一个实例:

^{pr2}$

或者,如果多次执行相同的初始化,请将其移到函数中:

ArtNetDMX createArtNetDMX()
{
    ArtNetDMX packet;

    packet.id = "ART-NET0";
    packet.opCode = 0x5000;
    packet.ver = 14;
    packet.universe = 0;
    packet.lengthHi = 2;

    return packet;
}

最后,Socket.send要求它的参数是片(数组或的一部分)。如果一次发送多个数据包,则将数据包放入一个数组中,然后只发送该数组。在

因为你只发送一个包,你可以替换

s.send(packet);

s.send((&packet)[0..1]);

这只是将对象转换为单元素切片的安全方法。在

Dlang是强类型语言。所以你必须给套接字.send方法。您应该将对象(类型ArtNetDMX)转换为阵列。您可以使用Dlang struct进行直接对话:

struct ArtNetDMX{
  // you can control alignment inside struct 
  // see http://dlang.org/attribute#align
  align (1): 
    char id[8] = "ART-NETO";
    ushort opCode = 0x5000;
    ubyte verH;
    ubyte ver = 14;
    ubyte sequence;
    ubyte physical;
    ushort universe = 0;
    ubyte lengthHi = 2;
    ubyte length;
    ubyte data[511];

}

void main() {
    auto s = new UdpSocket();
    auto addr = new InternetAddress("localhost", 6454);
    s.bind(addr);
    ubyte[ArtNetDMX.sizeof] bytes; //allocate memory on stack for ArtNetDMX struct
    ArtNetDMX *packet = cast(ArtNetDMX *)bytes.ptr;
    packet.data[0] = 255;//work with ArtNetDMX struct
    s.send(bytes);
};

有关包含此网络代码的字节代码,请参阅“序列号”(FYHTORT)

相关问题 更多 >