2012-03-01 3 views
0

누구나 말해 줄 수 있나요? "헤더 생성 방법" FTP 클라이언트 - 서버 코드를 작성 중입니다. 그리고 나는 내 데이터의 크기 등과 같은 정보로 서버에 보내야하는 모든 데이터 패킷에 대해 클라이언트 측에 헤더를 추가하려고합니다.커스텀 메시지 헤더 추가하기

나는 몇 가지 예를 보았으나 정확한 방법을 찾아 낼 수 없다. 샘플/예제 코드에 대한 모든 포인터가 감사하겠습니다.

+0

어떤 언어입니까? – Kimvais

+2

C++ (Windows 플랫폼) – Abhineet

답변

0

당신이 모두 클라이언트 - 서버에서 헤더에되고 싶은 회원들과 구조체 정의를 위해 포함해야 헤더를 찾을 수 있습니다 (더 나은 구조체와 헤더 파일을 포함하는 둘다). 원래 메시지보다 먼저 헤더를 보냅니다. 구조체의 고정 길이의 매개 변수를 사용하여 서버에서 recv.

typedef struct 
{ 
    DWORD dwMsgType ; 
    DWORD dwMsgSize ; 
}MSG_HEADER, *PMSG_HEADER ; 
1

패킷을 만들기위한 라이브러리 인 scapy를 확인하십시오. 나는 그것이 당신이 필요로하는 것이라고 생각합니다.

+2

Windows 플랫폼에서 C++을 사용 중입니다. 내 헤더를 만들고 간단한 데이터를 원래 데이터에 첨부하여 서버에 보내는 방법에 대한 간단한 정보가 필요한 "구조체"코드가 필요합니다. – Abhineet

+2

아, 그때는 신경 쓰지 마라. "언어"를 먼저 물어 봐야합니다. FTP 프로토콜을 직접 구현하는 경우 ftp 사양을 조회하면 헤더에 무엇이 있어야하는지 알려줍니다. 그런 다음 생성하는 패킷을 보낼 수있는 저수준 라이브러리가 필요합니다. – alexis

+2

노력에 감사드립니다. – Abhineet

1

프로토콜 데이터를 구축하는 가장 좋은 방법은 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 :

+2

답장을 보내 주셔서 감사합니다. 이전에 잘못된 질문을했습니다 .--(지금 편집했습니다. 사과 드리겠습니다. – Abhineet

+2

데이터 크기와 같은 세부 정보가있는 모든 데이터 패킷에 헤더를 추가하고 보내려합니다. recv를 사용하여 서버에 저장하십시오. – Abhineet

+0

uint32 값을 출력 버퍼에 이진 데이터로 추가하는 함수를 추가 했으므로 이러한 함수를 사용하여 헤더를 구성 할 수 있습니다. –

관련 문제