누구나 말해 줄 수 있나요? "헤더 생성 방법" FTP 클라이언트 - 서버 코드를 작성 중입니다. 그리고 나는 내 데이터의 크기 등과 같은 정보로 서버에 보내야하는 모든 데이터 패킷에 대해 클라이언트 측에 헤더를 추가하려고합니다.커스텀 메시지 헤더 추가하기
나는 몇 가지 예를 보았으나 정확한 방법을 찾아 낼 수 없다. 샘플/예제 코드에 대한 모든 포인터가 감사하겠습니다.
누구나 말해 줄 수 있나요? "헤더 생성 방법" FTP 클라이언트 - 서버 코드를 작성 중입니다. 그리고 나는 내 데이터의 크기 등과 같은 정보로 서버에 보내야하는 모든 데이터 패킷에 대해 클라이언트 측에 헤더를 추가하려고합니다.커스텀 메시지 헤더 추가하기
나는 몇 가지 예를 보았으나 정확한 방법을 찾아 낼 수 없다. 샘플/예제 코드에 대한 모든 포인터가 감사하겠습니다.
당신이 모두 클라이언트 - 서버에서 헤더에되고 싶은 회원들과 구조체 정의를 위해 포함해야 헤더를 찾을 수 있습니다 (더 나은 구조체와 헤더 파일을 포함하는 둘다). 원래 메시지보다 먼저 헤더를 보냅니다. 구조체의 고정 길이의 매개 변수를 사용하여 서버에서 recv.
typedef struct
{
DWORD dwMsgType ;
DWORD dwMsgSize ;
}MSG_HEADER, *PMSG_HEADER ;
패킷을 만들기위한 라이브러리 인 scapy를 확인하십시오. 나는 그것이 당신이 필요로하는 것이라고 생각합니다.
프로토콜 데이터를 구축하는 가장 좋은 방법은 uint8_t
버퍼를 어딘가에두고 프로토콜에 지정된대로 채우는 것입니다.
FTP의 경우 제어 연결에 ASCII 문자열 만 있기 때문에 다소 간단합니다. 이런 식으로 뭔가 작동 할 수 있습니다 : 당신의 프로그램이 제대로 작성된 경우 항상 true가됩니다
bool append_literal(uint8_t **cursor, uint8_t *end, uint8_t const *data, size_t size) {
assert(cursor);
assert(*cursor);
assert(end);
assert(*cursor < end);
assert(data);
if((end - *cursor) < size) // Check buffer limit
return false;
memcpy(*cursor, data, size); // Copy
*cursor += size; // Increment cursor
return true;
}
bool append_number(uint8_t **cursor, uint8_t *end, uint64_t number) {
assert(cursor);
assert(*cursor);
assert(end);
assert(*cursor < end);
if((end - *cursor) < 17) // Max number of base 10 digits in uint64_t
return false;
*cursor += sprintf(*cursor, "%" PRIu64, number);
return true;
}
bool append_uint32_binary(uint8_t **cursor, uint8_t *end, uint32_t value) {
assert(cursor);
assert(*cursor);
assert(end);
assert(*cursor < end);
if((end - *cursor) < 4) // Bytes needed for uint32 value
return false;
*(*cursor)++ = (value >> 24) & 0xff;
*(*cursor)++ = (value >> 16) & 0xff;
*(*cursor)++ = (value >> 8) & 0xff;
*(*cursor)++ = value & 0xff;
return true;
}
// Specific FTP commands
bool append_size_command(uint8_t **cursor, uint8_t *end, uint64_t size) {
return append_literal(cursor, end, "SIZE ", 5) &&
append_number(cursor, end, size) &&
append_literal(cursor, end, "\r\n", 2);
}
// [...]
bool send_size_command(int fd, uint64_t size) {
uint8_t buffer[32];
uint8_t *cursor = buffer;
uint8_t *const end = buffer + sizeof buffer;
if(!append_size_command(&cursor, end, size))
return false;
size_t length = cursor - buffer;
ssize_t sent = send(fd, buffer, length, 0);
return (sent == length);
}
은 "어설"문 테스트 일을, 즉, 포인터가 유효합니다. 모든 함수는 성공시 true
을 반환하고 실패하면 false
을 반환합니다.
WinSock이 소켓을 구현하기 때문에 소켓에 표준 POSIX 함수를 사용했고 상당히 이식성이 있습니다.
숙제는 PRIu64
:
어떤 언어입니까? – Kimvais
C++ (Windows 플랫폼) – Abhineet