前面介绍了socket
函数获取文件描述符, bind
函数是为了让本地协议与套接字进行绑定, 本节介绍让客户端主动与服务端进行连接的connect
函数.
函数原型
connect
函数建立与TCP服务器的连接.
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen);
成功 : 返回0;
失败 : 返回-1. 并设置errno的值.
-
errno对应的值 :
值 描述 ETIMEDOUT TCP客户端没有收到SYN分节的响应 ECONNREFUSED TCP客户端的SYN响应是RST EHOSTUNREACH/ENETUNREACH 对端不可达 EINTR 被信号等处理打断
函数参数
sockfd
是调用socket函数返回的文件描述addr
要连接的对端的套接字地址结构addrlen
是套接字地址结构的大小
函数调用
in ret;
struct sockaddr_in sockaddr;
bzero(&sockaddr, sizeof(sockaddr)); // 全部填0
sockaddr.sa_family = AF_INET; // 设置域
sockaddr.sin_port = htons(port); // 绑定端口
sockaddr.sin_addr.in_addr = inet_addr(addr); // 绑定地址
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
while(1)
{
ret = connect(sockfd, (struct sockaddr*)&sockaddr_in, sizeof(sockaddr_in));
if(ret < 0)
if(errno == EINTR) // 被其他处理打断重启
continue;
else
EXIT("bind");
break;
}
总结
- 调用connect函数之前一定要调用
socket
函数, 但可以不调用bind
函数将IP或者端口进行绑定,connect
函数会随机绑定一个空闲的端口 - 返回值为-1并不一定是致命错误, 可能是被其他处理打断了.