高级C与网络编程复习(4)—— 基本套接字函数(Elementa

2020-04-24  本文已影响0人  SunnyQjm
基本 TCP 客户 / 服务器程序的套接字函数

socket 函数

#include <sys/socket.h>

/**
* 该函数用于创建一个socket套接字
* @param domin    协议族/地址族
* @param type     套接字的类型
*                 SOCK_STREAM ==> TCP套接字
*                 SOCK_DGRAM  ==> UDP套接字
*                 SOCK_RAW    ==> 原始套接字
*                 SOCK_PACKET ==> 可用于链路层访问控制
* @param protocol 指定协议
*
* @return         返回一个socket描述符 sockfd
*                 sockfd < 0  ==> 创建失败
*                 sockfd >= 0 ==> 创建成功,之后可用该sockfd进行IO操作
**/
int socket(int family, int type, int protocol);

AF_XXX 和 PF_XXX

connect 函数

/**T
* 该函数用于建立与指定socket的连接
* @param sockfd       一个未连接的socket的描述符
* @param sockaddr     指向要连接的套接字的sockaddr结构体的指针
* @param addrlen      上述sockaddr结构体的长度
*
* @return         成功则返回0, 失败返回-1, 错误原因存于errno 中
**/
int connect(int sockfd, const struct sockaddr * servaddr, int addrlen);

bind 函数

  • bind 函数把一个本地协议地址赋予一个套接字
  • 对于网际协议,协议地址是 32 位的 IPv4 地址或 128 位的 IPv6 地址与 16 位的 TCP 或 UDP 端口号的组合
  • 调用 bind 函数可以指定一个端口号,或指定一个 IP 地址,也可以两者都指定或两者都不指定
/****
*  sockfd:   标识一未捆绑套接口的描述字。
*  my_addr:  赋予套接口的地址。sockaddr结构定义如下:
*             struct sockaddr{
*               u_short sa_family;
*               char sa_data[14];
*             };
*  addrlen:  my_addr的长度。
*  返回值:    成功返回0,失败返回-1.
****/
int bind( int sockfd , const struct sockaddr * my_addr, socklen_t addrlen);

listen 函数

仅由 TCP 服务器调用,它做两件事情

  • socket 函数创建一个套接字时,它被假设为一个主动套接字 (active socket),也就是说,它是一个将调用 connect 发起连接的客户套接字。listen 函数把一个未连接的套接字转换成一个被动套接字,之后是内核应接收指向该套接字的连接请求。
  • 本函数的第二个参数规定了内核应该为相应套接字排队的最大连接个数
/**
* 将一个未连接的套接字转换成监听套接字,这样即可以用来监听来自客户端的请求了
* @param  sockfd     一个未连接的套接字描述符
* @param  backlog    等待连接队列的最大长度
**/
int listen( int sockfd, int backlog);

accept 函数

  • accpet 函数由 TCP 服务器调用,用于从已完成连接队列头返回一个已完成连接
  • 如果已完成连接队列为空,那么进程将被投入睡眠(假定套接字为默认的阻塞方式)
/**
* 在一个套接字的监听队列中取一个连接,如果没有,则死等
*
* @param sockfd    监听描述符(在调用listen之后监听来自客户端的连接)
* @param addr      (可选)用来保存新连接的源端地址
* @param addrlen   (可选)用来保存新连接的源端地址结构的长度
*
* @return          如果连接成功,则返回一个已连接的套接字描述符(用于和客户端通信)
**/
SOCKET accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

fork 和 exec 函数

描述符引用计数

close 函数

#include <unistd.h>

/**
* 通常Unix close函数也用来光比套接字,并终止TCP序列
*
* @return    0 ==> 成功
*           -1 ==> 出错
**/
int close(int sockfd);

gesockname 和 getpeername 函数

#include <sys/socket.h>

/**
* 返回与sockfd关联的本地协议地址
**/
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);

/**
* 返回与sockfd关联的外地协议地址
**/
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);
上一篇 下一篇

猜你喜欢

热点阅读