- 英文小册原文地址: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()
标签:socket,ai,res,send,connect,close,man From: https://blog.51cto.com/u_13887950/5806584