임베디드 Linux 보드에서 netcat을 사용하여 UDP 패킷을 보내려고 하면 "연결이 거부되었습니다"

임베디드 Linux 보드에서 netcat을 사용하여 UDP 패킷을 보내려고 하면 "연결이 거부되었습니다"

다음과 같이 netcat()을 통해 로컬 프로세스에 바이너리 패킷을 보내려고 합니다 nc.

nc -w 1 -u localhost 10000 < my_binary_packet.bin

출력은 다음과 같습니다

read(net): Connection refused

무슨 일인지 아는 사람 있나요?

나는 같은 결과를 얻습니다nc -w 1 -u 127.0.0.1 10000 < my_binary_packet.bin

답변1

일반화하다

리스너가 IP(임의의 인터넷 네임스페이스 주소)가 아닌 특정 IP(예: 192.168.0.10) 및 포트(예: )에 바인딩된 경우 이는 청취한다는 의미입니다.10000INADDR_ANY모두인터페이스/IP 주소), 올바른 IP를 지정하려면 다음을 수행하십시오.

# with netcat
nc -w 1 -u 192.168.0.10 10000 < my_binary_packet.bin

# OR (same thing), with socat
socat udp:192.168.0.10:10000 - < my_binary_packet.bin

세부 사항

알았어, 알아냈어!

로컬 리스너 프로세스(UDP "서버/리스너")를 작성했고 (UDP "클라이언트/발신자"에서) 바이너리 패킷을 보내려고 하며 해당 소켓을 192.168.0.10" 포괄" IP 주소 INADDR_ANY. 해당 특정 IP 주소에 바인딩한다는 것은 내 수신기 프로세스가 듣고 있지 않음 localhost( 127.0.0.1)을 의미하므로 이러한 패킷은 거부됩니다! localhost동일한 PC에서 실행되는 프로세스에 일부 데이터를 전송하거나 보내는 것 외에 다른 것을 사용할 수 있는지는 모르겠지만 127.0.0.1분명히 가능합니다.

따라서 이것은 작동합니다.

nc -w 1 -u 192.168.0.10 10000 < my_binary_packet.bin

그러나 1초의 timeout/wait( -w 1)는 아무 일도 하지 않는 것 같습니다. 이유는 모르겠습니다. 패킷을 보낸 후 그대로 있고 다시 보내려면 게시 Ctrl+ C프로세스를 수행해야 합니다. nc하지만 그건 중요하지 않습니다. 요점은 작동한다는 것입니다!

또한 내 질문에 달린 댓글을 주의 깊게 읽었으므로 궁금해하시는 분들을 위해 다음과 같은 추가 정보를 제공합니다.

이에 상응하는 명령은 다음과 같습니다( 명령에 있는 것을 socat잊지 마세요 !).-

socat udp:192.168.0.10:10000 - < my_binary_packet.bin

또한 이것은 netcat임베디드 Linux 보드의 내 버전입니다.socat

# nc -h
GNU netcat 0.7.1, a rewrite of the famous networking tool.

# nc -V
netcat (The GNU Netcat) 0.7.1
Copyright (C) 2002 - 2003  Giovanni Giacobbi

# socat -V
socat by Gerhard Rieger and contributors - see www.dest-unreach.org
socat version 1.7.3.4 on May  6 2022 17:55:04

더 나아가

netcatC 또는 C++로 바이너리 패킷을 작성하여 전송하거나 전송 하는 방법socat

마지막으로, 제가 바이너리 패킷을 작성하는 방법은 my_binary_packet.binLinux를 사용하여 파일에 패키징 구조를 작성하는 C 코드를 작성하는 것뿐입니다.write()주문하다.

이와 같이 바이너리에 패킷을 작성하면 netcat테스트가 통과 가능하거나 쉬워지므로 socat작동하지 않을 때 이 질문을 하게 되었습니다.

파일을 열 때 파일 권한을 설정해야 합니다. 전임자:

int file = open("my_binary_packet.bin", O_WRONLY | O_CREAT, 0644);

이것이 구조 정의의 모습입니다. 파일 my_binary_packet.bin에는 실제로 바이너리 패킷 내 구조의 바이트 단위 복사본만 포함되어 있습니다.뒤쪽에구조의 각 멤버에 대해 구체적이고 필요한 값을 설정했습니다.

struct __attribute__((__packed__)) my_packet {
    bool flag1;
    bool flag2;
    bool flag3;
};

완전한 코드파일을 열고, 패킷을 생성하고, 바이너리 패킷을 파일에 쓰는 것은 다음과 같습니다.

typedef struct __attribute__((__packed__)) my_packet_s {
    bool flag1;
    bool flag2;
    bool flag3;
} my_packet_t;
    
int file = open("my_binary_packet.bin", O_WRONLY | O_CREAT, 0644);
if (file == -1)
{
    printf("Failed to open. errno = %i: %s\n", errno, strerror(errno));
    return;
}

my_packet_t my_packet = 
{
    .flag1 = true,
    .flag2 = true,
    .flag3 = true,
};

ssize_t num_bytes_written = write(file, &my_packet, sizeof(my_packet));
if (num_bytes_written == -1)
{
    printf("Failed to write. errno = %i: %s\n", errno, strerror(errno));
    return;
}

int retcode = close(file);
if (retcode == -1)
{
    printf("Failed to close. errno = %i: %s\n", errno, strerror(errno));
    return;
}

C 또는 C++로 Berkeley 소켓을 작성하는 방법을 배우고 싶은 사람을 위해...

나는 내 기사에서 매우 상세한 데모를 작성했습니다.eRCAGuy_hello_world환매. 이 서버 코드는 내 UDP 수신기 프로세스의 기반입니다.

  1. 소켓__geeksforgeeks_udp_server_GS_edit_GREAT.c
  2. 소켓__geeksforgeeks_udp_client_GS_edit_GREAT.c

인용하다

  1. 내 질문에 댓글을 달아주세요.
  2. netcat에는 여러 버전이 있습니다.Netcat - IPv6 주소를 사용하여 TCP 포트를 수신하는 방법은 무엇입니까?
  3. 이 답변과 내 의견은 다음과 같습니다.UDP 수신 오류: 연결이 거부되었습니다.

당신은 또한 볼 수 있습니다

  1. 내 대답은nc수신 시 바인딩된 IP 주소 설정 또는 전송할 때 전송되는 IP 주소 설정을 포함하여 netcat( ) 사용에 대한 일반적인 지침입니다 .

관련 정보