Socket的地址结构

在建立socket通信的过程中地址起着很关键的作用,在设计TCP/IP网络程序时,必须对 socket 的地址结构有清晰的认识。

TCP/IP 的地址数据结构。

struct sockaddr {
u_short safamily;/*地址族,AF_XXX*/
char sa_data[14];/*14字节的特定协议地址*/
}

其中14字节的sa_data随协议而不同。在TCP/IP协议族中,地址数据结构为:

struct in_addr{
u_long s_addr;/*32比特的IP地址,网络字节顺序 */
};
struct sockaddr_in{
short sin_family; /*AF_INET*/
u_short sin_short; /*16比特的端口号,网络字节顺序*/
struct in_addr sin_addr; /*32比特的IP地址,网络字节顺序*/
char sin_zero[8]; /*未用*/
}

网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。由主机字节顺序转换为网络字节顺序的两个函数如下:htons():将16比特的主机字节顺序数据转换为网络字节顺序htonl():将32比特的主机字节顺序数据转换为网络字节顺序与此相对应的将网络字节顺序转换为主机字节顺序的函数为:

ntohs():将16比特的网络字节顺序数据转换为主机字节顺序ntohl():将32比特的网络字节顺序数据转换为主机字节顺序由于各种socket地址结构的长度相差很大,TCP/IP地址族的地址长度为8字节,XNS地址为14字节,UNIX地址不定,最长可达110字节,所以无法以一种统一的格式定义它们,需要在bind()调用中明确指定socket地址的长度。

当bind()参数无效或端口已被其他程序所用时,函数返回-1,表明本次socket命名失败。

时间: 2024-09-17 03:43:29

Socket的地址结构的相关文章

编译器-zeromq socket网络传递结构体

问题描述 zeromq socket网络传递结构体 我在服务器端发了一个结构体,在client端接收,发送应该是正常的,客户端也接到了这个数据但是一访问成员变量就segment fault,zeromq 接收到在zmq::msg_t中有个size()函数返回接收到数据的size 我比对了一下是对的上的 但是一访问成员变量就出错,觉得很奇怪,应该是会编译器以及结构体的存储有关,本人新手,求各位大神指点一二 有分 解决方案 另外 我两端的操作系统以及编译器版本都一样 应该不存在大小端的问题 解决方案

Python socket C/S结构的聊天室应用实现_python

Python socket C/S结构的聊天室应用 服务端: #!/usr/bin/env python #coding:utf8 import socket,select def broadcast_data (sock,message): for socket in conn_list: if socket != server_socket and socket != sock : try : socket.send(message) except : socket.close() conn

Linux Socket学习--地址转换函数

 一个IP地址是由小数点分开的十进制数表示的,我们称之为点分十进制表示法.其中每一个十进制数代表一个字节的无符号数值(按照网络字节序)因为每个字节都是无符号的8位数值,这就限制了每一个字节所能表示的范围是0~255. Internet地址分类      一个Internet地址是由网络地址和主机地址构成的.      我们知道IP地址由32位二进制构成,但是网络地址和主机地址之间的界限并不是固定的,而界限的确定取决于地址的分类,下表总结了IP地址分类的方法: 理解网络掩码:      网络掩码的

Linux C Socket编程发送结构体、文件详解及实例

利用Socket发送文件.结构体.数字等,是在Socket编程中经常需要用到的.由于Socket只能发送字符串,所以可以使用发送字符串的方式发送文件.结构体.数字等等. 本文:http://www.cnblogs.com/xudong-bupt/p/3496741.html 1.memcpy Copy block of memory.内存块拷贝函数,该函数是标准库函数,可以进行二进制拷贝数据. 函数原型: void * memcpy ( void * destination, const voi

socket c c++ 结构体-socket发送结构体问题,无法在服务器端显示完整的结构体

问题描述 socket发送结构体问题,无法在服务器端显示完整的结构体 定义了如下结构体 在发送结构体的时候转换成char *类型 输入了如下学生数据__ 在接收端也进行了数据类型转换,如下 为什么最后的年龄输不出来,而是一串数字,怎么解决? 解决方案 你发送的send是直接发送的student的指针,你需要把整个student的内容存到char数组,然后发送char数组,接收后,也要把char数组memcpy等复制回来 解决方案二: sscanf处有&还能收到数据吗? 解决方案三: 1.你在客户

UNIX环境高级编程:网络编程常用函数及结构

#include <arpa/inet.h> int inet_aton(const char *strptr,               struct in_addr *addrptr); //将strptr字符串转换成32位的网络字节序(二进制值--a.b.c.d->32). int_addr_t inet_addr(const char *strptr) //功能通上,返回地址. in_addr addr; addr.s_addr = inet_addr("192.16

linux 内核与用户空间通信之netlink使用方法

Linux中的进程间通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制.同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared M

用户空间与内核空间数据交换的方式(9)------netlink【转】

转自:http://www.cnblogs.com/hoys/archive/2011/04/10/2011722.html Netlink 是一种特殊的 socket,它是 Linux 所特有的,类似于 BSD 中的AF_ROUTE 但又远比它的功能强大,目前在最新的 Linux 内核(2.6.14)中使用netlink 进行应用与内核通信的应用很多,包括:路由 daemon(NETLINK_ROUTE),1-wire 子系统(NETLINK_W1),用户态 socket 协议(NETLINK

linux网络编程之socket(一) socket概述和字节序、地址转换函数

一.什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进 程间通信,还可以用于网络上不同主机的进程间通信. socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4.IPv6,以及以后要讲的UNIX Domain Socket.然而,各种网络协议的地址格式并不相同,如下图所示: IPv4和IPv6的地址格式定义在netinet/in.h 中,IPv4地址用sockaddr_in结构体表示,包括16位端口号和32位