现在的位置: 首页 > 综合 > 正文

socket编程概述

2012年10月22日 ⁄ 综合 ⁄ 共 1092字 ⁄ 字号 评论关闭

        一、套接字地址结构

        说套接字编程,第一个就是套接字地址结构。通用的套接字地址结构定义如下:

#include <sys/socket.h>
struct sockaddr{
    uint8_t sa_len;
    sa_family_t sa_family;  // address family : AF_XXX
    char sa_data[14];
};

我们在使用套接字编程时,需要往套接字结构中填入必要的信息,而这些信息根据协议族不同而不同,所以需要使用针对某个协议族的套接字地址结构sockaddr_xxx,而套接字函数为了能支持所有协议族,需要有一个形参能表示所有的sockaddr_xxx,当时C语言还不支持通用指针类型void *,因此用通用套接字地址结构sockaddr来代表所有协议族的套接字地址结构sockaddr_xxx。我们使用的是某个具体协议族的套接字地址结构sockaddr_xxx,而套接字函数的参数类型是sockaddr
*,这样我们在调用socket接口的时候需要把sockaddr_xxx对象的指针强制类型转换为sockaddr *类型。

        最常用的sockaddr_xxx就是IPv4套接字地址结构sockaddr_in:

#include <netinet/in.h>
struct in_addr{
    in_addr_t s_addr;  // 32-bit IPv4 address, network byte ordered
};
struct sockaddr_in{
    uint8_t sin_len;    // length of structure
    sa_family_t sin_family;    // AF_INET
    in_port_t sin_port;    // 16-bit TCP or UDP port number, network byte ordered
    struct in_addr sin_addr;    // 32-bit IPv4 address, network byte ordered
    char sin_zero[8];
};

其中,编程需要在意的只有三个:sin_family,虽然一定就是AF_INET,因为历史的原因还是需要在代码中写明。sin_port,端口号,常用htons()把16位数值转换成需要的network byte order二进制值。sin_addr,IP地址,常用inet_aton()将点分十进制地址字符串转换成32位的network byte order二进制值,推荐用更新的inet_pton()因为同时支持IPv4和IPv6跨协议。

抱歉!评论已关闭.