在一个指定的套接字上创建连接,要用到一个叫connect()的函数,该函数原型是:
#include
#include
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t, addrlen);
sockfd是由socket()函数创建的套接字,如果这个套接字的类型是SOCK_STREAM(TCP流),那么connect函数用于向服务器发出连接请求,服务器IP地址和端口号由参数serv_addr制定;如果套接字类型是SOCK_DGRAM(UDP数据报),那么connect函数就不会建立连接了(不会建立真正的连接),而是直接告诉内核套接字通信的对方IP地址,也就是serv_addr参数的值,对于这一类套接字调用connect函数有一个好处就是:一旦连接后,发送和接受数据时不用每次确定对方地址(SO?速度快效率高呗!)
TCP和UDP两种不同的套接字在建立连接时有两个截然不同的习惯:前者一般只调用一次connect函数,而后者则可以多次调用connect函数,目的是为了改变目的地的地址,后者可以利用serv_addr参数中的sa_family改变为AF_UNSPEC来解除绑定。
connect函数成功调用后,返回0,错误依然返回-1,而错误代码也依然会存入errno中。
connect函数的实例:
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(struct sockaddr_in)); /*将serv_addr的各个字段清零*/
serv_addr.sin_family = AF_INET; /*使用IPv4的TCP/IP协议*/
serv_addr.sin_port = htons(80); /*端口号为80*/
if(inet_aton("202.96.134.133", &serv_addr.sin_addr) < 0){
perror("INET Error!\n");
exit(-1);
}
if(connect(sock_fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in)) < 0){
perror("Connect Error!\n");
exit(-1);
}
从例题上出现了一个inet_aton函数,这个函数的目的是将一个字符串转化成网络地址,并把这个地址赋给serv_addr.sin_addr这个参数。
套接字(Socket)【连接】