그냥 채팅만 가능한 프로그램은 구현할 수 있는데
서버에서 유의미한 데이터를 보내서 클라를 조작하려면 어찌해야됨?
정수값을 보내면
클라 입장에서는 내가 받은 데이터가 그냥 채팅 메시지로 온 건지 명령어로 온 건지 어찌 구분해?
인터넷 찾아봐도 잘 모르겠다..
무슨 헤더를 추가해서 구분하는 것 같은데
뭐라고 검색해야 되냐,,
그냥 채팅만 가능한 프로그램은 구현할 수 있는데
서버에서 유의미한 데이터를 보내서 클라를 조작하려면 어찌해야됨?
정수값을 보내면
클라 입장에서는 내가 받은 데이터가 그냥 채팅 메시지로 온 건지 명령어로 온 건지 어찌 구분해?
인터넷 찾아봐도 잘 모르겠다..
무슨 헤더를 추가해서 구분하는 것 같은데
뭐라고 검색해야 되냐,,
그게 핵심임
만약에 헤더가 짤려서 오면 어떢함? 첫 번째 바이트에 타입넣고 두 번째에 값을 넣었는데 타입 따로 오고 값 따로 오면?
제일 쉬운 방법은 첫 4 바이트에 메시지 크기 담기 -> 메시지 크기만큼 읽은 다음에 파싱하기
따로온 패킷인지 아닌지도 알아내는게 핵심임
으아아아아악 너무 어렵다... 첫 4바이트를 잘못 읽는 경우는 없음? 메시지 크기/메시지 - 메시지 크기/메시지 이렇게 전달되어야 하는게 메시지크기/메시지/메시지크기 - 메시지 이렇게 오면 어떡함?
그건 보내는놈이 잘 보내야지 ..
아 니가 어떻게 보내든 받는 순서는 무조건 랜덤이고그래서 보통 read_all같은 함수를 따로 짬void read_all(int sock, void* o_buf, size_t n_read){ while(n_read){ n_read -= ::read(sock, o_buf, n_read); }}이런 식으로 ... 무조건 4바이트는 읽겠다 이거지
받는 순서가 랜덤이라는 말은 헛나왔다 ... 받는 사람은 데이터가 어떻게 쪼개질지 알수가 업음 보내는 사람이 100바이트를 ::send 호출에 담아서 보냈어도 받는 사람은 3/15/82 이 순서로 받을수도 있고 아닐 수도 있고 ... 그래서 일단 가정을 하는거임, 한 바이트씩 읽든 4바이트를 한 번에 읽든 일단 4바이트를 읽어야겠다 -> 그 4바이트에 길이가 담겼으니까 그 길이만큼 무조건 읽어야겟다
이렇게 약속을 하는거고, 당연히 보내는 쪽에서 첫 4바이트에다가 120바이트 보내겠다고 적어놓고 실제로 128바이트를 보내버리면 프로그램은 개박살 나는거지 머 ...
행님 감사합니다. 참고하겠습니다
그걸 위해서 번잡스러운 프로토콜이 얹히고 얹히고 얹히지요
구조체를 통해서 데이터의 종류와 데이터의 내용을 담을 수 있는 틀을 만드셈