Пытаюсь открыть на прослушивание порт 8080 на адресе 127.0.0.1. Использую следующий код: Code: 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. Заранее благодарен.
Компилятор чувствителен к регистру в MSDN описание функции Sleep такое VOID WINAPI Sleep(__in DWORD dwMilliseconds); так что пробуй Sleep. Насчет сокетов проверяй можегт какие ошибки функции возвращают, лгече будет причину найти
listen не там поставил ) и в номере порта забыл прогнать через htons вот код работающий: Code: 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, спасибо, всё работает. Maxidrom, действительно из-за регистра не работало =). Образовалась ещё одна проблема. Читаю данные вот так: Code: while((outSocket=accept(inSocket, (struct sockaddr *) &caddr, (int*)sizeof(caddr)))) { recv(outSocket,buf,1024,0); richTextBox1->Text = buf; Sleep(500); } Как видите пытаюсь то что пришло на вход поместить в текстовое поле компонента "RichTextBox". Я понимаю что я всё делаю не правильно, т.к. компилятор мне об этом говорит, но как мне преобразовать то что пришло в тип "String", что бы засунуть в текст-бокс (придёт обычный http-запрос)? Переменную buf я объявляю вот так: Code: char *buf = new char[1024]; И вторая проблема - программа после запуска зависает (у меня оконный вариант с формой). Думал что Sleep(500) поможет, но ошибся. Скажите как убрать эти подвисания.
Ты используешь блокирующий режим, в нём функции recv, send, accept и connect блокируют программу до тех пор, пока не появятся данные в буфере или не подключится клиент. Чтобы избавиться от этого accept`и клиентов в отдельном потоке и каждого клиента определяй в отдельный поток.