Chinaunix首页 | 论坛 | 博客
  • 博客访问: 565621
  • 博文数量: 104
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1559
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-21 00:58
个人简介

锻炼精神,首先要锻炼肉体

文章分类

全部博文(104)

文章存档

2018年(1)

2016年(1)

2015年(101)

2014年(1)

我的朋友

分类: C/C++

2015-03-26 15:09:56

connect 是用来与指定地址的一端进行通信连接的,这个连接可以分为
TCP 的稳定连接,它是面向字节流的,有着稳妥的确认-收发等一系列安全措施。
如果对数据正确性要求高使用它即可。
UDP 这样的面向数据报的连接方式,它其实是无连接的,网络传输实时性好,
如果对响应时间要求较高的话,建议使用 UDP。

connect 函数多半用于客户端向服务器端发送请求,通过 connect 的参数来指出
发送请求的目的服务器端。

在这里要知道一下几个常用函数和数据结构

1. struct sockaddr_in 
在网络编程中常用来存放通信端的 IP 地址端口号等信息的结构体,描述如下

struct sockaddr_in
{
  unsigned short sin_family ; // 地址类型 AF_INET(首选,常用) ,AF_INET6
  unsigned short int  sin_port ; // 端口号,配合 htons 将主机小端模式编码转为大端模式 
                                                // htons : host to net (short)

   struct in_addr ;                    // IP 地址
  unsigned char  sin_zeor [8] ; // 填充字节 
} ;

在这里,操作系统常为小端模式;通讯协议为大端模式
小端模式是 高位存高位,低位存低位
大端模式是 高位存低位,低位存高位

说道 sockaddr_in 就不得不说一下 sockaddr , 在使用方面通常用 socketaddr_in 来进行赋值操作,
然后通过强制转换的方式将其转为 sockaddr 来作为函数的参数来使用。

2. connect 函数
   #include
    #include
   int conenct ( int sockfd , const struct sockaddr * serv_addr , socket_len addrlen) ;
  参数:
          1. sockfd : 通过调用 socket 函数正确执行后的返回值
          2. serv_addr : 运行 conenct 函数的客户端发送请求的服务端网络地址变量
          3. addrlen : 第 2 个参数服务端网络地址变量的长度

  对于参数 2 的使用是这样的, 通过创建 struct sockaddr_in serv_addr  变量 ,并根据实际应用的   需要为其赋值,
在传入到 connect 函数中的时候 , 因为参数 2 是struct sockaddr 的指针类型
 所以先将 struct sockaddr_in 类型的 serv_addr 取地址 &serv_addr 之后, 强制转换为
 struct sockaddr * 指针类型 ,所以整个过程连起来便是

 struct sockaddr_in serv_addr ;
 .... // initialization
connect (  参数1 ,(struct sockaddr *)(&serv_addr) ,参数3 ) ;
... // other operations 

2. int  inet_aton(const char * string , struct in_addr *addr ) ;
   头文件
   #include
   #include

  这个方法通过名字理解简单一点,就是 ascii 码表示的 IP 地址转换为一个 32 位的网络地址(使用 struct in_addr 来表示)
  也就是 a (ascii ) to n(net)
如果转换正确,那么返回数值 0 ,如果转换失败,返回非零负数
 


编译命令:
 g++ connectTest.cpp -o connectTest

点击(此处)折叠或打开

  1. // connectTest.cpp

  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <unistd.h>
  7. #include <arpa/inet.h>


  8. #include <string.h>


  9. int getSocketDone ()
  10. {
  11.   int ret = socket (AF_INET , SOCK_STREAM , 0) ;
  12.   if ( ret < 0 )
  13.   {
  14.     perror ("failed to create socket fd") ;
  15.     return ret ;
  16.   }
  17.  return ret ;
  18. }

  19. int getConenctDone ( int socket_fd )
  20. {
  21.    struct sockaddr_in serv_addr ;
  22.    int ret ;


  23.    memset ( &serv_addr , 0 , sizeof ( struct sockaddr_in )) ;
  24.    serv_addr.sin_family = AF_INET ;
  25.    serv_addr.sin_port = htons (3699) ;
  26.    
  27.   // transfer ascii 127.0.0.1 into net ip address
  28.   if ( inet_aton("127.0.0.1" , &serv_addr.sin_addr) < 0)
  29.   {
  30.     perror ("fail transfering ascii ip address into 32 bit net ip address") ;
  31.         return -1 ;
  32.   }
  33.  
  34.   // after all done , call connect method
  35.  
  36.  ret = connect ( socket_fd , (struct sockaddr *)(&serv_addr) , sizeof (struct sockaddr_in) );
  37.  if ( ret < 0 )
  38.  {
  39.     perror ("fail to call connect method ") ;
  40.     return ret ;
  41.  }
  42.  
  43.  return ret ;

  44. }


  45. int main ( int c , char ** v )
  46. {
  47.   int ret ;

  48.   if ( ( ret = getSocketDone () ) < 0 )
  49.   {
  50.     printf ("failed to call getSocketDone \n") ;
  51.     return -1 ;
  52.   }

  53.   if (( ret = getConenctDone ( ret ) ) < 0 )
  54.   {
  55.     printf ("failed to call getConnectDone method \n") ;
  56.     return -1 ;
  57.   }

  58.     return 0 ;

  59. }
因为没有创建服务器端,所以并么有获得来自服务器端的回复信息,
所以代码运行的结果便是

fail to call connect method : Connection refused
failed to call getConnectDone method 

阅读(4981) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~