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
-
// connectTest.cpp
-
-
#include <stdio.h>
-
#include <sys/types.h>
-
#include <sys/socket.h>
-
#include <netinet/in.h>
-
#include <unistd.h>
-
#include <arpa/inet.h>
-
-
-
#include <string.h>
-
-
-
int getSocketDone ()
-
{
-
int ret = socket (AF_INET , SOCK_STREAM , 0) ;
-
if ( ret < 0 )
-
{
-
perror ("failed to create socket fd") ;
-
return ret ;
-
}
-
return ret ;
-
}
-
-
int getConenctDone ( int socket_fd )
-
{
-
struct sockaddr_in serv_addr ;
-
int ret ;
-
-
-
memset ( &serv_addr , 0 , sizeof ( struct sockaddr_in )) ;
-
serv_addr.sin_family = AF_INET ;
-
serv_addr.sin_port = htons (3699) ;
-
-
// transfer ascii 127.0.0.1 into net ip address
-
if ( inet_aton("127.0.0.1" , &serv_addr.sin_addr) < 0)
-
{
-
perror ("fail transfering ascii ip address into 32 bit net ip address") ;
-
return -1 ;
-
}
-
-
// after all done , call connect method
-
-
ret = connect ( socket_fd , (struct sockaddr *)(&serv_addr) , sizeof (struct sockaddr_in) );
-
if ( ret < 0 )
-
{
-
perror ("fail to call connect method ") ;
-
return ret ;
-
}
-
-
return ret ;
-
-
}
-
-
-
int main ( int c , char ** v )
-
{
-
int ret ;
-
-
if ( ( ret = getSocketDone () ) < 0 )
-
{
-
printf ("failed to call getSocketDone \n") ;
-
return -1 ;
-
}
-
-
if (( ret = getConenctDone ( ret ) ) < 0 )
-
{
-
printf ("failed to call getConnectDone method \n") ;
-
return -1 ;
-
}
-
-
return 0 ;
-
-
}
因为没有创建服务器端,所以并么有获得来自服务器端的回复信息,
所以代码运行的结果便是
fail to call connect method : Connection refused
failed to call getConnectDone method
阅读(5131) | 评论(0) | 转发(0) |