winsock, где ошибка?

Тема в разделе "WASM.NETWORKS", создана пользователем VuttelVult, 22 сен 2007.

  1. VuttelVult

    VuttelVult New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2007
    Сообщения:
    17
    Вот есть такая процедура (незаконченная). Где ошибка?
    Код (Text):
    1. sock_cnn    proc    near
    2.     invoke  WSAStartup, SOCK_VERSION1_1,offset wsa ;запуск dll
    3.     cmp     eax,0                           ; если ошибка:
    4.     jne     ex                              ;  выходим из пpиложения
    5.     mov     ax,SOCK_VERSION1_1              ; WSAStartup возвpащает веpсию
    6.     cmp     ax,word ptr [wsa.wVersion]      ; пpовеpяем веpсию
    7.     jne       ex                            ; выходим из сокетов и из пpиложения
    8.     invoke  socket, AF_INET, SOCK_STREAM, NULL ;создаем сокет
    9.     cmp      eax,SOCKET_ERROR                ; если ошибка:
    10.     je         ex                               ;  WSACleanup
    11.     mov sock_handle,eax                 ;сохраняем хэндл
    12.     mov sckin.sin_family,NULL           ;тип сокета не указываем
    13.     invoke  htons, Port                     ; получаем номеp поpта в сетевом поpядке байтов
    14.     mov     word ptr [sckin.sin_port],ax    ;и заносим куда надо
    15.     invoke  gethostbyname, offset host      ;получаем хост в сетевом порядке байтов
    16.     cmp     eax,0                           ; если ошибка:
    17.     je         ex                              ;делаем ноги
    18.            mov  eax,dword ptr [eax+0Ch]
    19.     mov eax,dword ptr [eax]
    20.     mov eax,dword ptr [eax]
    21.     mov [dword ptr sckin.sin_addr],eax
    22.     invoke  connect, sock_handle, offset sckin, sizeof sckin    ; тепеpь коннектимся!
    23.     cmp     ax,SOCKET_ERROR                   ; если ошибка:
    24.     je      ex
    25.    ;тут должно быть чтение и запись
    26. ex:
    27.     call    WSACleanup
    28.     ret
    29. sock_cnn    endp
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Какая ошибка?
    А
    вообще интересный фрагмент:))))
     
  3. VuttelVult

    VuttelVult New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2007
    Сообщения:
    17
    wsd
    вот туд у мну и ашибка, как исправить, я имею ввиду, что: как в структуре hostent после ф-ции gethostbyname получить хост?
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    читать MSDN
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    в еах возвратится указатель на struct hostent

    Вам нужно наверное поле h_name
    с Си на АСМ перекинуть наверно сможете
     
  6. VuttelVult

    VuttelVult New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2007
    Сообщения:
    17
    wsd,
    а ок тенкс ща попробую
     
  7. VuttelVult

    VuttelVult New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2007
    Сообщения:
    17
    а как обратится к определенному элементу в структуре?
    gethostbyname возвращает в еах поинтер на структуру, а мне надо только некоторый элемент.
     
  8. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Дублирую ещё MSDN пример
    Код (Text):
    1. /******************************************************************************\
    2. * simplec.c - Simple TCP/UDP client using Winsock 1.1
    3. *
    4. *       This is a part of the Microsoft® Source Code Samples.
    5. *       Copyright 1996 - 2000 Microsoft Corporation.
    6. *       All rights reserved.
    7. *       This source code is only intended as a supplement to
    8. *       Microsoft Development Tools and/or WinHelp® documentation.
    9. *       See these sources for detailed information regarding the
    10. *       Microsoft samples programs.
    11. \******************************************************************************/
    12.  
    13. #define WIN32_LEAN_AND_MEAN
    14. #include <winsock2.h>
    15. #include <stdlib.h>
    16. #include <stdio.h>
    17. #include <string.h>
    18.  
    19. #define DEFAULT_PORT 5001
    20. #define DEFAULT_PROTO SOCK_STREAM // TCP
    21.  
    22. void Usage(char *progname) {
    23.     fprintf(stderr,"Usage\n%s -p [protocol] -n [server] -e [endpoint] \
    24.     -l [iterations]\n",
    25.         progname);
    26.     fprintf(stderr,"Where:\n\tprotocol is one of TCP or UDP\n");
    27.     fprintf(stderr,"\tserver is the IP address or name of server\n");
    28.     fprintf(stderr,"\tendpoint is the port to listen on\n");
    29.     fprintf(stderr,"\titerations is the number of loops to execute\n");
    30.     fprintf(stderr,"\t(-l by itself makes client run in an infinite loop,");
    31.     fprintf(stderr," Hit Ctrl-C to terminate it)\n");
    32.     fprintf(stderr,"Defaults are TCP , localhost and 5001\n");
    33.     WSACleanup();
    34.     exit(1);
    35. }
    36. int main(int argc, char **argv) {
    37.  
    38.     char Buffer[128];
    39.     char *server_name= "localhost";
    40.     unsigned short port = DEFAULT_PORT;
    41.     int retval, loopflag=0;
    42.     int i, loopcount,maxloop=-1;
    43.     unsigned int addr;
    44.     int socket_type = DEFAULT_PROTO;
    45.     struct sockaddr_in server;
    46.     struct hostent *hp;
    47.     WSADATA wsaData;
    48.     SOCKET  conn_socket;
    49.  
    50.     if (argc >1) {
    51.         for(i=1;i <argc;i++) {
    52.             if ( (argv[i][0] == '-') || (argv[i][0] == '/') ) {
    53.                 switch(tolower(argv[i][1])) {
    54.                     case 'p':
    55.                         if (!stricmp(argv[i+1], "TCP") )
    56.                             socket_type = SOCK_STREAM;
    57.                         else if (!stricmp(argv[i+1], "UDP") )
    58.                             socket_type = SOCK_DGRAM;
    59.                         else
    60.                             Usage(argv[0]);
    61.                         i++;
    62.                         break;
    63.  
    64.                     case 'n':
    65.                         server_name = argv[++i];
    66.                         break;
    67.                     case 'e':
    68.                         port = atoi(argv[++i]);
    69.                         break;
    70.                     case 'l':
    71.                         loopflag =1;
    72.                         if (argv[i+1]) {
    73.                             if (argv[i+1][0] != '-')
    74.                                 maxloop = atoi(argv[i+1]);
    75.                         }
    76.                         else
    77.                             maxloop = -1;
    78.                         i++;
    79.                         break;
    80.                     default:
    81.                         Usage(argv[0]);
    82.                         break;
    83.                 }
    84.             }
    85.             else
    86.                 Usage(argv[0]);
    87.         }
    88.     }
    89.    
    90.     if ((retval = WSAStartup(0x202,&wsaData)) != 0) {
    91.         fprintf(stderr,"WSAStartup failed with error %d\n",retval);
    92.         WSACleanup();
    93.         return -1;
    94.     }
    95.    
    96.     if (port == 0){
    97.         Usage(argv[0]);
    98.     }
    99.  
    100.     //
    101.     // Attempt to detect if we should call gethostbyname() or
    102.     // gethostbyaddr()
    103.  
    104.     if (isalpha(server_name[0])) {   /* server address is a name */
    105.         hp = gethostbyname(server_name);
    106.     }
    107.     else  { /* Convert nnn.nnn address to a usable one */
    108.         addr = inet_addr(server_name);
    109.         hp = gethostbyaddr((char *)&addr,4,AF_INET);
    110.     }
    111.     if (hp == NULL ) {
    112.         fprintf(stderr,"Client: Cannot resolve address [%s]: Error %d\n",
    113.             server_name,WSAGetLastError());
    114.         WSACleanup();
    115.         exit(1);
    116.     }
    117.  
    118.     //
    119.     // Copy the resolved information into the sockaddr_in structure
    120.     //
    121.     memset(&server,0,sizeof(server));
    122.     memcpy(&(server.sin_addr),hp->h_addr,hp->h_length);
    123.     server.sin_family = hp->h_addrtype;
    124.     server.sin_port = htons(port);
    125.  
    126.     conn_socket = socket(AF_INET,socket_type,0); /* Open a socket */
    127.     if (conn_socket <0 ) {
    128.         fprintf(stderr,"Client: Error Opening socket: Error %d\n",
    129.             WSAGetLastError());
    130.         WSACleanup();
    131.         return -1;
    132.     }
    133.  
    134.     //
    135.     // Notice that nothing in this code is specific to whether we
    136.     // are using UDP or TCP.
    137.     // We achieve this by using a simple trick.
    138.     //    When connect() is called on a datagram socket, it does not
    139.     //    actually establish the connection as a stream (TCP) socket
    140.     //    would. Instead, TCP/IP establishes the remote half of the
    141.     //    ( LocalIPAddress, LocalPort, RemoteIP, RemotePort) mapping.
    142.     //    This enables us to use send() and recv() on datagram sockets,
    143.     //    instead of recvfrom() and sendto()
    144.  
    145.  
    146.     printf("Client connecting to: %s\n",hp->h_name);
    147.     if (connect(conn_socket,(struct sockaddr*)&server,sizeof(server))
    148.         == SOCKET_ERROR) {
    149.         fprintf(stderr,"connect() failed: %d\n",WSAGetLastError());
    150.         WSACleanup();
    151.         return -1;
    152.     }
    153.  
    154.     // cook up a string to send
    155.     //
    156.     loopcount =0;
    157.     while(1) {
    158.         wsprintf(Buffer,"This is a small test message [number %d]",loopcount++);
    159.         retval = send(conn_socket,Buffer,sizeof(Buffer),0);
    160.         if (retval == SOCKET_ERROR) {
    161.             fprintf(stderr,"send() failed: error %d\n",WSAGetLastError());
    162.             WSACleanup();
    163.             return -1;
    164.         }
    165.         printf("Sent Data [%s]\n",Buffer);
    166.         retval = recv(conn_socket,Buffer,sizeof (Buffer),0 );
    167.         if (retval == SOCKET_ERROR) {
    168.             fprintf(stderr,"recv() failed: error %d\n",WSAGetLastError());
    169.             closesocket(conn_socket);
    170.             WSACleanup();
    171.             return -1;
    172.         }
    173.         //
    174.         // We are not likely to see this with UDP, since there is no
    175.         // 'connection' established.
    176.         //
    177.         if (retval == 0) {
    178.             printf("Server closed connection\n");
    179.             closesocket(conn_socket);
    180.             WSACleanup();
    181.             return -1;
    182.         }
    183.         printf("Received %d bytes, data [%s] from server\n",retval,Buffer);
    184.         if (!loopflag){
    185.             printf("Terminating connection\n");
    186.             break;
    187.         }
    188.         else {
    189.             if ( (loopcount >= maxloop) && (maxloop >0) )
    190.                 break;
    191.         }
    192.     }
    193.     closesocket(conn_socket);
    194.     WSACleanup();
    195. }
     
  9. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    наверно так

    [eax].hostent.имя_поля

    как сделате отпишитись и вместе порадуемся:)
     
  10. VuttelVult

    VuttelVult New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2007
    Сообщения:
    17
    короче люди, дайте ламаку рабочий код-минимум, а я себе сам по исходнику розберусь что-куда, плз.
     
  11. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Нет у меня на АСМ такого:dntknw:
    Только на ся...

    Давайте приаттачте сюда полностью свою работу
    и будем её до ума добивать
     
  12. VuttelVult

    VuttelVult New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2007
    Сообщения:
    17
    wsd,
    ну что вы "вы" да "вы", давайте на "ты", тырнет всё-таки:)

    немного модифицировал код.
    Код (Text):
    1. sock_cnn    proc    near
    2.     invoke  WSAStartup, SOCK_VERSION1_1,offset wsa  ;запуск dll
    3.     cmp     eax,0                   ; если ошибка:
    4.     jne     ex                  ;  выходим из пpиложения
    5.     mov     ax,SOCK_VERSION1_1          ; WSAStartup возвpащает веpсию
    6.     cmp     ax,word ptr [wsa.wVersion]      ; пpовеpяем веpсию
    7.     jne     ex                  ; выходим из сокетов и из пpиложения
    8.     invoke  socket, AF_INET, SOCK_STREAM, NULL  ;создаем сокет
    9.     cmp     eax,SOCKET_ERROR            ; если ошибка:
    10.     je      ex                              ;  WSACleanup
    11.     mov sock_handle,eax             ;сохраняем хэндл
    12.     mov sckin.sin_family,NULL           ;тип сокета не указываем
    13.     invoke  htons, Port             ; получаем номеp поpта в сетевом поpядке байтов
    14.     mov     word ptr [sckin.sin_port],ax        ;и заносим куда надо
    15.     invoke  gethostbyname, offset host      ;получаем хост в сетевом порядке байтов
    16.     cmp     eax,0                   ; если ошибка:
    17.     je      ex                  ;делаем ноги
    18.     mov ax,word ptr [eax].hostent.h_list    ; получаем IP в HOSTENT
    19.     mov word ptr [sckin.sin_addr],ax        ;сохраняем в sockaddr_in
    20.     invoke  connect, sock_handle, offset sckin, sizeof sckin    ; тепеpь коннектимся!
    21.     cmp     ax,SOCKET_ERROR             ; если ошибка:
    22.     je      ex                  ;выходим
    23.     mov esi,offset g_msg            ;в случае удачи выводим мессагу об успехе и выходим
    24.     call    send_str                ;процедура send_str - выводит сообщение в консоль;в esi - поинтер на мессагу
    25. ex:
    26.     call    WSACleanup
    27.     ret
    28. sock_cnn    endp
     
  13. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    ждите
    делаю
     
  14. VuttelVult

    VuttelVult New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2007
    Сообщения:
    17
    жьду))
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    VuttelVult
    Там действительно не сразу поймёшь. Вот код, который делает это:
    Код (Text):
    1.     ${Print} "Resolving $0"
    2.     System::Call "ws2_32.dll::gethostbyname(t r0) i .r2"
    3.     ; $0 is hostent. sizeof = 4*4
    4.     ${Print} "hostent is $2"
    5.     StrCmp  $2 0 done get
    6. get:
    7.     System::Call "*$2(i ., i ., i ., i .r1)"
    8.     System::Call "*$1(i .r0)"
    9.     System::Call "*$0(i .r2)"
    10.     ; get ip as string
    11.     System::Call "ws2_32.dll::inet_ntoa(i r2) t.r0"
    12.     ${Print} "Resolved IP is $0"
    :)

    Правда, это не х86 асм. Но суть такова:
    Код (Text):
    1.   ; eax - result of gethostbyname
    2.   mov  edx,[eax+3*4] ; char**
    3.   mov  ecx,[edx] ; char*
    4.   mov  eax,[ecx] ; addr
    5.   invoke inet_ntoa,eax
    6.   ; eax - "X.X.X.X"
     
  16. VuttelVult

    VuttelVult New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2007
    Сообщения:
    17
    IceStudent, большое тебе человеческое спасибо!)))
     
  17. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Извиняюсь за задержку - ходил за пивом:)
    Я тут передумал и свой Ся вариант тебе перевёл:)
    В архиве также есть RadAsm файл проекта.
    Моя прога просто коннектится по тцп по локалхост к порту 80
    у меня там апач стоит.Если что найдёш наверно эти переменные
    и законнектишся куда надо.
    Тестил всё работает.
     
  18. VuttelVult

    VuttelVult New Member

    Публикаций:
    0
    Регистрация:
    21 сен 2007
    Сообщения:
    17
    wsd, и тебе тенкс большой! смогу лучше разобратся в самом алгоритме))) [​IMG]