Linux——C编程 socket编程

202 阅读2分钟

一、数据结构

/* Structure describing an Internet socket address.  */
struct sockaddr_in { 
   uint8_t sa_len;   /* 结构体长度*/ 
     short int sin_family; /* 通信类型 */ 
   unsigned short int sin_port; /* 端口 */ 
   struct in_addr sin_addr; /* Internet 地址 */ 
   unsigned char sin_zero[8]; /* 未使用的*/ 
   };
 
struct in_addr {   //sin_addr的结构体类型in_addr 原型
   unsigned long s_addr;     /*存4字节的 IP 地址(使用网络字节顺序)。*/
   };

二. API

1. 大小端转化API

/* 网络数据流采用大端模式,一般主机使用小端模式 */
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

/* h:host n:network l:u32 s: u16 */

2. 点分十进制字符串转in_addr格式转化

#include <arpa/inet.h>
/* 将一个字符串IP地址转换为一个32位的网络序列IP地址 */
int inet_aton(const char *strptr, struct in_addr *addrptr);
in_addr_t inet_addr(const char *strptr);
int inet_pton(int family, const char *strptr, void *addrptr);

/* 将一个32位的网络序列IP地址转换为一个字符串IP地址 */
char *inet_ntoa(struct in_addr inaddr);
const char *inet_ntop(int family, const void *addrptr, char *strptr,
size_t len);

/* inet_pton 和 inet_ntop 适用于ipv4和ipv6*/

3.socket API

  • common
/* 创建套接字 */
int socket(int family, int type, int protocol); 
/* family: ipv4是AF_NET ... */
/* type:  TCP是SOCK_STREAM UDP是SOCK_DGRAM */
/* 返回文件描述符 */
  • server
/* 绑定套接字和ip及port */
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
/* sockfd: 套接字 */
/* myaddr: 地址结构体 */
/* addrlen: 结构体长度 */
/* return: 0成功,-1失败 */
/* 监听客户端 */
int listen(int sockfd, int backlog);
/* sockfd: 创建的套接字 */
/* 最大客户端数 */
/* return: 0成功,-1失败 */
/* 接受连接 */
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
/* sockfd: 创建的套接字 */
/* cliaddr: 传出参数,客户端的地址数据 */
/* addrlen: addrlen参数是一个传入传出参数。
 * 传入的是调用者提供的缓冲区cliaddr的长度以避免缓冲区溢出问题。
 * 传出的是客户端地址结构体的实际长度 
 */
 /* return: 成功则返回交互fd */
  • client
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
/* sockfd: 创建的套接字 */
/* servadd: 目标地址 */
/* addrlen: 目标size */
/* return: 读写描述符 */

三、简单交互程序