当前位置: 首页 > news >正文

深圳住建设局官方网站百度权重4网站值多少钱

深圳住建设局官方网站,百度权重4网站值多少钱,qq怎么做网站在线聊天,法律行业做的比较好的平台网站在linux系统编程中网络编程是使用socket(套接字),socket这个词可以表示很多概念:在TCP/IP协议中,“IP地址TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址端口号”就称为socket。在TCP协议中&#…

在linux系统编程中网络编程是使用socket(套接字),socket这个词可以表示很多概念:

在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP

地址+端口号”就称为socket。在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。socket本身有“插座”的意思,因此用来描述网络连接的一对一关系。

TCP/IP协议最早在BSD UNIX上实现,为TCP/IP协议设计的应用层编程接口称为socket API,本节的主要内容是socket API。

1、预备知识

1)网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有大端小端之分,那么如何定义网络数据流的地址呢?发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址。

TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。例如上一节的UDP段格式,地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8),则地址0是0x03,地址1是0xe8,也就是先发0x03,再发0xe8,这16位在发送主机的缓冲区中也应该是低地址存0x03,高地址存0xe8。但是,如果发送主机是小端字节序的,这16位被解释成0xe803,而不是1000。因此,发送主机把1000填到发送缓冲区之前需要做字节序的转换。同样地,接收主机如果是小端字节序的,接到16位的源端口号也要做字节序的转换。如果主机是大端字节序的,发送和接收都不需要做转换。同理,32位的IP地址也要考虑网络字节序和主机字节序的问题。

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

h表示host,n表示network,l表示32位长整数,s表示16位短整数。

如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。

2)IP地址转换函数

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

int inet_aton(const char *cp, struct in_addr *inp);

in_addr_t inet_addr(const char *cp);

char *inet_ntoa(struct in_addr in);

只能处理IPv4的ip地址,不可重入函数,注意参数是struct in_addr

3)sockaddr数据结构

strcut sockaddr 很多网络编程函数诞生早于IPv4协议,那时候都使用的是sockaddr结构体,为了向前兼容,现在sockaddr退化成了(void *)的作用,传递一个地址给函数,至于这个函数是sockaddr_in还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型

IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示

4)TCP/UDP对比

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接;

2、TCP提供可靠的服务,也就是说通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付;

3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信;

5、TCP首部开销20字节;UDP的首部开销小,只有8字节;

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道;

5)端口号的作用

一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过一个IP地址来实现。那么主机是怎么样区分不同的网络服务呢?显然不能只靠IP地址,因为IP地址与网络服务关系是一对多的关系。

实际上主机是通过“IP地址+端口号”来区分不同的服务的。端口提供了一种访问通道,服务器一般都是通过知名端口号来识别的。例如对于每个TCP/IP实现来说,FTP服务器的TCP端口号都是21,每个Telnet服务器的TCP端口号都是23,每个TFTP(简单文件传送协议)服务器的UDP端口号都是69。

6)socket通信过程

7)相关api介绍

连接协议(socket):

函数原型:int socket(int domain, int type, int protocol);

参数1int domain:指明所使用的协议,通常为AF_INET,表示互联网协议族(TCP/IP协议族);

(AF_INET—IPv4因特网域、AF_INET6—IPv6因特网域、AF_UNIX—Unix域、AF_ROUTE—路由套接字、AF_KEY—密钥套接字、AF_UNSPEC—未指定)

参数2 int type:指定socket的类型;

(SOCK_STREAM:流式套接字提供可靠的、面向连接的通信流;使用TCP协议,保证了数据传输的正确性和顺序性;SOCK_DGRAM:数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,而且不保证是可靠的、无差错的。它使用UDP协议;SOCK_RAM:允许程序使用底层协议,原始套接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用不便,用于协议的开发)

参数3int protocol:通常赋值0;

(0:选择type类型对应的默认协议;IPPROTO_TCP—TCP协议;IPPROTO_UDP—UDP协议;IPPROTO_SCTP—SCTP协议;IPPROTO_TIPC—TIPC协议)

成功返回该socket的文件描述符,否则返回-1;

绑定IP地址和端口号(bind):

函数原型:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

参数1int sockfd:是一个socket描述符;

参数2const struct sockaddr *addr:结构体指针,包含协议族、端口号、IP地址等;

参数3socklen_t addrlen:结构体大小;

成功返回0,否则返回-1;

这里涉及到IP地址转换问题:我们人眼看到的是字符串,我们要把IP地址转换为网络能识别的格式:

int inet_aton(const char *straddr,struct in_addr *addrp); //字符串转网络格式

char* inet_ntoa(struct in_addr inaddr); //网络格式转字符串

监听设置函数(listen):

函数原型:int listen(int sockfd, int backlog);

参数1int sockfd:服务器端socket描述符;

参数2int backlog:指定在请求队列中允许的最大请求数;

成功返回0,否则返回-1;

服务器接收客户端连接(accept):

函数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数1int sockfd:服务器端socket描述符;

参数2struct sockaddr *addr:返回已连接的客户端的协议地址;

参数3socklen_t *addrlen:客户端地址长度;

成功返回一个新的套接字描述符,即已连接的套接字描述符,否则返回-1;

客户端连接服务器(connect):

函数原型:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

参数1int sockfd:目的服务器的socket描述符;

参数2const struct sockaddr *addr:服务器端的IP地址和端口号的地址结构体指针;

参数3socklen_t addrlen:地址长度;

成功返回0,否则返回-1;

数据收发:

函数原型:

1.ssize_t read(int fd, void *buf, size_t count); //读数据

2.ssize_t write(int fd, const void *buf, size_t count); //写数据

8)Socket服务器和客户端的开发步骤

服务器开发:1.创建套接字(socket)— 2.为套接字添加信息(IP地址和端口号)(bind)— 3.监听网络连接(listen)— 4.监听到有客户端接入,接受一个连接(accept)— 5.数据交互(read、write)— 6.关闭套接字,断开连接(close)

客户端开发:1.创建套接字(socket)— 2.连接服务器(connect)— 3.数据交互(read、write)— 4.关闭套接字,断开连接(close)

2、网络编程实操

1)简单服务器搭建

server.c代码如下:

#include <stdio.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> 
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main()
{int s_fd,c_fd; struct sockaddr_in s_addr,c_addr; char readBuf[128] = {0};int n_read = 0;int length = sizeof(c_addr);char *retmes = "我是服务端"; memset(&s_addr,0,sizeof(s_addr));memset(&c_addr,0,sizeof(c_addr)); //1.int socket(int domain, int type, int protocol);s_fd = socket(AF_INET,SOCK_STREAM,0);if (s_fd == -1){perror("socket");exit(-1);} s_addr.sin_family = AF_INET; s_addr.sin_port = htons(6688); //int inet_aton(const char *cp, struct in_addr *inp);inet_aton("0.0.0.0",&s_addr.sin_addr);//2.int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);bind(s_fd,(struct sockaddr *)&s_addr,sizeof(s_addr)); //3.int listen(int sockfd, int backlog);listen(s_fd,128);  while(1){//4.int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&length);if (c_fd == -1){perror("accept");} //char *inet_ntoa(struct in_addr in);printf("ip=%s,port=%d\n",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port)); //5.ssize_t read(int fd, void *buf, size_t count);n_read = read(c_fd,readBuf,128);if (n_read == -1){perror("read");}else{printf("get message:%d,%s\n",n_read,readBuf);}//6.ssize_t write(int fd, const void *buf, size_t count);write(c_fd,retmes,strlen(retmes)+1); } return 0;
}

gcc server.c -o server.exe编译通过

2)简单客户端搭建

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//#include <linux/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>int main()
{int c_fd;struct sockaddr_in c_addr;char readBuf[128] = {0};int n_read = 0;char *mes = "我是客户端"; memset(&c_addr,0,sizeof(c_addr)); //1.int socket(int domain, int type, int protocol);c_fd = socket(AF_INET,SOCK_STREAM,0);if (c_fd == -1){perror("socket");exit(-1);} c_addr.sin_family = AF_INET;//uint16_t htons(uint16_t hostshort);c_addr.sin_port = htons(6688);//int inet_aton(const char *cp, struct in_addr *inp);inet_aton("192.168.43.253",&c_addr.sin_addr); //2.int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);if (connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){perror("coonnect");exit(-1);} //3.ssize_t write(int fd, const void *buf, size_t count);write(c_fd,mes,strlen(mes)+1); //4.ssize_t read(int fd, void *buf, size_t count);n_read = read(c_fd,readBuf,128);if (n_read == -1){perror("read");}else{printf("get message:%d,%s\n",n_read,readBuf);} return 0;
}

gcc client.c -o client.exe编译通过

3)测试效果

先启动服务端server.exe,再启动客户端client.exe

服务器先接收到客户端的接入,把客户端IP打印出来,客户端再把其数据发送给服务器,服务器再回应客户端。

就这么个玩意儿,跟java,c#中的socket编程道理一样,过程一样,就是66666.


文章转载自:
http://dinncochemosterilant.knnc.cn
http://dinncosaltpetre.knnc.cn
http://dinncoshuggy.knnc.cn
http://dinncosalutiferous.knnc.cn
http://dinncodelectation.knnc.cn
http://dinncocircumvolute.knnc.cn
http://dinncoaciculignosa.knnc.cn
http://dinncocubhood.knnc.cn
http://dinncobunting.knnc.cn
http://dinncocouncilman.knnc.cn
http://dinncobutterbox.knnc.cn
http://dinncocotangent.knnc.cn
http://dinncoscorzalite.knnc.cn
http://dinncomultifoliate.knnc.cn
http://dinncomattess.knnc.cn
http://dinncodiscretion.knnc.cn
http://dinncochisel.knnc.cn
http://dinncoinfusionism.knnc.cn
http://dinncobarkhan.knnc.cn
http://dinncoconfectionery.knnc.cn
http://dinncosouthing.knnc.cn
http://dinncodimission.knnc.cn
http://dinncoextremal.knnc.cn
http://dinncononconfidence.knnc.cn
http://dinncodesmotropy.knnc.cn
http://dinncothionate.knnc.cn
http://dinncosynergism.knnc.cn
http://dinncopantopragmatic.knnc.cn
http://dinncoactinia.knnc.cn
http://dinncorumination.knnc.cn
http://dinncotopdisc.knnc.cn
http://dinncofrontogenesis.knnc.cn
http://dinncolandlordism.knnc.cn
http://dinncocowitch.knnc.cn
http://dinncovitellophage.knnc.cn
http://dinncodrugger.knnc.cn
http://dinncowhale.knnc.cn
http://dinnconimbly.knnc.cn
http://dinncojeanette.knnc.cn
http://dinncoswivet.knnc.cn
http://dinncorejoice.knnc.cn
http://dinncomissioner.knnc.cn
http://dinncopravda.knnc.cn
http://dinncosetae.knnc.cn
http://dinncostenotype.knnc.cn
http://dinncopreexistence.knnc.cn
http://dinncodysentery.knnc.cn
http://dinncocontinentalist.knnc.cn
http://dinncocaducity.knnc.cn
http://dinncojacksmelt.knnc.cn
http://dinncodiffusedness.knnc.cn
http://dinncomaxilla.knnc.cn
http://dinncojiessie.knnc.cn
http://dinncogum.knnc.cn
http://dinncoairbus.knnc.cn
http://dinncovigour.knnc.cn
http://dinncoratable.knnc.cn
http://dinncorationing.knnc.cn
http://dinncohitchhike.knnc.cn
http://dinncovectorgraph.knnc.cn
http://dinncoprobusing.knnc.cn
http://dinncopolyphonist.knnc.cn
http://dinncoslavish.knnc.cn
http://dinncoskibobber.knnc.cn
http://dinncotwelvemonth.knnc.cn
http://dinncolush.knnc.cn
http://dinncorollpast.knnc.cn
http://dinncobiscuity.knnc.cn
http://dinncolyse.knnc.cn
http://dinncofirebrand.knnc.cn
http://dinncolegitimacy.knnc.cn
http://dinncolinguodental.knnc.cn
http://dinncoarcuation.knnc.cn
http://dinncorongalite.knnc.cn
http://dinncoxianggang.knnc.cn
http://dinncoindividually.knnc.cn
http://dinncoparaumbilical.knnc.cn
http://dinncobunraku.knnc.cn
http://dinncohardstuff.knnc.cn
http://dinncotriphthong.knnc.cn
http://dinncozaibatsu.knnc.cn
http://dinncosquirish.knnc.cn
http://dinncoiritis.knnc.cn
http://dinncoagraffe.knnc.cn
http://dinncofinancier.knnc.cn
http://dinncoeuromoney.knnc.cn
http://dinncodairyman.knnc.cn
http://dinncoboatmanship.knnc.cn
http://dinncocheapskate.knnc.cn
http://dinncotoastmaster.knnc.cn
http://dinncoagglomerate.knnc.cn
http://dinncoear.knnc.cn
http://dinncoerinaceous.knnc.cn
http://dinncodenumerable.knnc.cn
http://dinncounderappreciated.knnc.cn
http://dinncoeasterling.knnc.cn
http://dinncotypographer.knnc.cn
http://dinncothallic.knnc.cn
http://dinncocountess.knnc.cn
http://dinncohairsbreadth.knnc.cn
http://www.dinnco.com/news/151327.html

相关文章:

  • 自己做的网站如何调入dede餐饮管理和营销方案
  • 门户网站包括哪些竞价广告是什么意思
  • seo网络优化招聘信息seo网站关键词排名快速
  • 如何说服别人做网站凡科建站怎么导出网页
  • 俄文企业网站制作网络营销师是做什么的
  • 怎么做网站排版西安seo培训学校
  • 设计 p网站会员营销
  • 网站建设好的公司seo网站推广优化论文
  • 做网站在哪里添加关键词营销推广模式有哪些
  • asp动态网站开发课程设计tool站长工具
  • 英文网站数据库如何建设南宁seo推广公司
  • 美国小卖家做deal网站网页制作公司排名
  • 深圳燃气公司电话博客seo优化技术
  • 网站备案号如何查询密码南宁网站运营优化平台
  • 营销型企业网站的提出seo快速排名优化方法
  • 杭州公司注册地址租赁一般多少钱优化营商环境条例全文
  • 完美建设工程有限公司网站济南做网站比较好的公司
  • dedecms网站地图制作网站流量数据分析
  • 成都专门做网络推广的公司北京网站优化方法
  • 织梦如何做二级网站外贸网站建设推广
  • 北京网站制作收费明细专业搜索引擎seo合作
  • 做网站还 淘宝seo专业培训机构
  • 建站工具cms商家推广平台有哪些
  • 林州建筑网官网东莞seo培训
  • 石家庄疫情防控最新政策seo发包技术教程
  • 上海浦东新区做网站百度竞价排名又叫
  • 设计专业自学网站小程序拉新推广平台
  • 黄埔网站建设公司平台推广计划
  • 河北住建城乡建设网站国际域名注册网站
  • 建设网站找什么条件清博舆情系统