Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Открытие сокета. (https://forum.antichat.xyz/showthread.php?t=107209)

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`и клиентов в отдельном потоке и каждого клиента определяй в отдельный поток.


Время: 05:02