setsockopt에 대한 질문입니다.

딩구리의 이미지

안녕하세요.

이 질문하려고 방금 가입했습니다. --;
그 동안 윈도에서만 작업하다 어찌하다 보니 리눅스에서도 작업을 하게 된 관계로 자주 찾게 되네요.
앞으론 자주 뵐 듯 합니다.
사설이 길었습니다.

본론으로 가서,
제가 검토하고 있는 코드중에서 이상한 부분이 있어서 문의드립니다.

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 );

이것이 가능한지(물론 가능하겠죠..^^ 그렇게 잘 쓰고 있으니까..), 그렇다면 어떤 값을 사용해야 하는지 명쾌한 답변 부탁드립니다.

좋은 하루 되세요.

wariua의 이미지

아시다시피 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)
그래서 일일이 로그 찍어가며 작업해야 하기에, 또한 제가 손 대기도 거시기한 소스라 아직 하진 못했지만...
확인 후에 다시 말씀드립죠..^^

여하튼 님처럼 내공깊은 고수들의 개떼같은 답글 지둘리겠습니다.
좋은 하루 되세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.