RE:и снова RAW SOCKETS

From
Kirill Neznamov (2:5025/32.88)
To
Gennady Porev
Date
2002-11-07T23:58:02Z
Area
SU.WINDOWS.NT.PROG
Am 07 Nov 02  16:40:00 schrieb Gennady Porev an Kirill Neznamov zum Thema 
<Ё б-Rў  RAW SOCKETS>

KN>  sizeof(i) у тебя будет = 1 так как i у тебя байт.
KN>  в msdn сказано что IP_HDRINCL это BOOL.Поэтому:
KN>  SetSockOpt(S,IPPROTO_IP,IP_HDRINCL,@i,4);
GP> 
GP> Да что ты говоришь???? 8-))))) Тогда обьясни, мне, пожалуйста вот что. 
GP> Во-первых, чем отличается байт и интежер при положении этого параметра 
GP> на стэк для вызова SetSockOpt,

Стэк здесь не причем - важен последний параметр. sizeof(байт) = 1.
sizeof(int) = 4. У меня была такая проблема именно в этом месте:
 
       int on=1;
       setsockopt(sock,IPPROTO_IP,IP_HDRINCL,&on, 4);

Если вместо 4 было 1 то возвращалась какая-то ошибка. Компилятор был watcom.
Мои предположения почему возникает:
Смотрим в wtypes.h - typedef long BOOL; // BOOL - 4 байта
читаем описание setsockopt():

int setsockopt ( 
    SOCKET s,   
    int level,  
    int optname,        
    const char FAR * optval,    
    int optlen  
   );   

optval - A pointer to the buffer in which the value for the requested option is         supplied.
optlen - The size of the optval buffer. 

В случае BOOL у тебя буффер = 4 байта. Если вместо 4 ты указал 1 то байт
с установленным битом терялся.

GP> а во-вторых, почему тогда функция 
GP> SetSockOpt не возвращает здесь значение <>0, если это ошибка?

Ну тогда ошибка не здесь :)

P.S. Ну до дяди мне еще далеко :)


WBR,
    KiR
--- F.I.P.S./32 v1.0r W95/NT [M]
 * Origin: Придумай его сам. (2:5025/32.88)