@sddvxd

Почему не соединиться с сервером?

section .bss
	wsadata resb 408 ; sizeof(WSADATA)

section .data
	IP0 EQU 188
	IP1 EQU 187
	IP2 EQU 188
	IP3 EQU 179
	
	AF_INET EQU 2
	IPPROTO_TCP EQU 6
	SOCK_STREAM EQU 1
	
	sockaddr_in dd 0, 0, 0, 0 ; 16 bytes : sizeof(SOCKADDR_IN)
	socket dd 0
	
	errorCreatingSocket db "Error creating socket", 0Dh, 0Ah
	errorCreatingSocketLen EQU $-errorCreatingSocket
	
	errorCreatingConnect db "Error creating connect", 0Dh, 0Ah
	errorCreatingConnectLen EQU $-errorCreatingConnect
	
	errorSendingData db "Error sending data", 0Dh, 0Ah
	errorSendingDataLen EQU $-errorSendingData
		
section .text
_start:
	mov al, 2
	mov ah, 2
	push wsadata
	push eax
	call _WSAStartup@8
	test eax, eax
	jnz error
	
	mov byte [sockaddr_in + 1], AF_INET ; sin_family
	mov byte [sockaddr_in + 2], 80 ; sin_port[0]
	mov byte [sockaddr_in + 3], 0 ; sin_port[1]
	
	mov byte [sockaddr_in + 4], IP0
	mov byte [sockaddr_in + 5], IP1
	mov byte [sockaddr_in + 6], IP2   ;IN_ADDR structure
	mov byte [sockaddr_in + 7], IP3
	
	push IPPROTO_TCP
	push SOCK_STREAM
	push AF_INET
	call _socket@12
	mov ebx, errorCreatingSocket
	mov edx, errorCreatingSocketLen
	cmp eax, -1
	je error
	
	mov dword [socket], eax
	
	push 16
	push sockaddr_in
	push dword [socket]
	call _connect@12
	mov ebx, errorCreatingConnect
	mov edx, errorCreatingConnectLen
	cmp eax, -1
	je error
	
	push 0
	push msgRequestLen
	push msgRequest
	push dword [socket]
	call _send@16
	mov ebx, errorSendingData
	mov edx, errorSendingDataLen
	cmp eax, -1
	je error
	
	push 0
	push 8128
	push buffer
	push dword [socket]
	call _recv@16
	
	mov dword [requestLength], eax	

exit:
	push 0
	call _ExitProcess@4


Выполнение программы проходит успешно до вызова _connect@12 - в EAX попадает -1, что свидетельствует об ошибке. LastError показывает WSAEAFNOSUPPORT (адрес не подходит для выбранного семейства адресов). Содержимое памяти по адресу sockaddr_in :

00 02 50 00 bc bb bc b3 00 00 00 00 00 00 00 00
Первые 2 байта указывают на принадлежность сокета к AF_INET, вторые 2 указывают на 80 порт, причем и адрес и порт указаны в big-endian, потому что мой процессор работает с little-endian. В следующих 4 байтах адрес сервера и следующие 8 пустые
Вроде сделал все правильно, подскажите пожалуйста - что может быть не так
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Я смотрю сюда, и сдаётся мне, что начало инициализации sockaddr_in в твоём коде должна выглядеть так:

mov byte [sockaddr_in + 0], AF_INET ; sin_family
mov byte [sockaddr_in + 2], 0 ; sin_port[0] это старший байт sin_port
mov byte [sockaddr_in + 3], 80 ; sin_port[1] а это младший

Т.е. перепутана endianness sin_family и sin_port. sin_addr вроде нормально выглядит.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы