文章目录
Socket学习记录(一)
8. connect()
connect() 连接到远程主机
- sockfd : 是系统调用 socket() 返回的套接字文件描述符
- serv_addr:想要连接的主机地址和端口号
- addrlen:设置 为 sizeof(struct sockaddr)
- 返回值:错误的时候返回-1,并 设置全局错误变量 errno
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
9. listen()函数
- sockfd 是调用 socket() 返回的套接字文件描述符
- backlog 是在进入队列中允许的连接数目(进入的连接是在队列中一直等待直到接收 accept()连接 )
- 返回值:发生错误的时候返回-1,并设置全局错误变量 errno
int listen(int sockfd, int backlog);
如果想侦听进入的连接,那么系统调用的顺序可能是这样的:
socket() --> bind() --> listen() --> accept()
10. accept()函数
accept() 是接纳客户端请求的函数
- sockfd : 和listen中相同的套接字描述符
- addr :指向局部的数据结构 sockaddr_in 的指针
- addrlen:设置为 sizeof(struct sockaddr_in)
- 返回值:错误时返回-1,并设置全局错误变量 errno。
#include <sys/socket.h>
int accept(int sockfd, void *addr, int *addrlen);
accept函数指定服务端去接受客户端的连接,接收后,返回了客户端套接字的标识,且获得了客户端套接字的“地方”(包括客户端IP和端口信息等)。
11. send() 和 recv() 函数
send() 和 recv() 函数用于流式套接字或者数据报套接字的通讯
(1) send()
- sockfd 是想发送数据的套接字描述符(或者是调用 socket() 或者是 accept() 返回的。)
- msg 是指向你想发送的数据的指针
- len 是数据的长度
- flags 设置为 0 即可
int send(int sockfd, const void *msg, int len, int flags);
(2) recv()
- sockfd 是要读的套接字描述符
- buf 是要读的信息的缓冲
- len 是缓 冲的最大长度
- flags 设置为0即可
- 返回实际读入缓冲的数据的字节数。
- 错误的时候返回-1, 同时设置 errno。
int recv(int sockfd, void *buf, int len, unsigned int flags);
12. sendto() 和 recvfrom() 函数
(1) sendto()
- to 是个指向数据结构 struct sockaddr 的指针,包含了目的地的 IP 地址和端口信息
- tolen 可以设置为 sizeof(struct sockaddr)
int sendto(int sockfd, const void *msg, int len, unsigned int flags,const struct sockaddr *to, int tolen);
(2) recvfrom()
- from 是一个指向局部数据结构 struct sockaddr 的指针,它的内容是源机器的 IP 地址和端口信息
- fromlen 是个 int 型的局部指针,它的初始值为 sizeof(struct sockaddr)。函数调用返回后,fromlen 保存着实际储存在 from 中的地址的长度。
- recvfrom() 返回收到的字节长度,或者在发生错误后返回 -1
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);
如果用 connect() 连接一个数据报套接字,可以简单的调 用 send() 和 recv() 来满足要求。这个时候依然是数据报套接字,依然使用 UDP,系统套接字接口会自动加上目标和源的信息。
13. close() 和 shutdown()
(1) close()
- 关闭套接字描述符
close(sockfd);
(2) shutdown()
- how :
- 0 – 不允许接受
- 1 – 不允许发送
- 2 – 不允许发送和接受(和 close() 一样)
int shutdown(int sockfd, int how);
shutdown() 成功时返回 0,失败时返回 -1
14. getpeername()
获取socket的对方地址
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);
15. gethostname()
获取进程所在机器的计算机的名字
注: 用域名或主机名获取IP地址,这个域名或主机名可以是本地机器的主机名/域名;也可以是远端节点的域名
#include <unistd.h>
int gethostname(char *hostname, size_t size);
至此简单学习了socket的操作接口