socket"); } else printf("创建成功:sockfd=%d\n",sockfd); //2.绑定ip、端口,bind()函数 struct sockaddr_in addr ;//创建地址类型...bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)); /* sockaddr_in 结构体,然后再强制转换为 sockaddr 类型,sockaddr 和...这两个结构体的长度相同,强制转换类型时不会丢失字节,也没有多余的字节。...可以认为,sockaddr 是一种通用的结构体,可以用来保存多种类型的IP地址和端口号,而 sockaddr_in 是专门用来保存 IPv4 地址的结构体 */ while(1)//持续监听 { /...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
A proposal for how to make incompatible changes from Go 1 to Go 2 while breaking...
&serv_addr 1.结构体指针,指针也可以指向一个结构体 2.强制类型转换的格式为:(type_name) expression 3.地址符&,取得一个变量的地址 4.将内存中字节的编号称为地址(...Address)或指针(Pointer),一般认为变量名表示的是数据本身,而函数名、字符串名和数组名表示的是代码块或数据块的首地址 serv_addr.sin_family = AF_INET; 1.给结构体成员赋值...char buffer[40]; 1.定义一个字符数组,字符数组实际上是一系列字符的集合,也就是字符串,在C语言中,没有专门的字符串变量 2.赋值的时候,可以直接将字符串直接赋值给字符数组,也可以不指定数组长度... #include #include #include int main(){ //创建套接字...include #include #include #include int main(){ //创建套接字
// src:第一个函数尝试转换由src指针所指向的字符串,并通过dst指针存放二进制结果 // inet_ntop进行相反的转换,从数值格式(addrptr)转换到表达式(strptr)。...传递一个地址给函数,然后由函数内部再强制类型转换为所需的地址类型。.../ }; //这两个数据类型是等效的,可以相互转换,通常使用sockaddr_in更为方便 补充1: sockaddr和sockaddr_in的抉择: 前者是通用的套接字结构体,它可以在不同的协议族之间进行强转...由于两个结构体的大小一致,所以进行地址结构设置的时候,通常的方法是使用后者进行配置,然后强制转换为前者的结构体类型,这样不会有任何副作用。 ②网络套接字函数 基于流套接字的网络编程流程: ?...想起一个朋友说: 一天不练,自己知道; 两天不练,同行知道; 三天不练,观众知道。 网络编程这块可不能丢。
也叫套接字)进行创建,随后配合绑定信息,接着进行配置信息的bind 绑定;绑定了信息后,通过该信息进行isten 监听,监听后若有链接则connect 连接,再接下来开始使用accept 接收请求,得到请求后可以选择接受...这是进行 socket 编程的步骤,如果你要问为什么要这样做…我只能回答你规定的流程就这样,因为你要进行通信,那肯定需要创建一个 socket ,创建完毕后那么肯定要绑定你要通信的信息,如果你不绑定你怎么知道你要跟谁说话呢...不不不,我们写法有一些不同,需要用一个函数 MAKEWORD 对版本进行生成,就像这样 WSAStartup(MAKEWORD(2, 2), &wsadata);,规定咱们使用 MAKEWORD 告诉...sockaddr 是个系统用,而 sockaddr 是用来强制转换 sockaddr_in 结构体给系统调用的函数用。是不是迷茫?不要迷茫,一般都是这样做,那就这样做吧。...你只需要记住,sockaddr 保存信息然后就别管了,而sockaddr 咱们就用来给参数给函数用。
if(WSAStartup(MAKEWORD(2,0),&WSAData)==SOCKET_ERROR) //启动winsock ,WSAStartup()函数对Winsock DLL进行初始化...//sockaddr_in结构用来标识TCP/IP协议下的地址,可强制转换为sockaddr结构 ServerAddr.sin_family=AF_INET; //sin_family...WSAData; if(WSAStartup(MAKEWORD(2,0),&WSAData)==SOCKET_ERROR) //WSAStartup()函数对Winsock DLL进行初始化...; //sockaddr_in结构用来标识TCP/IP协议下的地址,可强制转换为sockaddr结构 ClientAddr.sin_family=AF_INET...//sockaddr_in结构用来标识TCP/IP协议下的地址,可强制转换为sockaddr结构 ClientAddr.sin_family = AF_INET;
区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。...传递一个地址给函数,至于这个函数是sockaddr_in还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。...比如: struct sockaddr_in addr; //创建对象 //初始化addr addr.sin_family = AF_INET/AF_INET6;//(ipv4 或ipv6) addr.sin_port...API的实现早于ANSI C标准化,那时还没有void * 类型,因此这些函数的参数都用struct sockaddr *类型表示,在传递参数之前要强制类型转换一下,例如: struct sockaddr_in...SOCK_SEQPACKET该协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
其他套接字地址结构的指针被强制转换为通用套接字地址结构的指针类型,ANSI C 定义了 void * 来解决这个问题 struct sockaddr { uint8_t sa_len...&serv, sizeof(serv)); 从应用程序开发的角度来看,这些通用套接字结构的唯一用途就是对指向特定于协议的套接字地址结构的指针执行类型强制转换 3).IPv6套接字地址结构 IPv6...如果成功返回1,否则返回0,inte_addr进行相同的转换,返回值为32位的网络字节序二进制值,一般用inet_aton来代替代替inet_addr....注意这个函数以结构为参数,而不是指向结构的指针。...strptr指针指向的字符串,并通过addrptr指针存放二进制结果,inet_ntop函数进行相反的转换,从数值格式(addrptr)转换到表达格式(strptr),len参数是目标存储单元的大小 7
但是,如果发送主机是小端字节序的,这16位被解释成0xe903,而不是1001。因此,发送主机把1001填写到发送缓冲区之前需要做字节的转换。...,至于这个函数是sockaddr_in还是其他的,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。...*类型表示,在传递参数之前要强制类型转换一下,例如: 示例: ---- IP地址转换函数 #include int inet_pton(int af, const...SOCK_SEQPACKET该协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。...struct sockaddr *是一个通用指针类型,addr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度。
关于具体细节,可以man socket进行查阅。...; struct in_addr sin_addr; }; struct in_addr { uint32_t s_addr; } sockaddr_in需要强制转换为struct sockaddr...addr; //填充结构 addr.sin_family = AF_INET; addr.sin_port= htons(8001); //主机字节序转换为网络字节序 addr.sin_addr...该参数填充为NULL时,不接收任何信息。 addrlen:返回对等方的套接字地址长度。如果不关心可以设置为NULL,否则一定要初始化。...servaddr.sin_port = htons(5888); servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); /*进行连接
而IP分源IP和目的IP,源IP和目的IP对一个报文来讲,是起从哪里来,到哪里去的作用,其最大的意义是指导报文该如何进行路径的选择,而路径中,每一个“站点”就是MAC地址的变化。...一个进程可以关联多个端口号,而一个端口号不能关联多个进程。 网络是一份共享资源 要在网络上进行进程间通信,我们首先需要找到目标主机,然后找到该主机上的服务(进程),完成进程间通信。...例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。...如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。...socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain
参数 int sockfd : 网络套接字 const struct sockaddr *addr :填充创建服务器所需的地址信息,详细的成员看1.3章节。...在填充结构体的时候为了方便填充参数,使用struct sockaddr_in结构体,给函数赋值的时候需要强制转换为struct sockaddr类型的结构体。...Internet 上数据以高位字节优先顺序在网络上传输, 所以对于在内部是以低位字节优先方式存储数据的机器, 在 Internet 上传输数据时就需要进行转换, 否则就会出现数据不一致。...给struct sockaddr_in结构体的端口成员赋值的时候就需要用到以上大端转小端函数进行转换!...但这种做法是TCP协议不推荐使用的,在某些情况下这个操作可能会带来错误。
比如QQ之间进行通讯,,可以看作是两个不同主机之间进程之间的通讯,主机与主机之间通过ip地址不走错,而进程带有一个端口号,每个主机都有独一无二的IP而一台主机上的每个进程都有唯一的端口号。...accept(): 接受客户端的连接请求,并创建一个新的套接字用于与客户端进行通信。...在进行跨网络通信时我们需要传递的端口号和IP地址,而本地通信则不需要。...网络的设计者想要把跨网络通信和本地通信进行大一统,因此套接字提供了sockaddr_in结构体和sockaddr_un结构体,其中sockaddr_in结构体是用于跨网络通信的(网络套接字),而sockaddr_un...socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain
在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下: typedef unsigned short sa_family_t;...unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE -...的大小和结构体struct sockaddr的大小相等 */ }; struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式,二者长度一样...二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。...32位IP地址 struct in_addr { unsigned long s_addr; }; BSD网络软件中包含了两个函数,用来在二进制地址格式和点分十进制字符串格式之间相互转换
服务端和客户端通信本质是在各自机器上创建一个文件,称为socket(套接字),然后对该socket文件进行读写。...addrlen:addr的大小,直接通过sizeof得到 我们先看看socket和bind的绑定代码,下面代码中,我们将创建的socket与ip='127.0.0.1',port=8888进行绑定: #...*)&server_addr, sizeof(server_addr)); 可以看到,我们使用sockaddr_in结构体设置要绑定的地址信息,然后再强制转换为sockaddr类型。...是保存IPv4的结构体;sockadd_in6是保存IPv6的结构体;sockaddr是通用的结构体,通过将特定协议的结构体转换成sockaddr,以达到bind可绑定多种协议的目的。...accpet返回一个新的套接字,之后服务端用这个套接字与连接对应的客户端进行通信。
, 为了方便一般是使用SOCKADDR_IN来保存IP地址,然后在需要填入SOCKADDR的时候强制转化即可。...sockaddr_in6 该结构类似于sockaddr_in,只不过它表示的是IPV6的地址信息,在使用上,由于IPV6是128的地址占16个字节,而sockaddr_in 中表示地址的部分只有4个字节...各种地址之间的转化 一般我们只使用从SOCKADDR_IN到sockaddr结构的转化,而且仔细观察socket函数族发现只需要从其他结构中得到sockaddr结构,而并不需要从sockaddr转化为其他结构...,因此这里重点放在如何转化为sockaddr结构 从SOCKADDR_IN到sockaddr只需要强制类型转化即可 从addrinfo结构中只需要调用其成员即可 从SOCKADDR_STORAGE结构到...sockaddr只需要强制转化即可。
**主机是大端还是小端在函数内部会自己进行判断。 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回。 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。...不用担心,未来网络发送的时候所有数据都是字符串;发送数据时使用的原生接口对于字符串信息自动转化 socket套接字接口 socket常见API // 创建 socket 文件描述符 (TCP/UDP,...*addr,socklen_t addrlen); IP地址+端口号能够标识该主机上的唯一的一个进程:ip和端口号port就叫为套接字,socket就是插座的意思,未来进行网络通信时,插头和插座配套使用...我们两个结构体都不用,直接用sockaddr。未来进行网络编程时,如果是网络通信,填充的网络信息是struct sockaddr_in这个结构体。...比如说我们想用网络通信,虽然参数是const struct sockaddr *addr,但实际传递进去的却是sockaddr_in结构体(类型不一样,要强制类型转换)。
例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。...如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回; 如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回。...*类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数...,myaddr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度; myaddr的初始化: ?...accept()返回后立刻调用read(), 读socket就像读管道一样, 如果没有数据到达就阻塞等待; 这时客户端调用write()发送请求给服务器, 服务器收到后从read()返回,对客户端的请求进行处理
对发出数据主机作出响应 2、源MAC地址和目的MAC地址 大部分数据的传输都是跨局域网的,数据在传输过程中会经过若干个路由器,最终才能到达对端主机 源MAC地址和目的MAC地址是包含在链路层的报头当中的,而MAC...如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回 二、socket编程接口 1、sockaddr结构 套接字不仅支持跨网络的进程间通信...,还支持本地的进程间通信(域间套接字) 因此套接字提供了sockaddr_in结构体和sockaddr_un结构体,其中sockaddr_in结构体是用于跨网络通信的,而sockaddr_un结构体是用于本地通信的...*类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数...用来表示一个IPv4的IP地址,其实就是一个32位的整数 2、socket 常见API 函数原型: #include #include // 创建
// src:第一个函数尝试转换由src指针所指向的字符串,并通过dst指针存放二进制结果 // inet_ntop进行相反的转换,从数值格式(addrptr)转换到表达式(strptr)。...传递一个地址给函数,然后由函数内部再强制类型转换为所需的地址类型。.../ }; //这两个数据类型是等效的,可以相互转换,通常使用sockaddr_in更为方便 补充1: sockaddr和sockaddr_in的抉择: 前者是通用的套接字结构体,它可以在不同的协议族之间进行强转...由于两个结构体的大小一致,所以进行地址结构设置的时候,通常的方法是使用后者进行配置,然后强制转换为前者的结构体类型,这样不会有任何副作用。...而recv和send函数就是对这两个函数进行操作。
领取专属 10元无门槛券
手把手带您无忧上云