`

sock

 
阅读更多
转自:http://www.cnblogs.com/hnrainll/archive/2011/04/24/2026432.html struct sockaddr与struct sockaddr_in ,struct sockaddr_un的区别和联系 在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下: typedef unsigned short sa_family_t; struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ 在linux环境下,结构体struct sockaddr_in在/usr/include/netinet/in.h中定义,具体如下: /* Structure describing an Internet socket address. */ struct sockaddr_in { __SOCKADDR_COMMON (sin_); in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of `struct sockaddr'. */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)]; /* 字符数组sin_zero[8]的存在是为了保证结构体struct sockaddr_in的大小和结构体struct sockaddr的大小相等 */ }; struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。 下面是struct sockaddr_in中用到两个数据类型,具体定义如下: /* Type to represent a port. */ typedef uint16_t in_port_t; struct in_addr其实就是32位IP地址 struct in_addr { unsigned long s_addr; }; BSD网络软件中包含了两个函数,用来在二进制地址格式和点分十进制字符串格式之间相互转换,但是这两个函数仅仅支持IPv4。 in_addr_t inet_addr(const char *cp); char *inet_ntoa(struct in_addr in); 功能相似的两个函数同时支持IPv4和IPv6 const char *inet_ntop(int domain, const void *addr, char *str, socklen_t size); int inet_pton(int domain, const char *str, void *addr); 通常的用法是: 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); /* short, 网络字节序 */ my_addr.sin_addr.s_addr = inet_addr("192.168.0.1"); bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */ //memset(&my_addr.sin_zero, 0, 8); bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); #define UNIX_PATH_MAX 108 struct sockaddr_un { sa_family_t sun_family; /*PF_UNIX或AF_UNIX */ char sun_path[UNIX_PATH_MAX]; /* 路径名 */ }; struct sockaddr结构类型是用来保存socket信息的:    struct sockaddr {    unsigned short sa_family; /* 地址族, AF_xxx */——地址的格式 char sa_data[14]; /* 14 字节的协议地址 */——地址值(IP和端口号) }; Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(struct sockaddr)。   struct sockaddr结构类型是用来保存socket信息的:   struct sockaddr {    unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data[14]; /* 14 字节的协议地址 */ };   sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。   另外还有一种结构类型:   struct sockaddr_in {    short int sin_family; /* 地址族 */    unsigned short int sin_port; /* 端口号 */    struct in_addr sin_addr; /* IP地址 */    unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */   };    这个结构更方便使用。sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。指向sockaddr_in 的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向 sockaddr_in的指针转换为指向sockaddr的指针;或者相反。 你只要记住,填值的时候使用sockaddr_in结构,而作为函数的 参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符 长。 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 };
分享到:
评论

相关推荐

    SOCK_RAW.rar_RAW_SOCK_R_SOCK_RAW Pi_sock_raw_windows SOCK_R

    `SOCK_RAW`是一种网络套接字类型,它允许程序员直接访问网络协议栈,从而能够发送和接收原始数据包,而不受高层协议(如TCP或UDP)的约束。本篇文章将深入探讨`SOCK_RAW`的概念、其在Windows环境下的应用以及如何...

    sock5客户端工具:proxycap

    标题中的“sock5客户端工具:proxycap”指的是Proxycap,这是一款功能强大的代理软件,主要用于通过SOCKS5协议将网络连接导向特定的代理服务器。SOCKS5是一种网络通信协议,允许应用程序通过代理服务器进行网络访问...

    VC++编程实例 SOCK编

    在给定的“VC++编程实例 SOCK编”主题中,我们将深入探讨如何使用VC++进行网络编程,特别是涉及SOCK(Socket)编程,线程管理和消息处理。 SOCK,或称套接字,是网络通信的基本单元,它允许程序通过网络发送和接收...

    M-Sock抓包工具

    **M-Sock 抓包工具详解** M-Sock 抓包工具是一款专为网络数据包捕获和分析设计的专业软件,它提供了强大的功能和简洁的操作界面,使得用户能够轻松地监控网络流量,诊断网络问题,以及进行网络安全检测。在本文中,...

    Sock工具,服务端和客户端

    【标题】:“Sock工具,服务端和客户端” 在IT领域,网络通信是不可或缺的一部分,而“Sock工具”正是一款用于实现这一目标的实用程序。它提供了服务端和客户端的功能,使得开发者可以方便地进行网络数据交换,特别...

    Linux下SOCK_RAW原理和应用

    在Linux操作系统中,SOCK_RAW是一种特殊的套接字类型,它允许程序员访问网络协议栈的底层,从而可以发送和接收原始数据包。这种类型的套接字对于开发自定义的网络协议、实现网络嗅探工具(如tcpdump)或进行网络诊断...

    深入解析mysql.sock不见的问题

    之前在网上看过好多关于mysql.sock不见的问题,并没有关注这个东西存在的意义,直到自己的mysql也出现了相同的问题。让人纠结了一把…… 代码如下:zhouqian@zhou:~$ mysqlERROR 2002 (HY000): Can’t connect to ...

    基于UDP的简单SOCK通信

    **基于UDP的简单SOCK通信** UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,常用于实时性要求高但对数据完整性不那么敏感的应用场景,如在线视频流、网络电话等。相对TCP协议,UDP的开销更小,...

    易语言sock5代理指定进程 单窗口 单ip源码

    标题 "易语言sock5代理指定进程 单窗口 单ip源码" 描述的是一个使用易语言编写的应用程序,该程序具有通过SOCK5代理协议为特定进程设置网络代理的功能。SOCKS(Socket Secure)协议是网络通信中的一种协议,通常用于...

    tcp/ip详解里sock小程序

    《TCP/IP详解》一书中,作者Richard Stevens引入了一个名为"sock"的小程序,它是一个用于实验和学习TCP/IP协议的实用工具。这个小程序是卷1的重要组成部分,旨在帮助读者更深入地理解网络编程中的概念和技术。sock ...

    linux内核中sock和socket数据结构

    Linux内核中的sock和socket数据结构是网络编程的核心组成部分,它们是实现网络通信的基础构件。在Linux操作系统中,网络通信的实现依赖于BSD套接字接口,而这一接口在内核中是通过sock和socket数据结构来实现的。 ...

    学习SOCK的例子

    在Linux平台上,网络编程是开发跨进程通信应用的重要部分,而SOCK(Socket)就是实现这一目标的关键工具。本文将围绕“学习SOCK的例子”这一主题,深入解析Linux下的socket编程,通过分析提供的client.c和server.c两...

    sock_raw参考

    ### sock_raw参考与Linux字符设备建立方法 #### 一、sock_raw基础知识介绍 **sock_raw** 是一种在Linux系统中使用的特殊套接字类型,它允许应用程序直接与网络接口进行交互,而不需要经过完整的TCP/IP协议栈处理。...

    sock_http相关的类

    在IT行业中,网络通信是至关重要的一个领域,而`sock_http`相关的类通常是用来处理HTTP协议的客户端或服务器端通信的。在这个主题下,我们将深入探讨`sock_http`的含义,以及与之相关的类和库如何工作,同时也会介绍...

    SOCK判断是否联网模块.rar

    "SOCK判断是否联网模块"是一个针对易语言(EasyLanguage)开发的组件,用于检测计算机是否已连接到互联网。易语言是一种面向对象、简单易学的编程语言,旨在降低编程的难度,使更多的人能够参与到软件开发中来。 该...

    TCP/IP详解-linux版sock 源码

    TCP/IP详解——Linux版sock源码分析 TCP/IP协议栈是计算机网络通信的核心,它定义了数据在网络中传输的标准和规则。Linux操作系统以其开源、灵活的特性,成为了研究TCP/IP协议实现的重要平台。本篇文章将深入探讨...

    SOCK通信软件VC源代码

    【SOCK通信软件VC源代码】是一个基于VC6.0开发的聊天工具,它利用了SOCK(Socket)编程技术来实现客户端与服务器之间的通信。SOCK,即套接字,是网络编程中的一个基本概念,它为应用程序提供了一种在不同网络节点...

    windows sock server.

    Windows Sock Server是一种在Windows操作系统上运行的网络服务器软件,主要功能是提供SOCKS(Socket Secure)代理服务。SOCKS是一种协议,允许应用程序通过代理服务器与互联网上的其他服务器进行通信。它在网络安全...

    sock5 代理服务器 源码

    **sock5代理服务器源码详解** SOCKS(Socket Secure)是一种网络协议,主要用于在客户端和目标服务器之间建立代理连接,常用于绕过网络限制或提高数据传输的安全性。其中,SOCKS5是该协议的最新版本,支持TCP和UDP...

    Sock通讯服务端程序_sock_

    c#编的 Sock 通讯服务端程序代码,欢迎下载

Global site tag (gtag.js) - Google Analytics