套接字地址结构

大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。每个协议簇抵都定义它自己的套接字地址结构

这些结构的名字均以sockaddr_开头,并以对应每个协议簇的唯一后缀结尾

1.IPv4套接字地址结构

IPv4套接字地址结构通常称为:网际套接字地址结构

它以sockaddr_in命名

struct  in_addr{

in_addr_t  s_addr;//32位无符号整数类型

};

struct sockaddr_in{

unit8_t  sin_len;//套接字地址结构长度 它是一个无符号短整形 可以不设置它的值

sa_family_t  sin_family;//套接字地址结构的地址簇 任何无符号整数类型

in_port_t  sin_port;//TCP或UDP端口号 网络字节序 至少16位的无符号整数类型

struct in_addr  sin_addr;//IPv4地址 网络字节序

cahr   sin_zero[8];//不是必须要 保持对齐

};

2.通用套接字地址结构

当作为一个参数传递进任何套接字函数时,套接字地址结构总是以引用形式(也就是以指向该结构的指针)来传递

然而以这样的指针作为参数之一的任何套接字函数必须处理来自所支持的任何协议簇的套接字地址结构

有了ANSI C后解决办法很简单:void *是通用的指针类型

然而套接字函数在ANSI C之前定义的 采取的方法是定义一个通用套接字地址结构

struct  sockaddr{

uint8_t  sa_len;

sa_family_t  sa_family;//地址簇类型

cahr  sa_data[14];//

}

于是套接字函数被定义为以指向某个通用套接字地址结构的一个指针作为其参数之一

时间: 2024-12-14 08:22:43

套接字地址结构的相关文章

【UNIX网络编程(一)】套接字地址结构、网络字节序和地址转换函数

引言:套接字地址结构在网络编程的每个实现中都要用到,因此掌握套接字地址结构是以后编写网络程序的前提,地址结构可以在两个方向上传递:从进程到内核和从内核到进程.地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换. 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.不同协议都有自己的套接字地址结构.通用的套接字地址结构是sockaddr.IPv4套接字地址结构是定义在头文件<netinet/in.h>中的sockaddr_in,其POSIX定义如下: stru

新的通用套接字地址结构

作为IPv6套接字API的一部分而定义的新的套接字地址结构克服来现有struct sockaddr的一些缺点 不像struct sockaddr,新的struct sockaddr_storage足以容纳系统所支持的任何套接字地址结构 struct sockaddr_storage{ uni8_t ss_len; sa_family_t sa_family; }; sockaddr_storage类型提供的通用套接字地址结构相比sockaddr存在以下2点差别: 1)如果系统支持的任何套接字地址

套接字编程简介: IPV4套接字地址结构/ 通用套接字地址结构/ IPV6套接字地址结构

IPv4套接字地址结构通常也称为"网际套接字地址结构",它以sockaddr_in命名,定义在<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 if structure(16)*/ sa_family_t sin_famil

IPv4套接字地址结构

一.IPv4套接字地址结构(POSIX定义) (1)长度字段sin_len是为增加对OSI协议的支持而随4.3BSD-Reno添加的:并不是所有的厂家都支持套接字地址结构的长度字段,而且POSIX规范也不   要求有这个成员: (2)POSIX规范只需要这个结构中的3个字段:sin_family.sin_addr和sin_port:对于符合POSIX的实现来说,定义额外的结构字段是可以接受的 二.POSIX规范要求的数据类型 (1)POSIX规范定义u_char.u_short.u_int和u_

IPv6套接字地址结构

struct in6_addr{ unit8_t sa_addr[16]; }; #define SIN6_LEN struct sockaddr_in6{ unit8_t sin6_len; sa_family_t sin6_family; in_port_t port; unit32_t sin6_flowinfo; struct in6_addr sin6_addr; unit32-t sin6_scope_id; }; 如果系统支持套接字地址结构中的长度字段,那么SIN6_LEN常值必须

UNIX网络编程第3章套接字编程简介3.2套接字地址结构3.3值结果参数3.4字节排序函数

1: #include <iostream> 2: #include "../lib/unpsunyj.h" 3: 4: int main(int argc, char **argv) 5: { 6: union { 7: short s; 8: char c[sizeof(short)]; 9: } un; 10:   11: un.s = 0x0103; 12: std::cout << "un.s =: " << un.s

[解决]通常每个套接字地址只允许使用一次

我们在做socket的开发的时候,经常会遇到这个错误:通常每个套接字地址 (协议/网络地址/端口)只允许使用一次 错误指示很明确:通信端口被占用了,导致通信无法进行. 但为什么端口被占用了呢?什么端口被占用了? 这里其实有一个大前提:你的程序中有没有指定socket通信端口? 如果指定了,解决办法很简单,每次通信完成手动释放就行了.下次通信重新建立连接. 如果没有指定,说明以下几点(可能你命中的是其中一点): 1.你的服务器开启的端口数太少: 2.连接释放等待时间太长: 3.你的socket通信

2017.07.09 Python网络编程之重用套接字地址

1.重用套接字地址: # -*- coding: UTF-8 -*-# 如果在某个端口上运行一个Python套接字服务器,连接一次后便终止了运行,就不能在使用这个端口了# !usr/bin/env python# Python Network Programming Cookbook --Chapter -1# This program is optimized for Python 2.7# It may run on any other version with/without modifi

《网络编程》套接字地址与名字转换

前言 在套接字编程中,我们经常使用数字的 IP 地址和端口号进程编程,但是我们平常所熟悉的是一些便于记忆的字符名字,要使这种名字能够为套接字操作函数识别,所以这两者之间必须存在着某种转换关系.本节介绍的是 [主机名 与 地址] 和 [服务名 与 端口号] 之间的转换.在 Unix 系统中,可以使用函数 gethostbyname.gethostbyaddr 实现[主机名 与 地址]之间的转换:可以使用函数 getservbyname.getservbyport 实现 [服务名 与 端口号] 之间