socket编程(一)

来源:互联网 发布:印第安人 知乎 编辑:程序博客网 时间:2024/05/16 09:47

socket

socket 可以看成是用户进程和内核网络协议栈的编程接口。
socket 不仅可以用于本机的进程间通信,还可以用于网络上不同主机进程间的通信。

IPv4套接口地址结构

IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>

struct sockaddr_in {        uint8_t         sin_len;        sa_family_t     sin_family;        in_port_t       sin_port;        struct in_addr  sin_addr;        char            sin_zero[8];};
  • sin_len: 整个sockaddr_in结构体的长度, 在4.3BSD-Reno版本之前的第一个成员是sin_family。
  • sin_family: 指定该地址家族,在这里设置为AF_INET代表IPv4。
  • sin_port: 端口
  • sin_addr: IPv4的地址。
  • sin_zero:暂不使用, 一般将其设置为0。

通用地址结构用来指定与套接字关联的地址

struct sockaddr {    uint8_t      sin_len;    sa_family_t  sin_family;    char         sa_dta[14];
  • sin_len: 整个sockaddr结构体的长度
  • sin_family:指定该地址家族
  • sa_data:由sin_family决定它的形式

字节序:

  • 大端字节序(Big Endian)
    最高有效位(MSB)存储于最低内存地址处,最低有效位存储在最高内存地址处。
  • 小端字节序(Little Endian)
    最高有效位存储于最高内存地址处,最低有效位存储于最低内存地址处。

主机字节序:
不同的主机有不同的字节序,如x86为小端字节序,ARM字节序为可配置的。

#include <stdio.h>//测试主机字节序int main(){    int x = 0x12345678;    unsigned char *ptr = (unsigned char *)&x;    printf("%x %x %x %x\n", ptr[0], ptr[1], ptr[2], ptr[3]);    return 0;}

输出:

78 56 34 12

网络字节序:
网络字节序规定为大端字节序。

字节序转换函数:

//在头文件<arpa/inet>中//主机字节序转换为网络字节序uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);//网络字节序转换为主机字节序uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);
unsigned int y = htonl(x);    ptr = (unsigned char *)&y;    printf("%x %x %x %x\n", ptr[0], ptr[1], ptr[2], ptr[3]);

输出结果:

12 34 56 78

地址转换函数

//地址转换函数//将一个点分十进制的地址转换为网络字节序的地址int inet_aton(const char *cp, struct in_addr *inp);//将点分十进制地址转换为32位整数in_addr_t inet_addr(const char *cp);//将一个网络字节序地址结构转换为点分十进制ip地址char *inet_ntoa(struct in_addr in)
#include <stdio.h>#include <winsock2.h>int main(){    unsigned  long addr = inet_addr("192.168.0.100");    printf("addr = %u\n", ntohl(addr));    struct in_addr ipaddr;    ipaddr.s_addr = addr;    printf("%s\n", inet_ntoa(ipaddr));    return 0;}

输出:

addr = 3232235620192.168.0.100

套接字类型

  • 流式套接字(SOCK_STREAM)[TCP]
    提供面向连接的、可靠的数据传输服务,数据无差错,无重复的发送,且按发送顺序接收。
  • 数据报式套接字(SOCK_DGRAM)[UDP]
    提供无连接服务,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。
  • 原始套接字(SOCK_RAW)
原创粉丝点击