Всё не как не могу втыкнуть что и как. День провозился чтоб понять как открыть сокет, с этим справился. Но прочитать не как не могу. Дайте пожалуйста очень примитивный пример клиент сервера. Только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше, тк если много действий я не могу понять что к чему. Заранее спасибо.
Anvil легко ищется следующий исходник с примером использования сокетов: Код (Text): #include <windows.h> #include <winsock.h> #include <stdio.h> WSADATA ws; SOCKET s; struct sockaddr_in addr; hostent *d_addr; char text[1024]; int main() { // инициализируем сокеты if (FAILED WSAStartup (MAKEWORD( 1,1 ), &ws))){ printf("Error in WSAStartup(...)\n"); return 1; } // создаем сокет s = socket (AF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { printf("Error in socket(...)\n"); return 1; } // получаем адрес сервера d_addr = gethostbyname ("smtp.mail.ru"); if (d_addr==NULL) { printf("Error in gethostbyname(...)\n"); return 1; } // заполняем параметры адреса addr.sin_family = AF_INET; addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr); addr.sin_port = htons (25); // устанавливаем соединение if (SOCKET_ERROR == (connect (s, (sockaddr *) &addr, sizeof (addr)))) { printf("Error in connect(...)\n"); return 1; } // ждем ответ от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text); // приветствуем сервер strcpy(text,"HELO smtp.mail.ru\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); // ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text); // начинаем отправлять конверт состоящий из полей // MAIL FROM: и RCPT TO: После каждого поля ждем // подтверждение // сообщаем отправителя strcpy(text,"MAIL FROM: sender@mail.ru\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); // ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text); // сообщаем получателя strcpy(text,"RCPT TO: receiver@mtu-net.ru\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); // ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text); // подаем команду, что готовы начать передачу письма strcpy(text,"DATA\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); // ждем подтверждение от сервера recv(s,text,sizeof(text),0); printf("recv - %s", text); // передаем заголовок // от кого письмо strcpy(text,"FROM: sender@mail.ru\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); // кому письмо strcpy(text,"TO: receiver@mtu-net.ru\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); // тема письма strcpy(text,"SUBJECT: test\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); // текст письма strcpy(text,"Hi!\nIt is a message for you\n"); send(s,text,strlen(text),0); printf("send - %s", text); // говорим, что закончили strcpy(text,"\r\n.\r\n"); send(s,text,strlen(text),0); printf("send - %s", text); recv(s,text,sizeof(text),0); printf("recv - %s", text); // прощаемся с сервером strcpy(text,"QUIT"); send(s,text,strlen(text),0); printf("send - %s", text); // закрываем сокет closesocket(s); return 0; }
1) С С++ у меня по этой теме нет вопросов, там нет нечего сложного. 2) Мне на асм надо. 3) Я же просил "только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше". А тут целый пример по работе с почтой.
2FED: 1) Я там был. 2) Прочитай то что я прошу. "Только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше, тк если много действий я не могу понять что к чему." Разве там есть это? P.S. MASM
Anvil Неужели ты не можешь удалить из сорца все, что вызвано до send??? Неужели это такая проблема?????? Так ты долго будешь учиться, если не отличаешь сетевую функцию от к примеру printf
2FED: Спасибо, но немного не то. MSoft: А неужели ты так слеп что не видел что я написал? "1) С С++ у меня по этой теме нет вопросов, там нет нечего сложного." Насчёт долго не долго, это уже мои проблемы. У меня загвостка именно в этом. Я прошу, не пишите здесь нечего что я не просил. Я просил конкретный пример: "только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше" Код (Text): invoke WSAStartup,101h,addr wsadata invoke socket,AF_INET,SOCK_STREAM,0 mov sock,eax mov sin.sin_family,AF_INET invoke htons,Port mov sin.sin_port,ax mov sin.sin_addr,INADDR_ANY invoke bind, sock,addr sin,sizeof sin invoke listen,sock,15 Вот на этом куске я и заглох. Сокет открыл а прочитать не могу. Из за этого и прошу пример "только чтоб отправлял скажем "Hello word!" и сервер принемал его и нечего больше". Если кто может, напишите его. А не гоняйте по ссылкам и чужим исходникам.
Anvil Когда-то делал примеры общения клиента с сервером, привожу выдранный кусок) сервер Код (Text): .486 .model flat, stdcall option casemap: none .nolist include windows.inc include kernel32.inc include ws2_32.inc .listall includelib kernel32.lib includelib ws2_32.lib .data sa dw AF_INET db 17h, 70h db 127, 0, 0, 1 dq 0 nowsa db "Windows Sockets cannot be initialized", 0 rerr db "Error while receiving", 0 wrongsock db "Wrong socket", 0 ack db "ok", 0 align dword sock dd ? STDOUT dd ? wsadata WSADATA <?> unused dd ? .code ; вывод ASCIIZ-строки на консоль prints proc ps: dword push edi mov edi, ps xor eax, eax xor ecx, ecx dec ecx repnz scasb inc ecx not ecx invoke WriteConsole, STDOUT, ps, ecx, offset unused, 0 pop edi ret prints endp ; слушает порт 1770h. получает в качестве пар-ра сокет, с которого читают и передают ; данные. Закрытие этого сокета означает разрыв соединения acc1 proc s: dword HOWMANY equ 10 local buf[HOWMANY]: byte push edi lea edi, buf invoke recv, s, edi, HOWMANY, 0 cmp eax, 10 je @F mov edi, offset rerr @@: invoke prints, edi invoke send, s, offset ack, 3, 0 invoke closesocket, s pop edi ret acc1 endp ; инициализация @: invoke GetStdHandle, STD_OUTPUT_HANDLE mov STDOUT, eax invoke WSAStartup, 2, offset wsadata test eax, eax jz @wsaok invoke prints, offset nowsa invoke ExitProcess, 0 @wsaok: invoke socket, AF_INET, SOCK_STREAM, IPPROTO_TCP ; создаём сокет. Этот сокет нужен только чтоб слушать, реально данные по нему передаваться не будут mov sock, eax invoke setsockopt, eax, SOL_SOCKET, SO_REUSEADDR, offset sa, 4 invoke bind, sock, offset sa, 16 invoke listen, sock, SOMAXCONN invoke accept, sock, 0, 0 ; принимаем клиента. Вот эта функция возвращает тот сокет, через который можно обмениваться данными с клиентом cmp eax, INVALID_SOCKET jnz @sockok invoke prints, offset wrongsock jmp @F ; Вызываем функцию, которая и будет обмениваться данными @sockok: invoke acc1, eax @@: invoke closesocket, sock ; прекращаем слушать, закрывая слушающий сокет invoke WSACleanup invoke ExitProcess, 0 end @ клиент Код (Text): .486 .model flat, stdcall option casemap: none .nolist include windows.inc include kernel32.inc include ws2_32.inc .listall includelib kernel32.lib includelib ws2_32.lib .data sa dw AF_INET db 17h, 70h db 127, 0, 0, 1 db 8 dup (0) nowsa db "Windows Sockets cannot be initialized", 0 noserver db "Cannot connect to server", 0 what db "All is OK", 0 HOWMANY equ 10 align dword STDOUT dd ? wsadata WSADATA <?> unused dd ? .code ; Процедура вывода ASCIIZ-строки на консоль prints proc ps: dword push edi mov edi, ps xor eax, eax xor ecx, ecx dec ecx repnz scasb inc ecx not ecx invoke WriteConsole, STDOUT, ps, ecx, offset unused, 0 pop edi ret prints endp ; инициализация @: invoke GetStdHandle, STD_OUTPUT_HANDLE mov STDOUT, eax invoke WSAStartup, 2, offset wsadata test eax, eax jz @wsaok ; неудачно invoke prints, offset nowsa invoke ExitProcess, 0 @wsaok: invoke socket, AF_INET, SOCK_STREAM, IPPROTO_TCP mov ebx, eax ; соединяемся invoke connect, eax, offset sa, 16 test eax, eax jz @connected ; если не удалось invoke prints, offset noserver jmp @closure ; передаём @connected: invoke send, ebx, offset what, HOWMANY, 0 ; принимаем invoke recv, ebx, offset what, 3, 0 ; чё приняли invoke prints, offset what ; и пока-пока, сервер @closure: invoke closesocket, ebx invoke WSACleanup invoke ExitProcess, 0 end @ И не горячитесь, а вопросы задавайте, где чего непонятно. Вы до listen дошли, а дальше по логике должен быть accept. В общем, изучайте. Удачи