Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Cокеты MacOs, accept connection bad file descriptor 
V
    Опции темы
tetuev
Дата 27.11.2013, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 16.10.2013

Репутация: нет
Всего: нет



Код

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#define PORT_NU 7000

int main( int argc, const char * argv[] )
{
  int server;
  int optval;

  
  if( ( server = socket( PF_INET, SOCK_STREAM, 0 ) ) == -1 )
    printf( "oops!! cant create serv socket ((((" );

  // SO_REUSEADDR - enable reuse local adress if it already open
  if( setsockopt( server, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof( optval ) ) == -1 )
    printf( "something happen with set sock opt ((((" );

  struct sockaddr_in address;
  
  address.sin_family = AF_INET;
  address.sin_addr.s_addr = INADDR_ANY;
  address.sin_port = htons( PORT_NU );
  
  if( bind( server, (const struct sockaddr*)&address, sizeof( struct sockaddr_in ) ) == -1 ) {
    printf( "bind error (((((" );
    //close( server );
  }
  
  if( listen( server, 20 ) == -1 ) {
    printf( "error listening socket" );
    //close( server );
  }
  
  int client;

  printf( "%d\n", server );
  
  client = accept(server, 0, 0);
  if( client < 0 )
    perror("Accept connection");

    int bufsize=1024;
    char *buffer=malloc(bufsize);
    while( read( client, buffer, bufsize ) ) {
        if( !strncmp( buffer, "exit", strlen( "exit" ) ) )
           break;
        printf( "%s", buffer );
    }

  close( client );
  close( server );
  return 0;
}


использую setsockopt( server, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof( optval ) )
но при выключении и запуске bind выдает ошибку.
также пробовал писать SO_REUSEPORT
и вместе пробовал использовать - итог один и тот же: bind дает ошибку при повторном запуске.

Подскажите в чем ошибка?

Это сообщение отредактировал(а) tetuev - 27.11.2013, 17:57
PM MAIL   Вверх
feodorv
Дата 28.11.2013, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



А чем инициализирована переменная optval???


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
tetuev
Дата 28.11.2013, 08:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 16.10.2013

Репутация: нет
Всего: нет



упустил из вида (

optval - A pointer to the buffer in which the value for the requested option is specified.

выставил
Код

optval = 1;

и все заработало.

Спасибо.

Это сообщение отредактировал(а) tetuev - 28.11.2013, 08:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.