мля, getsockname - для локального адреса для удаленного - getpeername теперь всё работает. p.s. ничё, что я тут сам с собой поговорил
dimonn спасибо, теперь узнал намного больше о сокетах Вот если б еще кто-нибудь в подробностях об ioctlsocket или select'е порассуждал (если неправильно написал названия, прошу не пинать - по памяти писал)
Похожая проблема. Забинден сокет, sin_port равен 0, адрес INADDR_ANY. Как узнать номер открытого порта?
Код (Text): #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> extern int errno; int main(int argc, char* argv[]) { struct sockaddr_in local_addr; struct sockaddr_in getsock_addr; socklen_t slen; int listenfd; if ((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0) { printf("[--] error socket %d\n", errno); return -1; } local_addr.sin_family = AF_INET; local_addr.sin_port = 0; local_addr.sin_addr.s_addr = 0; if (bind(listenfd,(struct sockaddr *) &local_addr, sizeof(local_addr))) { printf("[--] error bind %d\n", errno); close(listenfd); return -1; } if (getsockname(listenfd, (struct sockaddr*)&getsock_addr, &slen)) { printf("[--] error getsockname %d\n", errno); close(listenfd); return (-1); } printf("[==] local port: %u\n", ntohs(getsock_addr.sin_port)); close(listenfd); return (0); }
Кто-нибудь может подсказать, где ошибка при определении адреса удалённой машины: Создаю сокет: Код (Text): invoke socket,AF_INET,SOCK_STREAM,0 ;создаём сокет .if eax != INVALID_SOCKET ; если ошибки mov hDcSocket,eax invoke WSAAsyncSelect,eax,HendWnd,WM_SOCKET,FD_ACCEPT or FD_READ or FD_CLOSE; функция указывает Windows посылать сообщения заданному окну от определенного сокета .if eax != INVALID_SOCKET ;проверка на ошибку invoke htons, DcPort; преобразовать номер порта в сетевой порядок байт mov sin.sin_port, ax mov sin.sin_family, AF_INET mov sin.sin_addr, INADDR_ANY invoke bind, hDcSocket, addr sin, sizeof sin ; ассоциировать локальный адрес (представленный в структуре sin) с сокетом .if eax != SOCKET_ERROR invoke listen,hDcSocket, 5 ; устанавливает сокет в состояние, в котором он слушает порт на предмет входящих соединений .if eax != SOCKET_ERROR Обрабатываю сообщение FD_ACCEPT Код (Text): invoke accept,hDcSocket,0,0 mov HendlConnect,eax Пытаюсь узнать удалённый Ip Код (Text): invoke getpeername,HendlConnect,addr sin,sizeof sin И получаю SOCKET_ERROR WSAEFAULT
Плз напишите дальше как достать ИП Делаю Код (Text): mov len,sizeof sin invoke getpeername,hClient,addr sin ,offset len invoke inet_ntoa, offset sin mov eax,[eax+0ah] mov eax,[eax] invoke inet_ntoa,eax invoke wsprintf, addr buf_out1, addr NameIP,eax выводит не тот ип, или вопше вываливается с ошибкой нашёл Код (Text): mov len,sizeof sin invoke getpeername,hClient,addr sin ,offset len invoke inet_ntoa, offset sin mov eax,sin.sin_addr.S_un ; вот ета строка invoke inet_ntoa,eax
Когда получен FD_ACCEPT Код (Text): szFormat1 db "Интернет-соединение с : [ %u.%u.%u.%u ]",0 addrFrom sockaddr_in <?> mov addrFromLen, sizeof addrFrom invoke accept, Socket, ADDR addrFrom, ADDR addrFromLen;0, 0 mov Accept, eax xor eax, eax mov al, addrFrom.sin_addr.S_un.S_un_b.s_b1 mov byte1, eax mov al, addrFrom.sin_addr.S_un.S_un_b.s_b2 mov byte2, eax mov al, addrFrom.sin_addr.S_un.S_un_b.s_b3 mov byte3, eax mov al, addrFrom.sin_addr.S_un.S_un_b.s_b4 mov byte4, eax push byte4 push byte3 push byte2 push byte1 push offset szFormat1 push offset buffer call wsprintf invoke SetWindowText, hWnd, ADDR buffer Когда получен FD_READ Код (Text): invoke accept, [b]wParam[/b] , addr ClientAddress , addr ClientLen push ClientAddress.sin_addr.S_un.S_addr call inet_ntoa ;eax is now a pointer to the ip string ;invoke MessageBox, hDlg, eax, 0, MB_OK