- 英文小册原文地址: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()。
- 如果远程主机调用了
recv(),返回值会是0; - 如果远程主机调用了
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()










