Socket [asm]

Ich schreibe momentan ein Server Socket, allerdings habe ich mit einer Funktion Probleme(INFO: Code wird mit masm32 assembliert&gelinkt):

Auszug:

Code:
(Auschnitt aus .DATA?)
Addr_Struct sockaddr_in <>
Addr_Union ADDRESS_UNION <>
Addr_In in_addr <>

(Auschnitt aus .CODE)
;bind Socket
;##############################################################
mov Addr_Struct.sin_family,AF_INET
invoke htons,4D2h
mov Addr_Struct.sin_port,ax
mov Addr_Union.S_addr, INADDR_ANY
mov Addr_In.S_un,OFFSET Addr_Union
mov Addr_Struct.sin_addr,OFFSET Addr_In
invoke bind,ADDR Server_Socket,ADDR Addr_Struct,sizeof(sockaddr_in)
cmp eax,SOCKET_ERROR
JE Bind_Fehler
invoke MessageBox,NULL,ADDR bind_Success_db,ADDR Prog_Name,MB_OK
;##############################################################

Ich glaube, ich fülle die Struktur nicht richtig(In der Windows.inc ist sie auch irgentwie anders definiert als in der API Ref. und da hab ich jetzt irgentwie mir was zusammen gebastelt von ein paar webseiten). Beim Assembling&Linking gibt es keinen Fehler nur bei Laufzeit bekomme ich die Message BoX die beim Jumpen zu Bind_fehler steht. Hat jemand eine Idee?
Und wenn wir grad schon dabei sind wie kann ich den Error Code von (return int) WSAGetLastError in einer Message Box ausgeben, also ich meine eine Umwandlung von der Zahl zum String(ASCII mit terminierender 0).

gruß
 
Code:
Und wenn wir grad schon dabei sind wie kann ich den Error Code von (return int) WSAGetLastError in einer Message Box ausgeben, also ich meine eine Umwandlung von der Zahl zum String(ASCII mit terminierender 0).
ich glaube irgendwo gibt es eine Liste mit den Werten - ich schau meistens eher mit dem OllyDbg durch, der das automatisch anzeigt.

zum Serversocket (ich gebe mal einfach einen funktionierenden Code an ;) ):
Code:
invoke InitSocket,addr hServerSock
test eax,eax ;wenn Fehler aufgetreten - Stack räumen und Programm schließen
jne ENDE

invoke SetServerSock,addr serverSockAddr,Server_set.port

invoke bind,[hServerSock],addr serverSockAddr,sizeof serverSockAddr
.if eax!=0 ;also Fehler
	  invoke wsprintf,addr msg_buffer,addr template,Server_set.port
	  invoke MessageBox,0,addr msg_buffer,addr msg_Error,MB_ICONERROR
	  jmp ENDE
.endif

Die verwendeten Procs:
Code:
InitSocket proc hServerSocket:DWORD

invoke WSAStartup,WSOCK_VERSION, addr WSAData
.if eax!=0
	invoke MessageBox,0,addr msg_WSAStartup_error,addr msg_Error,MB_ICONERROR
	mov eax,1
	ret 
.endif	
	
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
.if eax==INVALID_SOCKET
    invoke MessageBox,0,addr msg_ServerSock_error,addr msg_Error,MB_ICONERROR
    mov eax,1
    ret
.endif
mov ecx,hServerSocket
mov [ecx],eax
mov eax,0 
ret

InitSocket endp

SetServerSock proc SockAddr:dword, Port:dword
    mov ebx,SockAddr
    mov     ecx, Port
    xchg    cl, ch  ;network Byteorder, dasselbe wie ntohs,nur schneller ;)
    mov [ebx][sockaddr_in.sin_port],cx
    mov [ebx][sockaddr_in.sin_family],AF_INET
    mov [ebx][sockaddr_in.sin_addr.S_un.S_addr],INADDR_ANY
        
    ret
SetServerSock endp
und Daten sind:
Code:
.data
SERVER_Settings struct
     port dd PORT
     path db (PATH_LEN) dup (?) 
     ;php db (PATH_LEN) dup(?)
     ;php_enabled db TRUE
     error_path db (PATH_LEN) dup (?)
     log_request db NEIN
  SERVER_Settings ends
Server_set SERVER_Settings <>
WSAData WSADATA <>
 serverSockAddr sockaddr_in <>
.data?
.data?
  hServerSock dd ?

wobei madwizard.org einen netten Tutorial dafür anbot.
 
Okay jetzt klappts auch bei mir musste das Ganze noch eben für den Client Socket machen. Und es funktioniert!! Danke(auch der Link war sehr hilfreich :D)
Aber eine Frage habe ich noch angenommen ich hab jetzt ein "Variable"

Server_Socket SOCKET ?

Wo ist der Unterschied wenn ich es so schreibe(z.B beim invoke):

invoke blabla,addr Server_Socket

invoke blabla,offset Server_Socket

oder

invoke blabla,[Server_Socket]
 
Wo ist der Unterschied wenn ich es so schreibe(z.B beim invoke):
Prinzipiel gesehen gibt es kaum einer ;).Du übergibst jedesmal die Adresse der Variable.

Technisch gesehen ist INVOKE ein Macro, ADDR war afaik eine "erweiterung" und steht für Adress (wer hätte es gedacht ;) ). Du kannst ADDR auch vor Lokalvariablen schreiben - es wird trotzdem "richtig" geladen (intern wird das afaik per LEA EAX,VARIABLE und PUSH EAX gelöst). Wenn Du dagegen "offset Lokalvariable" anwendest, mag MASM das erstmal gar nicht. Und die letzte Schreibweise sollte eigentlich auch sowohl mit Lokalvariablen wie auch mit globalen funktionieren. Das INVOKE-Macro kann man überigens irgendwo einsehen (der Name der Datei fällt mir nicht ein). Dass es ADDR Localvariable in "Lea eax,Variable; push eax" umschreibt, hat noch einen unangehnemnen Nebeneffekt, dass manchmal, wenn man "invoke blabla,eax,addr Lokalvariable" schreibt, einen Assembler-Fehler bekommt "register value overwritten by INVOKE".

Ich hoffe damit wäre die Frage beantwortet. Wobei jetzt die Details nicht wirklich stimmen müssen (hab das nur kurz aus Interesse gelesen, als MASM 8 rauskam und ADDR anbot).
 
Bei mir gibts bei assemblieren bisweilen Fehlermeldungen wegen diesem addr und []. Naja dann muss ichs bisweilen umändern irgenteinen Unterschied gibts wohl irgentwo da, werd die Tage mal gucken ob ich da was finde.
--------
So jetzt wollte ich mir aber mal das Ganze im Olly ansehen, doch dabei gibts bei mir Probleme. Denn wenn ich das ganz normal über F9 laufen lasse kommt in der API Funktion socket(und auch bei ein paar anderen) die Meldung unten links: "use Shift+F7/F8/F9 to pass excepition to programm". So dann hab ich mal Shift+F7 gedrückt dann macht kurz was und dann breakt er schon wieder.
Es kann ja eigentlich kein Fehler sein, weil die API Funktion beim normal Ausführen keinen Fehler zurückgibt und normal funktioniert.

gruß
 
einige Exceptions sind "ganz normal". Am schnellsten kannst Du das Problem umgehen, in dem Du unter "Debugging options"->"Exceptions" alle Häckchen anmachst. Sollte es nicht helfen, füge nach so einer Exception diese bei den "Custom Exceptions" ein (oben erwähnter Dialog, "add last")
Was die [] und Addr angeht: das eine gehört zum Assembler, das andere ist ein Macro - bei Problemen benute einfach "original" Anweisungen. Weil Macro bleibt Macro - habe es bei meinem jetztigen Projekt leidlich erfahren müssen, dass diese Macros zwar für die "üblichen" Sachen reichen und hilfreich sind, bei "spezieller" Anwendung aber schon entweder zu "Denkfehlern" führen oder schlichtweg nicht das tun, was sie sollten.
 
Zurück
Oben