2.1.1.2 Posix API学习记录(二)


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的操作接口

…未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值