Форум: Форум C++Разное
Новые темы: 00
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сокеты WinApi
 
 автор: AlMag   (01.10.2008 в 08:53)   письмо автору
 
 

Привет всем. я вот столкнулся с проблемой использования сокетов.
для начала мне надо нучиться читать файл по сети. допустим, у себя же семого. Как это сделать?
А то я нете видел код, но как-то его модифицировать не удается.

Буду очень благодарен.

  Ответить  
 
 автор: ddhvvn   (01.10.2008 в 10:24)   письмо автору
 
   для: AlMag   (01.10.2008 в 08:53)
 

Ну хотя бы привели этот код....

  Ответить  
 
 автор: AlMag   (01.10.2008 в 10:56)   письмо автору
 
   для: ddhvvn   (01.10.2008 в 10:24)
 


// ws2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "winsock2.h"
#include "windows.h"

#define request "GET /b.php HTTP/1.0\r\nHost: www.anotherd.com\r\n\r\n" // HTML запрос
#define MAX_PACKET_SIZE 4096

#define SERVER "127.0.0.1"

int main(int argc, char* argv[])
{
WSADATA ws;
SOCKET s;
sockaddr_in adr;
hostent* hn;
char buff [MAX_PACKET_SIZE];

// Init 
if (WSAStartup (0x202, &ws) != 0)
{
// Error
return -1;
}

// Создаем сокет
if (INVALID_SOCKET == (s = socket (AF_INET, SOCK_STREAM, 0/*IPPROTO_TCP*/) ) )
{
// Error
return -1;
}

// Получаем адрес
DWORD a=inet_addr(SERVER);

if (inet_addr(SERVER)!=INADDR_NONE) adr.sin_addr.S_un.S_addr = inet_addr(SERVER);
else
if (hn=gethostbyname(SERVER)) ((unsigned long *)&adr.sin_addr)[0]=((unsigned long **)hn->h_addr_list)[0][0];
else
{
printf("Invalid adress %s\n", SERVER);
closesocket(s);
WSACleanup();
return -1;
}
adr.sin_family = AF_INET;
//adr.sin_addr.S_un.S_addr = *(DWORD* ) hn->h_addr_list[0];

int port = 80;
adr.sin_port = htons (port);

if (SOCKET_ERROR == connect (s, (sockaddr* )&adr,  sizeof (adr) ))
{
// Error
return -1;
}


if (SOCKET_ERROR == send (s, &request, sizeof (request), 0) )
{
// Error
return -1;
}
int len = recv (s, (char *) &buff, MAX_PACKET_SIZE, 0);

if ( (len == SOCKET_ERROR) || (len == 0) )
{
// Error
return -1;
}

for (int i = 0; i<len; i++)
printf ("%c", buff [i]);

if (SOCKET_ERROR == closesocket (s) )
{
// Error
return -1;
}


getchar();

return 1;

}



я изменил в этом коде кое что. работает, вроде. Скажите, почему я могу изпользовать 80 порт при запущеном апаче, но не могу 135 или, скажем, 990, хотя они открыты?

  Ответить  
 
 автор: AlMag   (01.10.2008 в 20:18)   письмо автору
 
   для: AlMag   (01.10.2008 в 10:56)
 

и еще, почему в многих примерах используются библиотеки

#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

и так далее.

их нету в вижуал студии. их надо специально скачивать для этого?

  Ответить  
 
 автор: AndreyCh   (02.10.2008 в 20:57)   письмо автору
 
   для: AlMag   (01.10.2008 в 20:18)
 

A typical BSD sockets program has a block of #includes near the top like this:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

For Winsock, you don't need any of these. Instead, you just need to include winsock.h. (Or, if you need Winsock 2-specific functionality, winsock2.h.)

для виндов тебе нужен winsock.h
см. - http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

  Ответить  
 
 автор: AlMag   (03.10.2008 в 03:03)   письмо автору
 
   для: AndreyCh   (02.10.2008 в 20:57)
 

да, я так и сделал. оно пишет, что теперь не найден тип in_port_t (который хранится в netdb.h)

если все в винсок, то почему такая ошибка?

P. S. ws2_32.lib и wsock32.lib подключил

  Ответить  
 
 автор: GeorgeIV   (03.10.2008 в 17:30)   письмо автору
 
   для: AlMag   (03.10.2008 в 03:03)
 

скорей всего его можно просто переопределить
а лучше найти примеры для Винды

  Ответить  
 
 автор: AlMag   (04.10.2008 в 18:07)   письмо автору
 
   для: GeorgeIV   (03.10.2008 в 17:30)
 

У меня получилось, спасибо. Только проблема в том, что клиент как бы общается с сервером, а мне нужно, что бы много клиентов можно было подключить к серверу.
как такие параллельный потоки создать?

  Ответить  
 
 автор: GeorgeIV   (06.10.2008 в 13:34)   письмо автору
 
   для: AlMag   (04.10.2008 в 18:07)
 

http://www.citforum.ru/book/cook/winsock.shtml

  Ответить  
 
 автор: AlMag   (07.10.2008 в 14:37)   письмо автору
 
   для: GeorgeIV   (06.10.2008 в 13:34)
 

Спасибо, сейчас почитаю.

Ну а вообще принцып работы сервера какой? он ждет соединение с клиентом. когда таковое произошло - создает паралельный процесс для его обработки, а сам возвращается в исходную позицию ожидания?

  Ответить  
 
 автор: GeorgeIV   (08.10.2008 в 18:57)   письмо автору
 
   для: AlMag   (07.10.2008 в 14:37)
 

Приблизительно так. А вообще реализаций серверов туева куча даже в SDK. Разбираться и разбираться.

  Ответить  
 
 автор: AlMag   (09.10.2008 в 15:48)   письмо автору
 
   для: GeorgeIV   (08.10.2008 в 18:57)
 

уже понемногу начинаю понимать. спасибо большое за пример. пока идет активный кодинг, спрошу еще пару вопросов, если не разберусь...

  Ответить  
 
 автор: GeorgeIV   (13.10.2008 в 18:40)   письмо автору
 
   для: AlMag   (09.10.2008 в 15:48)
 

Ок, я все таки написал прокси и даже многопоточный.

  Ответить  
 
 автор: AlMag   (18.10.2008 в 21:57)   письмо автору
 
   для: GeorgeIV   (13.10.2008 в 18:40)
 

о, подскажите, каким окном делают главное окно в чате? "static"? или другим?

  Ответить  
 
 автор: GeorgeIV   (20.10.2008 в 10:14)   письмо автору
 
   для: AlMag   (18.10.2008 в 21:57)
 

Обычным :-)
Через создание класса окна, его регистрацию и создание самого окна.

  Ответить  
 
 автор: AlMag   (20.10.2008 в 17:26)   письмо автору
 
   для: GeorgeIV   (20.10.2008 в 10:14)
 

не понял. это отдельное свое окно писать или делать как элемент окна? статик или эдитор, например.

  Ответить  
 
 автор: GeorgeIV   (22.10.2008 в 10:01)   письмо автору
 
   для: AlMag   (20.10.2008 в 17:26)
 

Если делаете элемент окна, то должно быть и само окно

  Ответить  
 
 автор: AlMag   (22.10.2008 в 19:13)   письмо автору
 
   для: GeorgeIV   (22.10.2008 в 10:01)
 

ну это понятно) главное окно содержит кнопки "Сказать", "Выйти", "Коннектиться" (все "button"), есть поле ввода сообщения ("edit") и это главное окно, куда все отображается ("не знаю, какого типа")
Это меня интересует

  Ответить  
 
 автор: GeorgeIV   (23.10.2008 в 12:48)   письмо автору
 
   для: AlMag   (22.10.2008 в 19:13)
 

Для таких случаев я писал свое окно "Memo", но можно использовать и STATIC, оно тоже вроде позволяет многострочный ввод, или RICHEDIT

  Ответить  
 
 автор: AlMag   (24.10.2008 в 08:59)   письмо автору
 
   для: GeorgeIV   (23.10.2008 в 12:48)
 

я не совсем понимаю, как это выглядит. можете шаблон показать?

  Ответить  
 
 автор: GeorgeIV   (24.10.2008 в 09:50)   письмо автору
 
   для: AlMag   (24.10.2008 в 08:59)
 

ты реализуй для начала хотя бы вывод в STATIC, если все остальное будет работать, поменять статик на что то другое уже проще простого.
"Шаблон" класса мемо нереально показать здесь, это большой класс, с возможностью смены цвета, шрифта, размера, переноса строк по словам и т.п. Сам класс тоже наследуется от моего класса "окно" и применяется сабклассинг. Можно все это и на MFC замутить, но мне проще на своих компонентах, быстрее, компактнее, понятнее и практика хорошая

  Ответить  
 
 автор: AlMag   (24.10.2008 в 15:54)   письмо автору
 
   для: GeorgeIV   (24.10.2008 в 09:50)
 

я уже сделал типа Статик, осталось только конечные автоматы написать, что бы запросы обрабатывались на переименование, например. есть ссылка, что бы я мог освоить?
Вот, на MFC мне как раз не надо, чистое WinApi.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования