0
点赞
收藏
分享

微信扫一扫

connect()和close()的man手册


  • 英文小册原文地址:​​beej.us/guide/bgnet…​​
  • 作者:Beej
  • 中文翻译地址:​​www.chanmufeng.com/posts/netwo…​​

connect()

将你本地的socket连接到服务器。

函数原型

#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *serv_addr,
socklen_t addrlen);

说明

当你调用​​socket()​​​得到一个socket descriptor之后,你可以使用​​connect()​​​这个系统调用连接这个socket到远程服务器。你需要做的就是把socket descriptor和服务端地址传递给​​connect()​​。对了,还有地址的长度,也得通过参数的形式传递。

一般情况下,你可以通过调用​​getaddrinfo()​​​来获取这些信息,但是如果你非要手动装填​​struct sockaddr​​也不是不行。

如果你没有对socket descriptor调用​​bind()​​方法,它会和你的IP地址以及随机端口号进行绑定。

如果你不是Server端程序,这种自动机制是挺好的,因为你根本就不在乎你用的是啥端口号,你只需要在乎远程端口号是什么,并把它放在​​serv_addr​​​参数中就行了。如果你实在想绑定到某个特定IP地址和特定端口号上,你也可以用​​bind()​​函数进行设置,但属实没有必要。

一旦​​connect()​​​完成,你就可以随心所以地使用 ​​send()​​​ 和 ​​recv()​​处理数据了。

记住:如果你​​connect()​​​的是远程的 ​​SOCK_DGRAM​​​ UDP socket,只要你想, ​​send()​​​ 、 ​​recv()​​​和 ​​sendto()​​​ 、 ​​recvfrom()​​你都可以用。

返回值

成功返回​​0​​​,发生异常时返回​​-1​​​,并将 ​​errno​​ 设置为合适的值。

例子

// connect to www.example.com port 80 (http)

struct addrinfo hints, *res;
int sockfd;

// first, load up address structs with getaddrinfo():

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
hints.ai_socktype = SOCK_STREAM;

// we could put "80" instead on "http" on the next line:
getaddrinfo("www.example.com", "http", &hints, &res);

// make a socket:

sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

// connect it to the address and port we passed in to getaddrinfo():

connect(sockfd, res->ai_addr, res->ai_addrlen);

参阅

​​socket()​​, ​​bind()​​

close()

关闭socket descriptor。

函数原型

#include <unistd.h>

int close(int s);

说明

当你完成了对包含你无数奇思妙想的socket的使用,并且你不想再​​send()​​​或​​recv()​​​,又或者任何其他事情,你可以使用​​close()​​,socket将被永久释放。

远程主机可以通过以下两种方式判断你是否进行了​​close()​​。

  1. 如果远程主机调用了​​recv()​​,返回值会是0;
  2. 如果远程主机调用了​​send()​​​,它将会收到一个 ​​SIGPIPE​​​ 信号,并且​​send()​​​的返回值为​​-1​​​,​​errno​​​值也会被设置为 ​​EPIPE​​。

Windows使用者须知:

关闭的方法为​​closesocket()​​​,而不是​​close()​​​。如果你试图在socket descriptor上使用​​close()​​,Windows可能会跟你闹别扭。。。你会很苦恼。

返回值

成功返回​​0​​​,发生异常时返回​​-1​​​,并将 ​​errno​​ 设置为合适的值。

例子

s = socket(PF_INET, SOCK_DGRAM, 0);
.
.
.
// a whole lotta stuff...*BRRRONNNN!*
.
.
.
close(s); // not much to it, really.

参阅

​​socket()​​, ​​shutdown()​​

举报

相关推荐

0 条评论