Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   ASM Winsock 1.1 (https://forum.antichat.xyz/showthread.php?t=156442)

Sams 14.11.2009 12:42

ASM Winsock 1.1
 
Всем привет. Изучаю winsock под АСМ, но возникла небольшая проблема. Что только не пробовал, не получается. Решил обратиться к специалистам, то есть к вам ;)
В общем написал самый простейший клиент и сервер без использования окон. Тип соединения - TCP. Коннект клиента к серверу вроде как происходит, ошибку не выдает, но вот не получается отослать данные командой send. Компилятор - MASM32. Очень рассчитываю на вашу помощь.

Server

Цитата:

.386
.model Flat, StdCall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\wsock32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\wsock32.inc
include \masm32\include\windows.inc
.data
wsadata WSADATA <>
mCaption db "Error! Suxx!", 0
mText1 db "Error WSAStartUp", 0
mText2 db "Error2", 0
hSock DWORD ?
hSock2 dd ?
sin sockaddr_in <>
sPort DWORD 6001
sIP db "127.0.0.1", 0
buffer db 1024 dup (0)
mCaption2 db "Woohoo", 0
mText3 db "Connected!", 0

.code
Main:

invoke WSAStartup, 101h, ADDR wsadata
.if eax!=NULL
invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
.endif

invoke socket, AF_INET, SOCK_STREAM, 0
.if eax==INVALID_SOCKET
invoke WSAGetLastError
.endif
mov hSock, eax

invoke htons, sPort
mov sin.sin_port, ax
invoke inet_addr, ADDR sIP
mov sin.sin_addr, eax
mov sin.sin_family, AF_INET

invoke bind, hSock, ADDR sin, sizeof sin
invoke listen, hSock, SOMAXCONN
invoke accept, hSock, NULL, NULL
mov hSock2, eax

datarecv:
invoke recv, hSock2, ADDR buffer, 1024, 0
.if byte ptr buffer=="Q"
invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption2, 0
jmp Quit
.endif

jmp datarecv

Quit:
invoke WSACleanup
invoke ExitProcess, 0
end Main
Client

Цитата:

.386
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\wsock32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\wsock32.inc
include \masm32\include\windows.inc
.data
wsadata WSADATA <>
mCaption db "Error! Suxx!", 0
mText1 db "Error WSAStartUp", 0
mText2 db "Error Connect", 0
mText3 db "Error Send", 0
hSock DWORD ?
hSock2 dd ?
sin sockaddr_in <>
sPort DWORD 6001
sIP db "127.0.0.1", 0
buffer db "Q", 0

.code
Main:

invoke WSAStartup, 101h, ADDR wsadata
.if eax!=NULL
invoke MessageBoxA, 0, ADDR mText1, ADDR mCaption, 0
jmp Quit
.endif

invoke socket, AF_INET, SOCK_STREAM, 0
.if eax==INVALID_SOCKET
invoke WSAGetLastError
jmp Quit
.endif
mov hSock, eax

invoke htons, sPort
mov sin.sin_port, ax
invoke inet_addr, ADDR sIP
mov sin.sin_addr, eax
mov sin.sin_family, AF_INET

invoke connect, hSock, ADDR sin, sizeof sin
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0
jmp Quit
.endif
mov hSock2, eax

invoke send, hSock2, ADDR buffer, sizeof buffer, 0
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0
jmp Quit
.endif

Quit:
invoke closesocket, hSock
invoke WSACleanup
invoke ExitProcess, 0
end Main

slesh 14.11.2009 15:14

Поищи на форуме моего спам бота(micro bot) которого я писал на FASM. Там можеш посмотреть полностью клиентскую часть для работы с winsock. Я делал всё на winsock2 но там также почти.

Sams 14.11.2009 16:42

Проблема решена. Ошибка была в том, что отсылал данные не туда. Не доглядел функцию connect, и какое значение она возвращает. Как говориться: "Пальцем в небо"
Вот собственно ошибка:

Цитата:

invoke connect, hSock, ADDR sin, sizeof sin
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0
jmp Quit
.endif
mov hSock2, eax

invoke send, hSock2, ADDR buffer, sizeof buffer, 0
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0
jmp Quit
.endif
Я отсылал данные на хендл hSock2, который был получен в следствии выполнения функции connect.

Цитата:

mov hSock2, eax
Хотя данная функция возвращает совсем другое значение (видать я перепутал с функцией accept() )

Правильно будет так:

Цитата:

invoke connect, hSock, ADDR sin, sizeof sin
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText2, ADDR mCaption, 0
jmp Quit
.endif

invoke send, hSock, ADDR buffer, sizeof buffer, 0
.if eax==SOCKET_ERROR
invoke MessageBoxA, 0, ADDR mText3, ADDR mCaption, 0
jmp Quit
.endif
Тему можно закрывать.


Время: 06:08