다음과 같이 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
) 및 포트(예: )에 바인딩된 경우 이는 청취한다는 의미입니다.10000
INADDR_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
더 나아가
netcat
C 또는 C++로 바이너리 패킷을 작성하여 전송하거나 전송 하는 방법socat
마지막으로, 제가 바이너리 패킷을 작성하는 방법은 my_binary_packet.bin
Linux를 사용하여 파일에 패키징 구조를 작성하는 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 수신기 프로세스의 기반입니다.
인용하다
- 내 질문에 댓글을 달아주세요.
- netcat에는 여러 버전이 있습니다.Netcat - IPv6 주소를 사용하여 TCP 포트를 수신하는 방법은 무엇입니까?
- 이 답변과 내 의견은 다음과 같습니다.UDP 수신 오류: 연결이 거부되었습니다.