Skocz do zawartości

Winsock - jak nasluchiwac na porcie TCP 139 ?


Eternity

Recommended Posts

Chce otworzyc socketa asynchronicznie aby nasluchiwal na porcie 139, ale ciagle wyskakuje mi na funkcji 'listen' - za chiny ludowe nie chce mi ona ruszyc. Ciagle zwraca mi -1... :(
Kod wyglada tak :

#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
#include "resource.h"

#define NET_ERROR       -1
#define WM_TRAY         WM_USER + 100
#define SOCKET_MSG      WM_USER + 200
#define SOCKET_MSG_READ WM_USER + 300

NOTIFYICONDATA      nid;
WORD                sockVer;
WSADATA             wsaData;
SOCKET              listeningSocket;
SOCKADDR_IN         serverInfo;


LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

char szClassName[] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;
char *text;
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, MAKEINTRESOURCE(IDI_ICON1));
    wincl.hIconSm = LoadIcon (NULL, MAKEINTRESOURCE(IDI_ICON1));
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    if (!RegisterClassEx (&wincl))
        return 0;

    hwnd = CreateWindowEx (
           0,
           szClassName,
           "Windows App",
           WS_DISABLED,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           0,
           0,
           HWND_DESKTOP,
           NULL,
           hThisInstance,
           NULL
           );

    /* Make the window visible on the screen */
    //ShowWindow (hwnd, nFunsterStil);

    //socket initialization
    sockVer=MAKEWORD(2,2);
    WSAStartup(sockVer, &wsaData);
    listeningSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(listeningSocket==INVALID_SOCKET) {
        WSACleanup();
        return NET_ERROR;
        }
    serverInfo.sin_family=AF_INET;
    serverInfo.sin_addr.s_addr=INADDR_ANY;
    serverInfo.sin_port=htons(139);
    if ( setsockopt(listeningSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptVal, bOptLen) !=0 )
    {
        sprintf(text,"%d",WSAGetLastError());
        WSACleanup();
        MessageBox(hwnd, text , "Setsockopt sie wysypalo na reuseaddr...", MB_OK);
        return NET_ERROR;
    }
    
    if ( bind(listeningSocket, (SOCKADDR*)&serverInfo, sizeof(SOCKADDR_IN)) != 0 )
    {
        sprintf(text,"%d",WSAGetLastError());
        WSACleanup();
        MessageBox(hwnd, text , "Tym razem nie binduje...", MB_OK);    
        return NET_ERROR;
    }

    if ( listen(listeningSocket, 1) != 0 )
    {
        sprintf(text,"%d",WSAGetLastError());
        WSACleanup();
        MessageBox(hwnd, text , "I znowu ten listen...", MB_OK);    
        return NET_ERROR;
    }

    WSAAsyncSelect(listeningSocket, hwnd, SOCKET_MSG, FD_ACCEPT);

    MessageBox(hwnd, NULL, "Tym razem wszystko ok !", MB_OK);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}
.
.
.

Dalej jest ciag dalszy kodu, al ew tej chwili zupelnie nieistotny.

Wienc o so tu chosi ??? ;)

Link do komentarza
Udostępnij na innych stronach

Oops - zapomnialem... Cos lezy na rzeczy z portem 139 - bo na przykladowo 1039 program rusza... Dlazcego nie da sie otworzyc 139 ? Wiem, ze jest 'systemowym', ale co z tego ?

UPDATE :
zapomnialbym - blad wyskakuje 10022 - najprawdopodobniej chodzi o blad gdzies w strukturze danych socketa badz socket juz nasluchuje.. co nie jest mozliwe :) Juz sil mi zaczyna brakowac do tego cholernego winapi... ;)

UPDATE2:
ok, burak byl w bindzie - doszedlem, ze 139 musi (chyba... ;) byc otwart z opcja SO_REUSEADDR - ale teraz przy bind wyskakuje error 10013 - WSAEACCES... No do jasnego.. jak nasluchiwac na 139 porcie ?! Szlak mnie trafi za chwile... ;)

Link do komentarza
Udostępnij na innych stronach

A wiesz do czego uzywa windows tego portu? Moze poprostu windows ma jakies specjalen zadanie na tym porcie i wymaga od wszystkich co nasluchuja na tym porcie jakis specjalnych rzeczy lub poprostu windows juz nasluchuje na tym porcie a jak wiadomo na tym samym ip i tym samym porcie nei moze byc uruchominonych dwoch programow ktore nasluchuja (serwerow).

ps
to jest WinSock a nie WinAPI ;)

Link do komentarza
Udostępnij na innych stronach

Jakis czas temu zalozylem topic o przechwytywaniu wiadomosci msn przesylanych lan-em. Wlasnie one przychodza portem 139. I owszem, jest on juz otwarty - wlasnie messanger na nim nasluchuje. teoretycznie da sie otworzyc kilka socketow na tym samym adresie (ip+port) - tylko musza miec opcje SO_REUSEADDR. W kazdym badz razie za chiny nie potrafie przechwycic jakiejkolwiek.

Wiec jak nikt nie jest w stanie pomoc - to przechodzimy do planu BETA - czyli sprawdzanie, czy wyskoczylo okienko Messengera z wiadomoscia - jesli tak, sprawdza w nim tekst, jak odpowiada pewnemu wzorcowi - zamyk okno Messengera i pokazuje wlasne :D
Wiec pytanko - tym razem juz czyste WinAPI :P
Czy jest jakies zdarzenie (ktore mozna zarzadac od systemu aby bylo przekazywane do naszego okna), ktore informuje o utworzeniu i wyswietlneiu przez system jakiegokolwiek nowego okna, nie wazne jakiej aplikacji ? Moge zrobic przy pomocy timera sprawdzanie co jakis czas czy jest wyswietlone okno messengera, ale bardziej eleganckim sposobem bedzie wykorzystanie wlasnie takiego systemowego zdarzenia :)

Link do komentarza
Udostępnij na innych stronach

No jak na razie kombinuje z pzreszukiwaniem otwartych okien, jak juz wyczaje jaka nazwe klasy ma to wyswietlajace wiadomosc, FindWindow-em wezme jego hwnd a potem postaram sie wyciagnac wyswietlany tekst (o ile sie uda :) ). Zobaczymy co z tego wyjdzie... :)

UPDATE : qpa... Bede musial jednak zalozyc hooka... :(

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

da sie uzywac portu/wiadomosci messengera innym programem.
w konnekcie jest wtyka kLan, ktora obsluguje wiadomosci po lanie i korzysta wlasnie z messangera w NT i winpopup w systemach 9x. teoretycznie serwis ten musi byc wylaczony, ale mi klan dzialal i z wlaczonym.
o ile sie nie myle ktos pisal tez chyba wtyke do tlena kompatybilna z klanem i jest cos o tym na forum konnekta

Link do komentarza
Udostępnij na innych stronach

shw napisał:
da sie uzywac portu/wiadomosci messengera innym programem.
w konnekcie jest wtyka kLan, ktora obsluguje wiadomosci po lanie i korzysta wlasnie z messangera w NT i winpopup w systemach 9x. teoretycznie serwis ten musi byc wylaczony, ale mi klan dzialal i z wlaczonym.
o ile sie nie myle ktos pisal tez chyba wtyke do tlena kompatybilna z klanem i jest cos o tym na forum konnekta

Cos nie moge znalezc... Przeszukalem tamto forum i nic :(
Moze jakies dokladniejsze info ?

Link do komentarza
Udostępnij na innych stronach

xor napisał:
No jak na razie kombinuje z pzreszukiwaniem otwartych okien, jak juz wyczaje jaka nazwe klasy ma to wyswietlajace wiadomosc, FindWindow-em wezme jego hwnd a potem postaram sie wyciagnac wyswietlany tekst (o ile sie uda :) ). Zobaczymy co z tego wyjdzie... :)

UPDATE : qpa... Bede musial jednak zalozyc hooka... :(

zamiast FindWindow uzyj FindWindowEx albo zrob enumeracje okien podrzednych w systemie

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...