0
我跟着MASM的语法中的一个winsock教程叫:Iczelion的Winsock编程指南MASM winsock错误?
我卡住了,我收到一个错误,但我不知道如何解决它。 的事情是,每次我尝试连接到我的插座的服务器,我收到一个WSANOTSOCK错误(套接字opperation是在一些预制不是一个套接字)
但没有调用WSAStartup时错误()或Socket()。那么现在这个错误怎么会在这里呢?
这里是我目前使用的代码(我说我也跟着Iczelion指南编程的Winsock,但我modefied它来满足我的需求,我试图创建一个IRC bot)
.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
在此先感谢
-Rick
当你收到答案时不要删除你的问题。保持问题不变,以便下一个有类似问题的人可以从中受益。 – meagar 2010-10-05 17:53:53
我在看到发布的解决方案之前就已经发现了我的错误,但是这是正确的。我会记住将来会保留我的问题 – Rick 2010-10-05 18:30:31