Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

invoke bind,s,addr sin,sizeof sin - Error!

367
22 сентября 2007 года
Meatcoins
303 / / 18.01.2006
Код:
.386
            .model flat, stdcall
             option casemap :none
             include E:\masm32\include\windows.inc
             include E:\masm32\include\kernel32.inc
             include E:\masm32\include\user32.inc
             include E:\masm32\include\advapi32.inc
             include E:\masm32\include\ws2_32.inc
             includelib E:\masm32\lib\kernel32.lib
             includelib E:\masm32\lib\user32.lib
             includelib E:\masm32\lib\advapi32.lib
             includelib E:\masm32\lib\ws2_32.lib
             include E:\masm32\macros\Strings.mac

IN_ADDR struct
s_addr dd ?
IN_ADDR ends

SOCKADDR_IN struct
sin_family dw ?
sin_port dw ?
sin_addr IN_ADDR <?>
sin_zero db 8h dup(?)
SOCKADDR_IN ends


.data
.data?
sin SOCKADDR_IN <>
.code
_start:

call Try

invoke ExitProcess,0h


Try proc
local WsaData:WSADATA
local s:SOCKET
;local sin:SOCKADDR_IN

local sock:SOCKET

invoke WSAStartup,101h,addr WsaData
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
mov s,eax

    mov sin.sin_family,AF_INET
            invoke htons,21
    mov sin.sin_port,ax
           ; invoke inet_addr,$CTA0("192.168.4.77")
;   mov sin.sin_addr.s_addr,eax
mov sin.sin_addr.s_addr,INADDR_ANY

invoke bind,s,addr sin,sizeof sin
;invoke connect,s,offset sin,sizeof sin
invoke closesocket,s
invoke WSACleanup

ret
Try endp
end _start


invoke bind,s,addr sin,sizeof sin даёт в eax FFFFFFFFh, т.е. error!
А в GetLastError WSAEADDRINUSE (00002740h)!
Почему?

int bind(s,addr,addrlen)
int s;
struct SOCKADDR_IN *addr
int addrlen;

Забодала меня эта ошибка! Никак не могу понять в чём дело!
Может кто свежим взглядом подскажет...
367
22 сентября 2007 года
Meatcoins
303 / / 18.01.2006
 
Код:
IN_ADDR struct
s_addr dd ?
IN_ADDR ends

SOCKADDR_IN struct
sin_family dw ?
sin_port dw ?
sin_addr IN_ADDR <?>
sin_zero db 8h dup(?)
SOCKADDR_IN ends

Есть ли эти структуры в каком-нибудь *.inc файле???
30K
23 сентября 2007 года
red f0x
5 / / 14.09.2007
Ну, у Вас же есть код ошибки? Из него всё ясно.

10048 = WSAEADDRINUSE
Only one usage of each socket address (protocol/network address/port) is normally permitted.

Обычно это устраняется настройкой сокета через setsockopt(), необходимо установить параметр SO_REUSEADDR в 1.

Прототип: int setsockopt (SOCKET s, int level, int optname, const char* оptval, int optlen);

Где level будет равен SOL_SOCKET, optname - SO_REUSEADDR. Опция требует параметра типа int. 0 - отключено (по умолчанию), 1 - включено.
367
23 сентября 2007 года
Meatcoins
303 / / 18.01.2006
Код:
.386
            .model flat, stdcall
             option casemap :none
             include E:\masm32\include\windows.inc
             include E:\masm32\include\kernel32.inc
             include E:\masm32\include\user32.inc
             include E:\masm32\include\advapi32.inc
             include E:\masm32\include\ws2_32.inc
             includelib E:\masm32\lib\kernel32.lib
             includelib E:\masm32\lib\user32.lib
             includelib E:\masm32\lib\advapi32.lib
             includelib E:\masm32\lib\ws2_32.lib
             include E:\masm32\macros\Strings.mac

IN_ADDR struct
s_addr dd ?
IN_ADDR ends

SOCKADDR_IN struct
sin_family dw ?
sin_port dw ?
sin_addr IN_ADDR <?>
sin_zero db 8h dup(?)
SOCKADDR_IN ends


.data
mydata db "564",0h
.data?
sin SOCKADDR_IN <>
.code
_start:

call Try

invoke ExitProcess,0h

Try proc
local WsaData:WSADATA
local s:SOCKET

local sock:SOCKET
local myoption:DWORD
local recvdata:DWORD

invoke WSAStartup,101h,addr WsaData
invoke socket,AF_INET,SOCK_DGRAM,IPPROTO_UDP
mov s,eax

mov myoption,TRUE
invoke setsockopt,s,SOL_SOCKET,SO_BROADCAST,addr myoption,sizeof myoption


mov sin.sin_family,AF_INET
invoke htons,21
mov sin.sin_port,ax
mov sin.sin_addr.s_addr,INADDR_BROADCAST
invoke bind,s,offset sin,sizeof sin

invoke recvfrom,s,offset mydata,sizeof mydata,0h,offset sin,sizeof sin

invoke closesocket,s
invoke WSACleanup
ret
Try endp
end _start


invoke setsockopt,s,SOL_SOCKET,SO_BROADCAST,addr myoption,sizeof myoption
Нет ошибок!
 
Код:
mov sin.sin_family,AF_INET
invoke htons,21
mov sin.sin_port,ax
mov sin.sin_addr.s_addr,INADDR_BROADCAST
invoke bind,s,offset sin,sizeof sin

Тут, вроде, ничего не может быть неправильного...

invoke bind,s,offset sin,sizeof sin

eax = FFFFFFFFh
WSAEADDRNOTAVAIL (00002741) - Error!
И всё равно error!

invoke recvfrom,s,offset mydata,sizeof mydata,0h,offset sin,sizeof sin
eax = FFFFFFFFh
WSAEINVAL (00002726) - The socket has not been bound with bind!
Ну, это естественно...
367
23 сентября 2007 года
Meatcoins
303 / / 18.01.2006
Код:
.386
            .model flat, stdcall
             option casemap :none
             include E:\masm32\include\windows.inc
             include E:\masm32\include\kernel32.inc
             include E:\masm32\include\user32.inc
             include E:\masm32\include\advapi32.inc
             include E:\masm32\include\ws2_32.inc
             includelib E:\masm32\lib\kernel32.lib
             includelib E:\masm32\lib\user32.lib
             includelib E:\masm32\lib\advapi32.lib
             includelib E:\masm32\lib\ws2_32.lib
             include E:\masm32\macros\Strings.mac

IN_ADDR struct
s_addr dd ?
IN_ADDR ends

SOCKADDR_IN struct
sin_family dw ?
sin_port dw ?
sin_addr IN_ADDR <?>
sin_zero db 8h dup(?)
SOCKADDR_IN ends




.data
mydata db "564",0h
.data?
sin SOCKADDR_IN <>
WsaData WSADATA <>
.code
_start:

call Try

invoke ExitProcess,0h



Try proc
;local s:SOCKET
;local sin:SOCKADDR_IN
local sock:SOCKET
local myoption:DWORD
local recvdata:DWORD

invoke WSAStartup, 101h,offset WsaData
;invoke socket, AF_INET, SOCK_STREAM,IPPROTO_TCP
invoke socket,AF_INET,SOCK_DGRAM,IPPROTO_UDP
mov sock, eax

mov myoption,TRUE
invoke setsockopt,sock,SOL_SOCKET,SO_REUSEADDR,addr myoption,sizeof myoption

invoke htons, 21
mov sin.sin_port, ax
mov sin.sin_family, AF_INET
mov sin.sin_addr.s_addr, INADDR_ANY

;invoke inet_addr,$CTA0("192.168.23.128")
;mov sin.sin_addr.s_addr,eax ;Так тоже работает, если 192.168.23.128 - адрес локального компа...

invoke bind,sock,offset sin,sizeof sin
;invoke listen, sock, 0

invoke closesocket,sock
invoke WSACleanup


ret
Try endp
end _start

P.S.
Спасибо за подсказочку с invoke setsockopt,sock,SOL_SOCKET,SO_REUSEADDR,addr myoption,sizeof myoption
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог