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

一、什么是socket

socket可以看成是用户进程与内核网络协议栈的编程接口。

socket不仅可以用于本机的进 程间通信,还可以用于网络上不同主机的进程间通信。

socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及以后要讲的UNIX Domain Socket。然而,各种网络协议的地址格式并不相同,如下图所示:

IPv4和IPv6的地址格式定义在netinet/in.h 中,IPv4地址用sockaddr_in结构体表示,包括16位端口号和32位IP地址,如下所示:

struct sockaddr_in {
               sa_family_t    sin_family; /* address family: AF_INET */
               in_port_t      sin_port;   /* port in network byte order */
               struct in_addr sin_addr;   /* internet address */

char sin_zero[8]; /* pad bytes,  set to zero is ok */
           };

  /* Internet address. */
           struct in_addr {
               uint32_t       s_addr;     /* address in network byte order */

           };

IPv6地址用sockaddr_in6结构体表示,包括16位端口号、128位IP地址和一些控制字段。UNIX Domain Socket的地址格式 定义在sys/un.h中,用sockaddr_un结构体表示。各种socket地址结构体的开头都是相同的,前16位表示整个结构体的长度 (并不是所有UNIX的实现都有长度字段,如Linux就没有),后16位表示地址类型。IPv4、IPv6和UNIX Domain Socket的地 址类型分别定义为常数AF_INET、AF_INET6、AF_UNIX。这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪 种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。因此,socket API可以接受各种类型的sockaddr 结构体指针做参数,例如bind、accept、connect等函数,这些函数的参数应该设计成void *类型以便接受各种类型的指针 ,但是sock API的实现早于ANSI C标准化,那时还没有void *类型,因此这些函数的参数都用struct sockaddr *类型表示 ,即通用地址结构,如下所示:

struct sockaddr {

sa_family_t  sin_family;

char sa_data [14];

};

sin_family:指定该地址家族

sa_data:由sin_family决定它的形式。

在传递参数之前要强 制类型转换一下,例如:

struct sockaddr_in servaddr;

/* initialize servaddr *

/bind(listen_fd, (struct sockaddr *)&servaddr, sizeof(servaddr));

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索socket
, 结构体
, 结构体指针
, struct
, 结构
, 函数
, 地址
, 类型
, linux socket
, 结构体的函数指针
, socket c c++ 结构体
, 结构指针c语言socket
, 结构体 参数
linux下socket编程
java读取socket字节流、java socket 字节流、socket 读取字节流、socket字节流、socket发送字节数组,以便于您获取更多的相关知识。

时间: 2024-10-07 13:54:34

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

Linux网络编程之UDP Socket程序示例_C 语言

在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送. 相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务.使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可

linux 网络编程之TIME_WAIT状态

                                                         Linux 网络编程之TIME_WAIT状态                                                               刚刚开始看TCP socket的4次握手终止流程图的时候,对于最后的TIME_WAIT状态不是很理解.现在在回过头来研究,发现TIME_WAIT状态是一个很微妙状态.之所以设计TIME_WAIT状态的原因有2个原因:

linux网络编程之socket(十五) UNIX域套接字编程和socketpair 函数

一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机 制,就是UNIX Domain Socket.虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是 UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包.计算校验和.维护序号和应答等,只是 将应用层数据从一个进程拷贝到另一个进程.UNIX域套接字与TCP套接字相比较,

Linux网络编程之socket文件传输示例_C 语言

本文所述示例程序是基于Linux平台的socket网络编程,实现文件传输功能.该示例是基于TCP流协议实现的socket网络文件传输程序.采用C语言编写.最终能够实现传输任何格式文件的文件传输程序. 具体实现代码如下: Server端代码如下: /************************************************************************* > File Name: Server.c > Author: SongLee ***********

linux网络编程之socket(七) 一个进程发起多个连接和gethostbyname等函数

一.在前面讲过的最简单的回射客户/服务器程序中,一个客户端即一个进程,只会发起一个连接,只要稍微修改一下就 可以让一个客户端发起多个连接,然后只利用其中一个连接发送数据. 先来认识一个函数getsockname  #include <sys/socket.h>  int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 利用此函数可以得到某连接sockfd的地址信息,如ip地址和端口,这可以帮助我们判断发起了

linux网络编程之socket(三) 最简单的回射客户/服务器程序

下面通过最简单的客户端/服务器程序的实例来学习socket API. echoser.c 程序的功能是从客户端读取字符 然后直接回射回去. /************************************************************************* > File Name: echoser.c > Author: Simba > Mail: dameng34@163.com > Created Time: Fri 01 Mar 2013 06

Linux网络编程之TCP协议

server.c: #include <stdlib.h>  #include <stdio.h>  #include <errno.h>  #include <string.h>  #include <netdb.h>  #include <sys/types.h>  #include <netinet/in.h>  #include <sys/socket.h>  #define portnumber 88

linux网络编程之TCP/IP基础(二) 利用ARP和ICMP协议解释ping命令

一.MTU 以太网和IEEE 802.3对数据帧的长度都有限制,其最大值分别是1500和1492字节,将这个限制称作最大 传输单元(MTU,Maximum Transmission Unit) 如果IP层有一个数据报要传,而且数据的长度比链路层的MTU还大, 那么IP层就要进行分片(Fragmentation),把数据报分成若干片,这样每一片都小于MTU. 当网络上的两台主机互相 进行通信时,两台主机之间要经过多个网络,每个网络的链路层可能有不同的MTU,其中两台通信主机路径中的最小MTU被称

linux网络编程之socket(九) 使用select函数改进客户端/服务器端程序

一.当我们使用单进程单连接且使用readline修改后的客户端程序,去连接使用readline修改后的服务器端程序,会出 现一个有趣的现象,先来看输出: 先运行服务器端,再运行客户端, simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$ ./echoser_recv_peek recv connect ip=127.0.0.1 port=54005 simba@ubuntu:~/Documents/code/linux_prog