Skocz do zawartości

Winsock - jak nasluchiwac na porcie TCP 139 ?


Recommended Posts

Napisano

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 ??? ;)

Napisano

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... ;)

Napisano

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 ;)

Napisano

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 :)

Napisano

To chiba bedziesz musiał założyc globalnego hooka i przechwytywać komunikaty z tego messengera. Chyba, ze istnieje jakis prostrzy sposób ale jakoś nie przychodzi mi do glowy teraz :P

Napisano

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... :(

  • 2 weeks later...
Napisano

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

Napisano
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 ?

Napisano
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

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...