网络编程学习——一些辅助函数

1 tcp_connect函数

  创建一个TCP函数并连接到一个服务器。

int tcp_connect( const char *host, const char *serv )
{
  int sockfd, n;
  struct addrinfo hints, *res, *ressave;
  
  bzero( &hints,sizeof( struct addrinfo ) );
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  
  if( ( n = getaddrinfo( host, serv, &hints, &res ) ) != 0 )
  {
    printf( " tcp_connect error for %s, %s: %s ", host, serv, gai_strerror( n ) );
    exit( 1 );
  }
  ressave = res;
  
  do{
    sockfd = socket( res->ai_family, res->ai_socktype, res->ai_protocol );
    if( sockfd < 0 )
      continue; // ignore this one
      
    if( connect( sockfd, res->ai_addr, res->ai_addrlen ) == 0 )
      break; // success
    
    close( sockfd ); // ignore this one
  } while( ( res = res->ai_next ) != NULL );
  
  if( res == NULL ) // errno set from final connect()
  {
    printf( " tcp_connect error for %s, %s ", host, serv );
    exit( 1 );
  }
  
  freeaddrinfo( ressave );
  
  return( sockfd );
}

 

2 tcp_listen函数

int tcp_listen( const char *host, const char *serv, socklen_t *addrlenp )
{
  int listenfd, n;
  const int on = 1;
  struct addrinfo hints, *res, *ressave;
  
  bzero( &hints, sizeof( struct addrinfo ) );
  hints.ad_flags = AI_PASSIVE;
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  
  if( ( n = getaddrinfo( host, serv, &hints, &res ) ) != 0 )
  {
    printf( " tcp_listen error for %s, %s: %s ", host, serv, gai_strerror( n ) );
    exit( 1 );
  }
  ressave = res;
  
  do
  {
    listenfd = socket( res->ai_family, res->ai_socktype, res->ai_protocol );
    if( listenfd < 0 )
      continue;  // error,try next one
      
     setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof( on ) );
     if( bind( listenfd, res->ai_addr, res->ai_addrlen ) == 0 )
       break; // success
       
     close( listenfd );
  } while( ( res = res->ai_net ) != NULL );
  
  if( res == NULL ) // errno from final socket() or bind()
  {
    printf( " tcp_listen error for %s, %s ", host, serv );
    exit( 1 );
  }
  
  listen( listenfd, LISTENQ );
    
  if( addrlenp )
    *addrlenp = res->ai_addrlen; // return size of protocol address
    
  freeaddrinfo( ressave );
  
  return( listenfd );
}

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/2537915/blog/668617

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值