Открытие сокета.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kuzya, 20 Feb 2009.

  1. Kuzya

    Kuzya Elder - Старейшина

    Joined:
    27 Apr 2008
    Messages:
    166
    Likes Received:
    106
    Reputations:
    30
    Пытаюсь открыть на прослушивание порт 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.
    Заранее благодарен.
     
  2. lll6

    lll6 Elder - Старейшина

    Joined:
    29 Feb 2008
    Messages:
    83
    Likes Received:
    15
    Reputations:
    5
    На счёт sleep - пробуй с подключённым windows.h
     
  3. Maxidrom

    Maxidrom New Member

    Joined:
    4 Feb 2009
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    Компилятор чувствителен к регистру в MSDN описание функции Sleep такое VOID WINAPI Sleep(__in DWORD dwMilliseconds); так что пробуй Sleep. Насчет сокетов проверяй можегт какие ошибки функции возвращают, лгече будет причину найти
     
    #3 Maxidrom, 20 Feb 2009
    Last edited: 20 Feb 2009
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    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);
      }
    
     
    #4 slesh, 20 Feb 2009
    Last edited: 20 Feb 2009
  5. Kuzya

    Kuzya Elder - Старейшина

    Joined:
    27 Apr 2008
    Messages:
    166
    Likes Received:
    106
    Reputations:
    30
    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) поможет, но ошибся. Скажите как убрать эти подвисания.
     
    #5 Kuzya, 20 Feb 2009
    Last edited: 20 Feb 2009
  6. kazaff

    kazaff New Member

    Joined:
    28 Jan 2009
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Ты используешь блокирующий режим, в нём функции recv, send, accept и connect блокируют программу до тех пор, пока не появятся данные в буфере или не подключится клиент. Чтобы избавиться от этого accept`и клиентов в отдельном потоке и каждого клиента определяй в отдельный поток.