struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
上面是通用的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
struct in_addr就是32位IP地址。
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr
};
inet_addr()是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32位IP地址(0xC0A80001)。
填值的时候使用sockaddr_in结构,而作为函数(如socket, listen, bind等)的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。
通常的用法是:
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
bzero(&(my_addr.sin_zero), 8);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
可以用C++做个不太准确的假设。
sockaddr是base class
sockaddr_in 等是derived class
如此一来,bind, connect , sendto , recvfrom等函数就可以使用base class
来处理多种不同的derived class了。
但是实际上,这是没有继承关系数据结构(C嘛),所以需要强制造型来转换数据类型。正因为如此,在sendto的时候需要给出len长度,因为不同的sockaddr_xx实现长度并不相同。
名词解析:
主机字节序:
不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。最常见的有两种 1.Little endian:低字节存高地址,高字节存低地址 2.Big endian:低字节存低地址,高字节存高地址
网络字节序:
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。
为了进行转换bsd socket提供了转换的函数,有下面四个网络与主机字节转换函数:
htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序,
ntohl 把unsigned long类型从网络序转换到主机序。
在使用little endian的系统中 这些函数会把字节序进行转换 在使用big endian类型的系统中这些函数会定义成空宏
分享到:
相关推荐
sock结构通常被看作是socket结构的补充,它更偏重于网络连接层面的管理。sock结构中的信息是针对具体协议的,如TCP或UDP协议。 在Linux内核中,sock和socket之间存在着紧密的联系。一个socket可以关联到一个或多个...
端口是操作系统分配的资源,用来标识通信进程,它可以是软件结构,包含数据结构和I/O缓冲区。每个端口都有一个端口号,用于区分不同的端口,端口号的分配有两种方式:全局分配和本地分配。全局分配的端口用于标准...
在IT领域,Linux、C语言、C++以及数据结构和Socket编程是计算机科学与软件工程的基础,对于任何希望深入理解操作系统、系统级编程或者网络应用开发的开发者来说,这些都是不可或缺的知识点。 首先,我们来详细了解...
【标题】"HPSocket.Net-develop_hpsocket.net_HPSocket_.net_socket_tcp_" 提供的知识点主要集中在使用C#编程语言实现基于TCP协议的Socket通信上,并且涉及到一个名为"HPSocket.Net"的库。HPSocket.Net是针对.NET...
在本课程设计中,我们将深入理解并实践如何利用Socket进行C/S结构的应用程序开发。 首先,我们需要理解C/S架构的基本概念。这种架构模式包括两个主要部分:客户端(Client)和服务器端(Server)。客户端是发起请求...
**三、项目结构及文件** 1. **SuperSocket.Mono.sln**、SuperSocket.2010.NET35.sln等.sln文件:这些都是Visual Studio的解决方案文件,用于管理和构建SuperSocket项目。 2. **LICENSE.TXT**和**README.TXT**:...
理解网络层次结构、IP协议、TCP/UDP协议以及端口号等概念对于进行Socket编程至关重要。 ### 结构体 Socket编程涉及到多种结构体,比如sockaddr用于存储IP地址和端口号信息,用于bind()、connect()、accept()等函数...
### Linux 内核 Socket 相关数据结构介绍 #### 一、引言 在 Linux 内核中,网络通信的核心是 Socket。为了更好地理解和掌握 Socket 的工作原理与内部机制,了解其相关的数据结构至关重要。本文将详细介绍 Linux ...
可以采用线程安全的数据结构来存储Socket,以防止并发访问时的冲突。 3. 连接复用:连接完成后,将Socket放回池中,而不是立即关闭。这需要确保Socket的状态可以被正确地重置,以便下一次使用。 4. 连接管理:对池...
《Socket设计详解》 Socket设计是计算机网络编程中的核心概念,它为应用程序提供了在不同网络环境下进行数据通信的接口。Socket源自70年代的Berkeley Software Distribution (BSD) UNIX 4.1版,后来在多种操作系统...
* 通用地址结构:当地址结构作为传递给任何一个 SOCKET 函数的参数时,任意一个 Socket 函数必须能处理每一种地址结构,为了解决这个问题,提出了使用通用套接口地址结构。 Client/Server Model Client/Server 的...
BS(Browser-Server)结构的Socket通信是一种网络通信模式,主要应用于Web应用程序中,使得浏览器与服务器能够进行低级、实时的数据交换。本实例通过服务器端和Web客户端的交互,展示了如何实现这种通信机制。 首先...
标题中的“hpsocket_delphi.rar_Delphi HPSOCKET_HPSocket_ZA9_delphi hpsocke”指的是一款基于Delphi开发的HPSocket SDK,这是一个网络通信库,特别适用于Delphi编程环境。HPSocket是高性能的跨平台网络通信组件集...
实现C#raw Socket编程需要定义IP头结构,暂时存放一些有关网络封包的信息。然后,通过强制类型转化,把包中的数据流转化为一个个IPHeader对象。接着,定义RawSocket类,包括error_occurred、KeepRunning、len_...
调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。 Socket执行体为你管理描述符表。两个网络程序之间的一个网络连接包括五种信息:通信协议、本地...
在本节中,我们将详细介绍 socket 编程的基础知识,包括主机字节序和网络字节序、缓冲区、通信域、套接字的概念和类型、socket 地址结构、C/S 网络编程的初始化等。 一、 主机字节序和网络字节序 在计算机中,字节...
【标题】基于SOCKET的C/S结构聊天室 在计算机网络通信中,C/S(Client/Server)架构是一种常见的通信模型,它由客户端和服务器端组成。在这个基于Java的聊天室项目中,我们利用了Socket编程来实现C/S架构,从而实现...
在Unity与服务器之间的数据交互中,JSON经常被用来传输结构化数据。Newtonsoft.Json库提供了高效的序列化和反序列化工具,使得Unity可以方便地将对象转换为JSON字符串,再将接收到的JSON数据还原为对象。 在使用HP ...
在 IPV4 中,Socket 地址结构使用 struct sockaddr_in 结构体,而在 IPV6 中,Socket 地址结构使用 struct sockaddr_in6 结构体。 IPV4 和 IPV6 的兼容 -------------------- 为了实现 IPV4 和 IPV6 的兼容,需要...