setsockopt에 대한 질문입니다.
글쓴이: 딩구리 / 작성시간: 화, 2005/11/29 - 3:49오후
안녕하세요.
이 질문하려고 방금 가입했습니다. --;
그 동안 윈도에서만 작업하다 어찌하다 보니 리눅스에서도 작업을 하게 된 관계로 자주 찾게 되네요.
앞으론 자주 뵐 듯 합니다.
사설이 길었습니다.
본론으로 가서,
제가 검토하고 있는 코드중에서 이상한 부분이 있어서 문의드립니다.
int setsockopt( int socket, int level, [b]int optname[/b], const void * optVal, unsigned int * optLen );
요기서 세번째 인자인 int optname에서요.
자신이 정의한 값을 넣을 수도 있는 건가요?
제가 본 코드에서는
#define SO_XXXMODE 0xD001 #define SO_YYYMODE 0xD002
이런 식으로 정의한 후 이 값을 세번째에 넣더군요.
ret = setsockopt( hSocket, SOL_SOCKET, SO_XXXMODE, (char *)&optval, optlen );
이것이 가능한지(물론 가능하겠죠..^^ 그렇게 잘 쓰고 있으니까..), 그렇다면 어떤 값을 사용해야 하는지 명쾌한 답변 부탁드립니다.
좋은 하루 되세요.
Forums:
아시다시피 [b]setsockopt()[/b] 함수는 특정 소켓에 대해
아시다시피 setsockopt() 함수는 특정 소켓에 대해 특정 프로토콜 계층에서의 동작 방식을 제어하는 함수입니다. 그 옵션들에 영향을 받는 동작들이 모두 커널 내에서 이뤄지기에 응용 프로그램이 optname에 자체적으로 정의한 (기존의 option 값들과 다른) 값을 입력하면 EINVAL 정도의 에러가 반환될 뿐입니다.
위에서 인용하신 SO_XXXMODE 등의 경우 다음 경우 중 한 가지가 아닐까 추측해 봅니다.
- 시스템 헤더 파일을 include 하기 귀찮아서 (설마...;; ) 시스템 헤더 파일에 있는 정의를 그대로 복사
- 시스템 헤더 파일에 이미 정의되어 있는 다른 옵션에 대한 별명
- 커널에서 새로운 옵션에 대한 처리 루틴을 추가해 준 후 이를 사용하는 것 (SOL_SOCKET level의 옵션이라면 커널 소스의 net/core/sock.c의 sock_setsockopt()가 기본적인 핸들러입니다)
0xD001이라는 값을 봐선 첫 번째와 두 번째 모두 아닌 것 같습니다. 사용하고 계신 커널이 변경 작업을 하고 컴파일을 해준 커널인지요? 그리고 인용하신 호출의 return값은 0으로 잘 나오고 있는 건가요?[/]$PWD `date`
앗!! 죄송..
우선 답변 감사드립니다.
제가 정보를 모두 드리지 못했군요..ㅠㅠ
저 Source는 WinCE(eVC++ 4.)에 들어 있던 코드입니다.
그러므로 커널 컴파일은 아닐것입니다.
또한 시스템 헤더(Winsock2.h) 부분은 제가 찾아보았는데 0xD로 시작하는 놈은 없는걸로 보아 첫번째와 두번째도 아닌거 같구요.
그래서 궁금해서 글을 쓴 거구요.
리턴값은 아직 확인 안 해봤습니다. ㅡㅡa
이노무 evc는 네트워크 프로그래밍, 특히 raw socket이나 hooking쪽으로 가면 디버깅이 안됩니다.(방법을 아시는 분 후사(?)하겠음.. ㅡㅡb)
그래서 일일이 로그 찍어가며 작업해야 하기에, 또한 제가 손 대기도 거시기한 소스라 아직 하진 못했지만...
확인 후에 다시 말씀드립죠..^^
여하튼 님처럼 내공깊은 고수들의 개떼같은 답글 지둘리겠습니다.
좋은 하루 되세요.
댓글 달기