나는 우분투 상자의 파이썬에서 vxworks 컴퓨터의 C 프로그램으로 UDP 메시지를 보냈습니다. vxworks 컴퓨터의 엔디안이 네트워크 바이트 순서와 일치하지 않으므로 ntohs, ntohl 등을 사용하여 바이트 순서를 바꿔야합니다.네트워크 바이트 순서 sin_family에 대해서
UDP 연결에서 읽은 다음 "패밀리 "그래서 내가 IPV4 나 IPV6을 해독해야하는지 안다. 이런 식으로하고 싶습니다 ...하지만 작동하지 않습니다.
struct sockaddr data = {};
char udp_ip[INET6_ADDRSTRLEN] = {0};
// ... (recvfrom ...)
if (AF_INET == data.sa_family)
{
struct sockaddr_in*s = (struct sockaddr_in *)&data;
const char *addr = inet_ntop(AF_INET, &s->sin_addr, udp_ip, sizeof(udp_ip));
udp_port = ntohs(s->sin_port);
...
}
if (AF_INET6 == data.sa_family)
{
struct sockaddr_in6 *s = (struct sockaddr_in *)&data;
const char *addr = inet_ntop(AF_INET6, &s->sin6_addr, udp_ip, sizeof(udp_ip));
udp_port = ntohs(s->sin6_port);
...
}
포트를 보는 데 익숙하지 만 비슷한 필드가 스왑되었지만 패밀리가 멀티 바이트 필드라는 것을 알았습니다. 내 sa_family 값이 범위를 벗어나기 때문에 코드가 작동하지 않는 것을 발견했습니다. 이 컴퓨터의 헤더에서 가장 큰 AF_ * 값은 40입니다. 500을 초과하는 값이 표시됩니다. sa_family의 바이트가 스왑 된 것처럼 보이고 바이트 순서도 바꿔야합니다. 예 :
const sa_family_t family = ntohs(data.sa_family);
그런 다음 if 변수에 해당 변수를 사용합니다. 질문이 : 이것은 합리적인가요? 나는 전에 가족에게 한 일을 본 적이 없다. 멀티 바이트 (sizeof (data.sa_family) == 2)입니다.
나는
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_sock.bind(('', 0))
data = self.create_data()
udp_sock.sendto(data, (ip, port))
전송 된 데이터는 심지어 데이터와 문제를 분석하기 위해 도착하기 전에 내가 붙어있어 같은 종류의 관계가 .. 내 파이썬 코드는 관련이 있지만, 완성도 생각하지 않는다 데이터가 "FOO"와 같이 간단하다면 그 자체를 제시합니다.
다른 기사 내가 확인한 : what kind of fields in network packets should be converted to network byte order과 Network byte order and endianness issues.
나는 또한 이것을 읽었는데, 이는 내가 보는 것을 모순하는 것처럼 보입니다. struct sockaddr_in member byte order for bind()
반대로, (메시지가 표시되지 않은 경우) 내 vxworks (네트워크가 아닌 바이트 순서 기계)에서 메시지를 보낼 때 다른 기계로 되돌려 보낼 때 (메시지가 표시 될 때까지) 나는 htons (AF_INET)를 사용해야합니다. 작동하지 않습니다. 나는 모순 된 충고를 여기에서 볼 때 혼란 스러울뿐입니다. 그래서 저는 근본적으로 잘못된 것을하고 있다고 생각합니다. 질문 : 가족 (htons/ntohs)을 전환 할 필요가 없다는 조언이 있으면 무엇을 잘못하고 있습니까?
질문과 관련이 없으면 여기에서 두 개의 피연산자를'if (AF_INET6 == data.sa_family)'로 바꿔야합니다. 그렇습니다. 다른 방법은 정상적인 방법입니다. 즉,'variable == constant' –
어디에서'data' 변수를 채울 수 있습니까? 파이썬 코드가 전송하기 전에 모든 것을 네트워크 바이트 순서로 변환하고 있는지 확인하고 있습니까? –
당신은 패밀리 필드가 변환 할 필요가 없다고 말합니다. 네트워크를 통해 전송되지는 않지만 드라이버가 패킷을 작성하는 방법을 알기 위해 사용합니다. –