Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Cокеты MacOs


Автор: tetuev 27.11.2013, 17:56
Код

#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 дает ошибку при повторном запуске.

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

Автор: feodorv 28.11.2013, 00:41
А чем инициализирована переменная optval???

Автор: tetuev 28.11.2013, 08:15
упустил из вида (

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

выставил
Код

optval = 1;

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

Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)