Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |

14.11.2009, 12:42
|
|
Участник форума
Регистрация: 18.04.2009
Сообщений: 120
Провел на форуме: 435863
Репутация:
80
|
|
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
Последний раз редактировалось Sams; 14.11.2009 в 14:24..
|
|
|

14.11.2009, 15:14
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Поищи на форуме моего спам бота(micro bot) которого я писал на FASM. Там можеш посмотреть полностью клиентскую часть для работы с winsock. Я делал всё на winsock2 но там также почти.
|
|
|

14.11.2009, 16:42
|
|
Участник форума
Регистрация: 18.04.2009
Сообщений: 120
Провел на форуме: 435863
Репутация:
80
|
|
Проблема решена. Ошибка была в том, что отсылал данные не туда. Не доглядел функцию 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.
Хотя данная функция возвращает совсем другое значение (видать я перепутал с функцией 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
Тему можно закрывать.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|