.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 - Error!
Код:
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;
Забодала меня эта ошибка! Никак не могу понять в чём дело!
Может кто свежим взглядом подскажет...
Код:
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
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 файле???
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 - включено.
Код:
.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
.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 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!
Ну, это естественно...
Код:
.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
.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