ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Открытие сокета.
  #1  
Старый 20.02.2009, 19:24
Kuzya
Участник форума
Регистрация: 27.04.2008
Сообщений: 224
Провел на форуме:
140661

Репутация: 313
По умолчанию Открытие сокета.

Пытаюсь открыть на прослушивание порт 8080 на адресе 127.0.0.1. Использую следующий код:
Код:
WSADATA wsaData;
SOCKET inSocket,outSocket;
sockaddr_in laddr,caddr;
			
laddr.sin_family = AF_INET;
laddr.sin_port = 8080;
laddr.sin_addr.s_addr = inet_addr("127.0.0.1");

WSAStartup(MAKEWORD(2,2), &wsaData);
inSocket = socket(AF_INET,SOCK_STREAM,0);
bind(inSocket,(struct sockaddr*)&laddr,sizeof(laddr));
for(;;) {
	//sleep(300);
	listen(inSocket,10);
	outSocket=accept(inSocket,(sockaddr*)&caddr,(int *)sizeof(caddr));
	}
Всё собирается и запускается без ошибок. Но пробую телнетом коннектится на адрес 127,0,0,1 и порт 8080 - соединения нет. В чём проблема?
И второй вопрос. В коде "sleep(300)" закомментирован т.к. при сборке вылазеет ошибка: "'sleep': identifier not found" - как с этим бороться? В инете нашёл 2 варианта - подключить dos.h или time.h. Ни один из них не помог. Использую VS2008 Express.
Заранее благодарен.
 
Ответить с цитированием

  #2  
Старый 20.02.2009, 19:36
lll6
Познающий
Регистрация: 01.03.2008
Сообщений: 99
Провел на форуме:
613745

Репутация: 51
По умолчанию

На счёт sleep - пробуй с подключённым windows.h
 
Ответить с цитированием

  #3  
Старый 20.02.2009, 19:40
Maxidrom
Новичок
Регистрация: 04.02.2009
Сообщений: 12
Провел на форуме:
18348

Репутация: 0
По умолчанию

Компилятор чувствителен к регистру в MSDN описание функции Sleep такое VOID WINAPI Sleep(__in DWORD dwMilliseconds); так что пробуй Sleep. Насчет сокетов проверяй можегт какие ошибки функции возвращают, лгече будет причину найти

Последний раз редактировалось Maxidrom; 20.02.2009 в 19:45..
 
Ответить с цитированием

  #4  
Старый 20.02.2009, 20:56
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

listen не там поставил )
и в номере порта забыл прогнать через htons
вот код работающий:
Код:
 WSAStartup(MAKEWORD(2,2), &wsaData);
 lsocket = socket(AF_INET, SOCK_STREAM, 0);
 laddr.sin_family = AF_INET;
 laddr.sin_port	= htons(8080); // htons всегда нужен
 laddr.sin_addr.s_addr	= INADDR_ANY; // в моём случая для всех интерфейсов
 if (bind(lsocket,(struct sockaddr*) &laddr, sizeof(laddr))) return -1;
 if (listen(lsocket, 0x100)) return -1; 
 printf("wait for connection...\n");
 while((csocket=accept(lsocket, (struct sockaddr *) &caddr, &caddr_size)))
  {
    вот тут теперь с csocket что хочешь то и делай типа
   send(csocket, buff, strlen(buff), 0);
  }

Последний раз редактировалось slesh; 20.02.2009 в 21:03..
 
Ответить с цитированием

  #5  
Старый 21.02.2009, 00:07
Kuzya
Участник форума
Регистрация: 27.04.2008
Сообщений: 224
Провел на форуме:
140661

Репутация: 313
По умолчанию

slesh, спасибо, всё работает. Maxidrom, действительно из-за регистра не работало =).
Образовалась ещё одна проблема. Читаю данные вот так:
Код:
while((outSocket=accept(inSocket, (struct sockaddr *) &caddr, (int*)sizeof(caddr)))) {
	recv(outSocket,buf,1024,0);
	richTextBox1->Text = buf;
	Sleep(500);
}
Как видите пытаюсь то что пришло на вход поместить в текстовое поле компонента "RichTextBox". Я понимаю что я всё делаю не правильно, т.к. компилятор мне об этом говорит, но как мне преобразовать то что пришло в тип "String", что бы засунуть в текст-бокс (придёт обычный http-запрос)? Переменную buf я объявляю вот так:
Код:
char *buf = new char[1024];
И вторая проблема - программа после запуска зависает (у меня оконный вариант с формой). Думал что Sleep(500) поможет, но ошибся. Скажите как убрать эти подвисания.

Последний раз редактировалось Kuzya; 21.02.2009 в 00:12..
 
Ответить с цитированием

  #6  
Старый 24.02.2009, 16:31
kazaff
Новичок
Регистрация: 28.01.2009
Сообщений: 4
Провел на форуме:
6374

Репутация: 0
По умолчанию

Ты используешь блокирующий режим, в нём функции recv, send, accept и connect блокируют программу до тех пор, пока не появятся данные в буфере или не подключится клиент. Чтобы избавиться от этого accept`и клиентов в отдельном потоке и каждого клиента определяй в отдельный поток.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открытие Mysql базы jumpor PHP, PERL, MySQL, JavaScript 20 26.06.2006 22:17
Открытие файлов и внешние данные. Потенциальная уязвимость php-скриптов k00p3r Чужие Статьи 1 11.07.2005 19:23



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ