Спасайте. WSAStartup()

Тема в разделе "WASM.NETWORKS", создана пользователем Anvil, 12 июл 2008.

  1. Anvil

    Anvil New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2008
    Сообщения:
    24
    Всё не как не могу втыкнуть что и как. День провозился чтоб понять как открыть сокет, с этим справился. Но прочитать не как не могу. Дайте пожалуйста очень примитивный пример клиент сервера. Только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше, тк если много действий я не могу понять что к чему. Заранее спасибо.
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Anvil
    легко ищется следующий исходник с примером использования сокетов:

    Код (Text):
    1. #include <windows.h>
    2. #include <winsock.h>
    3. #include <stdio.h>
    4.  
    5. WSADATA ws;
    6. SOCKET s;
    7. struct sockaddr_in addr;
    8. hostent *d_addr;
    9. char text[1024];
    10.  
    11. int main()
    12. {
    13. // инициализируем сокеты
    14.  if (FAILED WSAStartup (MAKEWORD( 1,1 ), &ws))){
    15.   printf("Error in WSAStartup(...)\n");
    16.   return 1;
    17.  }
    18. // создаем сокет
    19.  s = socket (AF_INET, SOCK_STREAM, 0);
    20.  if (s == INVALID_SOCKET) {
    21.   printf("Error in socket(...)\n");
    22.   return 1;
    23.  }
    24. // получаем адрес сервера
    25.  d_addr = gethostbyname ("smtp.mail.ru");
    26.  if (d_addr==NULL) {
    27.   printf("Error in gethostbyname(...)\n");
    28.   return 1;
    29.  }
    30. // заполняем параметры адреса
    31.  addr.sin_family = AF_INET;
    32.  addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
    33.  addr.sin_port = htons (25);
    34. // устанавливаем соединение
    35.  if (SOCKET_ERROR == (connect (s, (sockaddr *) &addr, sizeof (addr)))) {
    36.   printf("Error in connect(...)\n");
    37.   return 1;
    38.  }
    39. // ждем ответ от сервера
    40.  recv(s,text,sizeof(text),0);
    41.  printf("recv - %s", text);
    42. // приветствуем сервер
    43.  strcpy(text,"HELO smtp.mail.ru\r\n");
    44.  send(s,text,strlen(text),0);
    45.  printf("send - %s", text);
    46. // ждем подтверждение от сервера
    47.  recv(s,text,sizeof(text),0);
    48.  printf("recv - %s", text);
    49. // начинаем отправлять конверт состоящий из полей
    50. // MAIL FROM: и RCPT TO: После каждого поля ждем
    51. // подтверждение
    52. // сообщаем отправителя
    53.  strcpy(text,"MAIL FROM: sender@mail.ru\r\n");
    54.  send(s,text,strlen(text),0);
    55.  printf("send - %s", text);
    56. // ждем подтверждение от сервера
    57.  recv(s,text,sizeof(text),0);
    58.  printf("recv - %s", text);
    59. // сообщаем получателя
    60.  strcpy(text,"RCPT TO: receiver@mtu-net.ru\r\n");
    61.  send(s,text,strlen(text),0);
    62.  printf("send - %s", text);
    63. // ждем подтверждение от сервера
    64.  recv(s,text,sizeof(text),0);
    65.  printf("recv - %s", text);
    66. // подаем команду, что готовы начать передачу письма
    67.  strcpy(text,"DATA\r\n");
    68.  send(s,text,strlen(text),0);
    69.  printf("send - %s", text);
    70. // ждем подтверждение от сервера
    71.  recv(s,text,sizeof(text),0);
    72.  printf("recv - %s", text);
    73. // передаем заголовок
    74. // от кого письмо
    75.  strcpy(text,"FROM: sender@mail.ru\r\n");
    76.  send(s,text,strlen(text),0);
    77.  printf("send - %s", text);
    78. // кому письмо
    79.  strcpy(text,"TO: receiver@mtu-net.ru\r\n");
    80.  send(s,text,strlen(text),0);
    81.  printf("send - %s", text);
    82. // тема письма
    83.  strcpy(text,"SUBJECT: test\r\n");
    84.  send(s,text,strlen(text),0);
    85.  printf("send - %s", text);
    86. // текст письма
    87.  strcpy(text,"Hi!\nIt is a message for you\n");
    88.  send(s,text,strlen(text),0);
    89.  printf("send - %s", text);
    90. // говорим, что закончили
    91.  strcpy(text,"\r\n.\r\n");
    92.  send(s,text,strlen(text),0);
    93.  printf("send - %s", text);
    94.  recv(s,text,sizeof(text),0);
    95.  printf("recv - %s", text);
    96. // прощаемся с сервером
    97.  strcpy(text,"QUIT");
    98.  send(s,text,strlen(text),0);
    99.  printf("send - %s", text);
    100. // закрываем сокет
    101.  closesocket(s);
    102.  return 0;
    103. }
     
  3. Anvil

    Anvil New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2008
    Сообщения:
    24
    1) С С++ у меня по этой теме нет вопросов, там нет нечего сложного.
    2) Мне на асм надо.
    3) Я же просил "только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше". А тут целый пример по работе с почтой.
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    http://wasm.ru/srclist.php?list=5
     
  5. Anvil

    Anvil New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2008
    Сообщения:
    24
    2FED:
    1) Я там был.
    2) Прочитай то что я прошу. "Только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше, тк если много действий я не могу понять что к чему." Разве там есть это?

    P.S. MASM
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Вот достаточно простенько
    http://wasm.ru/src/5/winsock0.asm
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Anvil
    Неужели ты не можешь удалить из сорца все, что вызвано до send??? Неужели это такая проблема?????? Так ты долго будешь учиться, если не отличаешь сетевую функцию от к примеру printf
     
  8. Anvil

    Anvil New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2008
    Сообщения:
    24
    2FED: Спасибо, но немного не то.
    MSoft: А неужели ты так слеп что не видел что я написал? "1) С С++ у меня по этой теме нет вопросов, там нет нечего сложного."
    Насчёт долго не долго, это уже мои проблемы. У меня загвостка именно в этом.

    Я прошу, не пишите здесь нечего что я не просил. Я просил конкретный пример: "только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше"
    Код (Text):
    1.             invoke WSAStartup,101h,addr wsadata
    2.             invoke socket,AF_INET,SOCK_STREAM,0
    3.             mov sock,eax
    4.             mov sin.sin_family,AF_INET
    5.             invoke htons,Port
    6.             mov sin.sin_port,ax
    7.             mov sin.sin_addr,INADDR_ANY            
    8.             invoke bind, sock,addr sin,sizeof sin
    9.             invoke listen,sock,15
    Вот на этом куске я и заглох.
    Сокет открыл а прочитать не могу. Из за этого и прошу пример "только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше". Если кто может, напишите его. А не гоняйте по ссылкам и чужим исходникам.
     
  9. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Anvil
    Когда-то делал примеры общения клиента с сервером, привожу выдранный кусок)
    сервер
    Код (Text):
    1.         .486
    2.         .model  flat, stdcall
    3.         option  casemap: none
    4.         .nolist
    5. include     windows.inc
    6. include     kernel32.inc
    7. include     ws2_32.inc
    8.         .listall
    9. includelib  kernel32.lib
    10. includelib  ws2_32.lib
    11.         .data
    12. sa      dw  AF_INET
    13.         db  17h, 70h
    14.         db  127, 0, 0, 1
    15.         dq  0
    16. nowsa       db  "Windows Sockets cannot be initialized", 0
    17. rerr        db  "Error while receiving", 0
    18. wrongsock   db  "Wrong socket", 0
    19. ack     db  "ok", 0
    20.         align   dword
    21. sock        dd  ?
    22. STDOUT      dd  ?
    23. wsadata     WSADATA <?>
    24. unused      dd  ?
    25.         .code
    26. ; вывод ASCIIZ-строки на консоль
    27. prints      proc    ps: dword
    28.         push    edi
    29.         mov edi, ps
    30.         xor eax, eax
    31.         xor ecx, ecx
    32.         dec ecx
    33.       repnz scasb
    34.         inc ecx
    35.         not ecx
    36.         invoke  WriteConsole, STDOUT, ps, ecx, offset unused, 0
    37.         pop edi
    38.         ret
    39. prints      endp
    40. ; слушает порт 1770h. получает в качестве пар-ра сокет, с которого читают и передают
    41. ; данные. Закрытие этого сокета означает разрыв соединения
    42. acc1        proc    s: dword
    43. HOWMANY     equ 10
    44.         local   buf[HOWMANY]: byte
    45.         push    edi
    46.         lea edi, buf
    47.         invoke  recv, s, edi, HOWMANY, 0
    48.         cmp eax, 10
    49.         je  @F
    50.         mov edi, offset rerr
    51. @@:     invoke  prints, edi
    52.         invoke  send, s, offset ack, 3, 0
    53.         invoke  closesocket, s
    54.         pop edi
    55.         ret
    56. acc1        endp
    57.         ; инициализация
    58. @:      invoke  GetStdHandle, STD_OUTPUT_HANDLE
    59.         mov STDOUT, eax
    60.         invoke  WSAStartup, 2, offset wsadata
    61.         test    eax, eax
    62.         jz  @wsaok
    63.         invoke  prints, offset nowsa
    64.         invoke  ExitProcess, 0
    65. @wsaok:     invoke  socket, AF_INET, SOCK_STREAM, IPPROTO_TCP           ; создаём сокет. Этот сокет нужен только чтоб слушать, реально данные по нему передаваться не будут
    66.         mov sock, eax
    67.         invoke  setsockopt, eax, SOL_SOCKET, SO_REUSEADDR, offset sa, 4
    68.         invoke  bind, sock, offset sa, 16
    69.         invoke  listen, sock, SOMAXCONN
    70.         invoke  accept, sock, 0, 0  ; принимаем клиента. Вот эта функция возвращает тот сокет, через который можно обмениваться данными с клиентом
    71.         cmp eax, INVALID_SOCKET
    72.         jnz @sockok
    73.         invoke  prints, offset wrongsock
    74.         jmp @F
    75.         ; Вызываем функцию, которая и будет обмениваться данными
    76. @sockok:    invoke  acc1, eax
    77. @@:     invoke  closesocket, sock   ; прекращаем слушать, закрывая слушающий сокет
    78.         invoke  WSACleanup
    79.         invoke  ExitProcess, 0
    80.         end @
    клиент
    Код (Text):
    1.         .486
    2.         .model  flat, stdcall
    3.         option  casemap: none
    4.         .nolist
    5. include     windows.inc
    6. include     kernel32.inc
    7. include     ws2_32.inc
    8.         .listall
    9. includelib  kernel32.lib
    10. includelib  ws2_32.lib
    11.         .data
    12. sa      dw  AF_INET
    13.         db  17h, 70h
    14.         db  127, 0, 0, 1
    15.         db  8 dup (0)
    16. nowsa       db  "Windows Sockets cannot be initialized", 0
    17. noserver    db  "Cannot connect to server", 0
    18. what        db  "All is OK", 0
    19. HOWMANY     equ 10
    20.         align   dword
    21. STDOUT      dd  ?
    22. wsadata     WSADATA <?>
    23. unused      dd  ?
    24.         .code
    25. ; Процедура вывода ASCIIZ-строки на консоль
    26. prints      proc    ps: dword
    27.         push    edi
    28.         mov edi, ps
    29.         xor eax, eax
    30.         xor ecx, ecx
    31.         dec ecx
    32.       repnz scasb
    33.         inc ecx
    34.         not ecx
    35.         invoke  WriteConsole, STDOUT, ps, ecx, offset unused, 0
    36.         pop edi
    37.         ret
    38. prints      endp
    39.         ; инициализация
    40. @:      invoke  GetStdHandle, STD_OUTPUT_HANDLE
    41.         mov STDOUT, eax
    42.         invoke  WSAStartup, 2, offset wsadata
    43.         test    eax, eax
    44.         jz  @wsaok
    45.         ; неудачно
    46.         invoke  prints, offset nowsa
    47.         invoke  ExitProcess, 0
    48. @wsaok:     invoke  socket, AF_INET, SOCK_STREAM, IPPROTO_TCP
    49.         mov ebx, eax
    50.         ; соединяемся
    51.         invoke  connect, eax, offset sa, 16
    52.         test    eax, eax
    53.         jz  @connected
    54.         ; если не удалось
    55.         invoke  prints, offset noserver
    56.         jmp @closure
    57.         ; передаём
    58. @connected: invoke  send, ebx, offset what, HOWMANY, 0
    59.         ; принимаем
    60.         invoke  recv, ebx, offset what, 3, 0
    61.         ; чё приняли
    62.         invoke  prints, offset what
    63.         ; и пока-пока, сервер
    64. @closure:   invoke  closesocket, ebx
    65.         invoke  WSACleanup
    66.         invoke  ExitProcess, 0
    67.         end @
    И не горячитесь, а вопросы задавайте, где чего непонятно. Вы до listen дошли, а дальше по логике должен быть accept. В общем, изучайте. Удачи :)