【发布时间】:2010-10-05 15:30:48
【问题描述】:
我正在关注一个使用 MASM 语法的 winsock 教程,名为:Iczelion 的 Winsock 编程指南
我被卡住了,我收到一个错误,但我不知道如何解决它。 问题是每次我尝试使用我的套接字连接到服务器时,我都会收到 WSANOTSOCK 错误(套接字操作是在不是套接字的东西上执行的)
但是调用 WSAStartup() 或 Socket() 时没有错误。那么这个错误怎么会出现在这里呢?
这是我目前正在使用的代码(我说我遵循了 Iczelion 的 Winsock 编程指南,但我已经对其进行了修改以满足我的需要,我正在尝试创建一个 irc 机器人)
.386
.model flat, stdcall
option casemap: none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\wsock32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\wsock32.lib
includelib \masm32\lib\masm32.lib
.data
txt db "An error occured while calling WSAStartup",0
txt1 db "An error occured while creating a socket",0
txt2 db "An error occured while connecting",0
capt db "SCHiM",0
wsadata WSADATA <>
hostname db "irc.corruptcode.org",0
Port dd 6667
NICK db "NICK SCHiMBot",0
USER db "USER SCHIMR 8 * :SCHMRR",0
CHANNEL db "/join #botts",0
sin sockaddr_in <?>
.data?
sock dd ?
;ErrorCode dd ?
ErrorCode dd ?
.code
start:
invoke WSAStartup, 101h,addr wsadata
.if eax!=NULL ;An error occured if eax != null, because there's no return value for this api, if there's return, there's an error
mov ErrorCode, eax
push MB_OK
push offset capt
push offset txt
push 0
call MessageBoxA
.else
invoke socket,AF_INET,SOCK_STREAM,0 ; Create a stream socket for internet use
invoke WSAGetLastError
.if eax!=INVALID_SOCKET
mov sock,eax
.else
invoke WSAGetLastError
push MB_OK
push offset capt
push offset txt1
push 0
call MessageBoxA
.endif
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;Now we have a socket ready for use, we still have to be able to connect to somewere though...
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
mov sin.sin_family, AF_INET
invoke htons, Port ; convert port number into network byte order first
mov sin.sin_port,ax ; note that this member is a word-size param.
invoke gethostbyname, addr hostname
mov eax,[eax+12] ; move the value of h_list member into eax
mov eax,[eax] ; copy the pointer to the actual IP address into eax
mov eax,[eax]
mov sin.sin_addr,eax ; copy IP address into eax
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;Now That's done we can connect to a site! (an irc channel in this case)
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
invoke connect,socket,addr sin,sizeof sin
.if eax==SOCKET_ERROR
invoke WSAGetLastError
mov ErrorCode, eax
push MB_OK
push offset capt
push offset txt2
push 0
call MessageBoxA
invoke ExitProcess, NULL
.endif
invoke send, socket,addr USER, 100, 0
.if eax==SOCKET_ERROR
push MB_OK
push offset capt
push offset txt2
push 0
call MessageBoxA
invoke ExitProcess, NULL
.else
invoke send, socket,addr NICK, 100, 0
invoke send, socket,addr CHANNEL, 100, 0
.endif
.endif
invoke ExitProcess, NULL
end start
提前致谢
-瑞克
【问题讨论】:
-
收到答案后不要删除您的问题。保留问题不变,以便下一个遇到类似问题的人可以从中受益。
-
在看到发布的解决方案之前,我已经发现了我的错误,但这是正确的。以后我会记得保留我的问题