C⽹络编程socket之connect函数
⽹络编程socket api存在⼀批核⼼接⼝,⽽这⼀批核⼼接⼝就是⼏个看似简单的函数,尽管实际上这些函数没有⼀个是简单。connect函数就是这些核⼼接⼝的⼀个函数,它完成主动连接的过程。
connect函数的功能是完成⼀个有连接协议的连接过程,对于TCP来说就是那个三路握⼿过程,它的函数原型:
#include<sys/socket.h>
#include<sys/types.h>
int connect(int sockfd, const struct sockaddr* server_addr, socklen_t addrlen)
返回:0──成功,-1──失败。
换⼀种写法:
int connect(
SOCKET s, // 没绑定套接⼝描述字
const struct sockaddr FAR *name, // ⽬标地址指针,⽬标地址中必须包含IP和端⼝信息。
int namelen // name的长度
);
为了理解connect函数,我们需要对connect函数的功能进⾏介绍。connect函数的功能可以⽤⼀句话来概括,就是完成⾯向连接的协议的连接过程,它是主要连接的。⾯向连接的协议,在建⽴连接的时候总会有⼀⽅先发送数据,那么谁调⽤了connect谁就是先发送数据的⼀⽅。如此理解connect三个参数是容易了,我必需指定数据发送的地址,同时也必需指定数据从哪⾥发送,这正好是connect的前两个参数,⽽第三个参数是为第⼆个参数服务的。
参数sockfd
指定数据发送的套接字,解决从哪⾥发送的问题。内核需要维护⼤量IO通道,所以⽤户必需通过这个参数告诉内核从哪个IO通
道,此处就是从哪个socket接⼝中发送数据。sockfd是先前socket返回的值。
参数server_addr
指定数据发送的⽬的地,也就是服务器端的地址。这⾥服务器是针对connect说的,因为connect是主动连接的⼀⽅调⽤的,
所以相应的要存在⼀个被连接的⼀⽅,被动连接的⼀⽅需要调⽤listen以接受connect的连接请求,如此被动连接的⼀⽅就是服务器了。
参数addrlen
指定server_addr结构体的长度。我们知道系统中存在⼤量的地址结构,但socket接⼝只是通过⼀个统⼀的结构来指定参数类
型,所以需要指定⼀个长度,以使内核在进⾏参数复制的时候有个有个界限。
与所有的socket⽹络接⼝⼀样,connect总会在某个时候可能失败,此时它会返回-1,相应的errno会被设置,⽤户可能通过这个值确定是哪个错误。常见的错误有对⽅主机不可达或者超时错误,也可以是对⽅主机没有相应的进程在对应端⼝等待。
返回值:没有错误发⽣,返回0;否则返回SOCKET_ERROR。
connect函数可⽤于⾯向连接套接字,也可⽤于⽆连接套接字。
⽆连接套接字:对于⽆连接的套接字(SOCK_DGRAM)
该套接字与⽬标地址之间建⽴默认的对应关系,⽹络数据交互发⽣。可以直接使⽤ send,⽽不是⽤sendto来向该地址发送数据;内核会丢弃所有发送给该套接字的源地址不是connect 地址的报⽂。再次调⽤connect函数:此时name和namelen两个参数均为空指针,就会将该套接字恢复为未连接状态,再调 ⽤send函数,系统会提⽰WSAENOTCONN错误码。
⾯向连接套接字:⾯向连接的套接字(SOCK_STREAM),函数connect会引起调⽤端主动进⾏TCP的三次握⼿过程。结果通常是成功连接、WSAETIMEDOUT(多次发送SYN报⽂,始终未收到回复)、WSAECONNREFUSED(⽬标主机返回TCP-RST)等。
说明:
connect函数将使⽤参数sockfd中的套接字连接到参数serv_addr中指定的服务器。参数addrlen为serv_addr指向的内存空间⼤⼩。
如果参数sockfd的类型为SOCK_DGRAM,serv_addr参数为数据报发往的地址,且将只接收该地址的数据报。如果sockfd的类型为SOCK_STREAM或SOCK_SEQPACKET,调⽤该函数将连接serv_addr中的服务器地址。
错误信息:
EACCES, EPERM:⽤户试图在套接字⼴播标志没有设置的情况下连接⼴播地址或由于防⽕墙策略导致连接失败。
EADDRINUSE:本地地址处于使⽤状态。
网络编程之delphiEAFNOSUPPORT:参数serv_add中的地址⾮合法地址。
EAGAIN:没有⾜够空闲的本地端⼝。
EALREADY:套接字为⾮阻塞套接字,并且原来的连接请求还未完成。EBADF:⾮法的⽂件描述符。
ECONNREFUSED:远程地址并没有处于监听状态。
EFAULT:指向套接字结构体的地址⾮法。
EINPROGRESS:套接字为⾮阻塞套接字,且连接请求没有⽴即完成。EINTR:系统调⽤的执⾏由于捕获中断⽽中⽌。
EISCONN:已经连接到该套接字。
ENETUNREACH:⽹络不可到达。
ENOTSOCK:⽂件描述符不与套接字相关。
ETIMEDOUT:连接超时。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论