PDA

Просмотр полной версии : Открытие сокета.


Kuzya
20.02.2009, 19:24
Пытаюсь открыть на прослушивание порт 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.
Заранее благодарен.

lll6
20.02.2009, 19:36
На счёт sleep - пробуй с подключённым windows.h

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

slesh
20.02.2009, 20:56
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);
}

Kuzya
21.02.2009, 00:07
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) поможет, но ошибся. Скажите как убрать эти подвисания.

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