socket 知识点

来源:互联网 发布:商家给淘宝开消费积分 编辑:程序博客网 时间:2024/05/24 16:16
#include<sys/socket.h>struct sockaddr//用于存储参与套字节通信的计算机上的一个ip协议地址{    unsigned short sa_family;//AF_inet  AF_INET6 AF_UNSPEC    char sa_data[14];};#include<sys/un.h>struct sockaddr_un{    unsigned short sun_family;//地址族 AF_CLOCAL AF_UNIX    char sun_path[108];//路径名有效的unix路径名}//传统本地地址的命名空间就是本地文件系统的路径名.一个进程可以使用任何有效(进程可以访问该路径目录且在该路径生成套接口)的路径名来命名本地套接口lpd服务进程就在这个本地套接口地址上监听客户请求#include<netinet/in.h> "IPv4struct sockaddr_in{    unsigned short sin_family;//地址族AF_INET    uint16_t sin_port;//端口号tcp/ip端口号,值必须是网络字节序形式    struct in_addr ssin_addr;//Internet 地址 IP地址    unsigned char sin__zero[8];//占位字节 };struct in_addr{    uint32_t s_addr;//Internet地址};struct sockaddr_x25{    unsigned short sx25_addr[16];//必须是AF_X25    x25_address sx25_addr;//X.121地址};typedef struct{    char x25_addr[16];}x25_address;"IPv6struct sockaddr_in6{    unsigned short sin6_family;    uint16_t sin6_port;    uint32_t sin6_flowinfo;    struct in6_addr sin6_addr;};struct in6_addr{    union{        uint8_t  u6_addr8[16];        uint16_t u6_addr16[8];        uint32_t u6_addr32[4];    }in6_u;};"AF_UNSPECunion{    sockaddr sa;    sockaddr_un un;    sockaddr_in in;    sockaddr_in6 in6;    sockaddr_ax25 x25;    full_sockaddr_ax25 ax_25;    sockaddr_atalk at;}u;对于多字节数据,不同cpu有不同的组织方式,其中两种最基本的字节序为:①小端(litter-endian)字节序,将低序字节存储起始位置的方式;②大端(big-endian)字节序,将高序字节存储在起始位置的方法现在网络上传输的标准顺序为大端字节序网络掩码:网络掩码的作用在于把网络地址从IP地址中提取出来,        实际上代表网络掩码的IP号与某一特定的IP "按位与"操作一个IP地址是由四个被小数点分开的十进制数组成"每个字节都是一个字节的无符号数值"IP由网络地址和主机地址组成网络地址表示电脑所在网络,主机地址是区分同一网络中的不同地址当socket函数创建一个 后,该接口无名(在同意linux内核能用)无名套接口就像没有号码的电话,别人无法给你传送信息.就像为一部电话分派号码一样,编程者需要将套接口绑定一个名字bind函数就是给套接口绑定名字---分配地址.#include<sys/types.h>#include<sys/socket.h>"调用成功返回0"int bind(int sockfd,//套接口的描述符          struct sockaddr *my_addr,//分配给套接口的地址          int addrlen);//地址结构的长度 "地址参数必须是一个指向地址结构的指针" "sockaddr结构采用的是通用地址类型, "所以须采用类型转换,满足编译器要求"ps查看处于活跃状态的服务"netstat显示所有可用连接和服务以及它们的状态         "-a或–all 显示所有连线中的Socket "-p 显示正在使用Socket的程序识别码和程序名称。 ntohs()是一个函数名,作用是将一个16位数由网络字节顺序转换为主机字节顺序 "ntohl()是将一个无符号长整形数从网络字节顺序转换为主机字节顺序。"  获得套接口地址  如果在c库函数仅将套接口描述符作为一个输入参数,将无法得知套接口的地址  因为这个套接口不是在程序中生成的,  如果不把套接口地址作为输入参数一起传递给程序,我们无法得到这个套接口地址  "getsockname(int s,struct sockaddr*name,socklen_t *namelen)  s:使我们想要知道地址的套接口  name:是指向接收缓冲区的指针.  namelen:是指向最大长度的指针变量.这个变量给出了接收缓冲区接收最大容量           当接收缓冲区被写入后,这个值将被更新为实际写入的字节数.   "获得本地协议地址"   "成功返回0       "获得对等(套接口连接的远程套接口)套接口地址"      "接口与定址     套接口程序可以做到只接收来自特定接口的连接请求,而忽视来自其他接口的请求.        面向非连接协议优点    ①不需要连接     ②可以向任何愿意接收我们信息的套接口发送信息(具备广播能力)    ③不需要连接和拆除连接    面向非连接协议缺点:    ①通信过程不可靠(数据报容易丢失)    ②数据报的无序性        "写一个数据报并指定接受者的地址".    #include<sys/types.h>    #include<sys/socket.h>    int sendto(        int s;套字节描述符        const void *msg;指向容纳所要发送的数据报信息的缓冲区的指针        int len,数据报信息的长度        unsigned flags,//一般0        const struct sockaddr *t//指定接收者的(套接口)地址,        int tolen地址参数的长度    )    "接收数据报的同时,也能得到发送者地址"    #include<sys/types.h>    #include<sys/socket.h>    int recvfrom(        void *buf,套接口的描述符        int len,指向容纳接收数据报信息缓冲区的指针        unsigned flags,一般0        struct sockaddr *from,指向套接口结构的指针在这个地址结构中将填入发送者的地址        int *fromlen是参数from的长度    );

0 0
原创粉丝点击