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

石家庄企业logo设计网站深圳优化建设

石家庄企业logo设计,网站深圳优化建设,婚恋网站哪家做的最好,渭南建设工程信息网(一)套接字Socket概念 Socket 中文意思是“插座”#xff0c;在 Linux 环境下#xff0c;用于表示进程 x 间网络通信的特殊文件 类型。本质为内核借助缓冲区形成的伪文件。 既然是文件#xff0c;那么理所当然的#xff0c;我们可以使用文件描述符引用套接字。Linux 系统…(一)套接字Socket概念 Socket 中文意思是“插座”在 Linux 环境下用于表示进程 x 间网络通信的特殊文件 类型。本质为内核借助缓冲区形成的伪文件。 既然是文件那么理所当然的我们可以使用文件描述符引用套接字。Linux 系统将其封装成文件的目的是为了统一接口使得读写套接字和读写文件的操作一致。 在 TCP/IP 协议中“IP 地址TCP 或 UDP 端口号”唯一标识网络通讯中的一个进程。 “IP 地址端口号”就对应一个 socket。 欲建立连接的两个进程各自有一个 socket 来标识那么这两个 socket 组成的 socket pair 就唯一标识一个连接。因此可以用 Socket 来描述网络连接的一对一关系。 在网络通信中套接字一定是成对出现的。一端的发送缓冲区对应对端的接收缓冲区。我们使用同一个文件描述符索发送缓冲区和接收缓冲区。 (二)TCP通信流程图 (三)Socket编程基础知识 1 网络字节序 在计算机世界里有两种字节序 大端字节序 - 低地址高字节,高地址低字节 小段字节序 - 低地址低字节,高地址高字节内存中的多字节数据相对于内存地址有大端和小端之分磁盘文件中的 多字节数据相对于文件中的偏移地址也有大端小端之分。网络数据流同样有 大端小端之分那么如何定义网络数据流的地址呢发送主机通常将发送缓 冲区中的数据按内存地址从低到高的顺序发出接收主机把从网络上接到的 字节依次保存在接收缓冲区中也是按内存地址从低到高的顺序保存因此 网络数据流的地址应这样规定先发出的数据是低地址后发出的数据是高 地址。 TCP/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 表示 hostn 表示 networkl 表示 32 位长整数s 表示 16 位短整数。 如果主机是小端字节序这些函数将参数做相应的大小端转换然后返回如 果主机是大端字节序这些函数不做转换将参数原封不动地返回。 2 socketaddr 数据结构 很多网络编程函数诞生早于 IPv4 协议那时候都使用的是 sockaddr 结构体, 为了向前兼容现在 sockaddr 退化成了void *的作用传递一个地址给 函数至于这个函数是 sockaddr_in 还是其他的由地址族确定然后函数 内部再强制类型转化为所需的地址类型 struct sockaddr {sa_family_t sa_family; /* 地址系列AF_xxx */char sa_data[14]; /* 14字节的协议地址 */ };struct sockaddr_in {sa_family_t sin_family; /* 地址族一般为AF_INET */in_port_t sin_port; /* 按网络字节顺序排列的端口*/struct in_addr sin_addr; /* 网络地址 */ };/* 网络地址 */ struct in_addr {uint32_t s_addr; /* 按网络字节顺序排列的网络地址 */ };IPv4 地址用 sockaddr_in 结构体表示包括 16 位端口号和 32 位 IP 地址 但是 sock API 的实现早于 ANSI C 标准化那时还没有 void *类型 因此这些像 bind 、accept 函数的参数都用 struct sockaddr * 类型表示 在传递参数之前要强制类型转换一下例如 struct sockaddr_in servaddr; bind(listen_fd, (struct sockaddr *)servaddr, sizeof(servaddr)); 3 IP地址转换函数 对于IP地址a.b.c.d 小端字节序和大端字节序分别表示: #include arpa/inet.h int inet_pton(int af, const char *src, void *dst); const char * inet_ntop(int af, const void *src, char *dst, socklen_t size);af 取值可选为 AF_INET 和 AF_INET6 即对应IPv4 和 IPv6 其中 inet_pton 和 inet_ntop 不仅可以转换 IPv4 的 in_addr 还可以转换 IPv6的 in6_addr。 因此函数接口是 void *dst 和 void *src。 (四)Socket 编程主要的函数介绍 1 套接字设置 socket() 头文件: #include sys/types.h #include sys/socket.h 函数原型: int socket(int domain, int type, int protocol);参数解释: domain: AF_INET 使用 TCP 或 UDP 来传输用Pv4 的地址 AF_INET6 与AF_INET类似不过是来用 IPv6 的地址 AF_UNIX 本地协议使用在 Unix 和 Linux 系统上一般都是当客户端和服务器在同一台及其上的时候使用type: SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket 类型这个socket 是使用TCP来进行传输。 SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的使用 UDP 来进行它的连接。 SOCK_SEQPACKET 该协议是双线路的、可靠的连接发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。 SOCK_RAW socket类型提供单一的网络访问这个 socket 类型使用 ICMP 公共协议。SOCK_RDM 这个类型是很少使用的在大部分的操作系统上没有实现它是提供给数据链路层使用不保证数据包的顺序protocol: 传 0 表示使用默认协议。返回值 成功返回指向新创建的 socket 的文件描述符 失败返回-1设置 errno 注意事项: 对于 IPv4domain 参数指定为 AF_INET。对于 TCP 协议type 参数指定为 SOCK_STREAM表示面向流的传输协议。如果是UDP协议则type参数指定为SOCK_DGRAM表示面向数据报的传输协议。protocol参数的指定为 0 即可。 2 绑定标签 bind() 头文件: #include sys/types.h #include sys/socket.h 函数原型: int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);参数解释: sockfd socket 文件描述符 addr: 构造出 IP 地址加端口号 addrlen: sizeof(addr)长度返回值 成功: 返回 0 失败: 返回-1, 设置 errno 注意事项: 服务器程序所监听的网络地址和端口号通常是固定不变的客户端程序得知 服务器程序的地址和端口号后就可以向服务器发起连接因此服务器需要调用 bind 绑定一个固定的网络地址和端口号。 bind()的作用是将参数 sockfd 和 addr 绑定在一起使 sockfd 这个用于网 络通讯的文件描述符监听 addr 所描述的地址和端口号。前面讲过struct sockaddr *是一个通用指针类型addr 参数实际上可以接受多种协议的 sockaddr 结构体而它们的长度各不相同所以需要第三个参数 addrlen 指定结构体的长 度。如 struct sockaddr_in servaddr; bzero(servaddr, sizeof(servaddr)); servaddr.sin_family AF_INET; servaddr.sin_addr.s_addr htonl(INADDR_ANY); servaddr.sin_port htons(6666);首先将整个结构体清零然后设置地址类型为 AF_INET网络地址为 INADDR_ANY 这个宏表示本地的任意 IP 地址因为服务器可能有多个网卡每个网卡也可能 绑定多个 IP 地址 这样设置可以在所有的 IP 地址上监听直到与某个客户端建 立了连接时才确定下来到底用哪个 IP 地址和端口号。 3 设置监听 listen() 头文件: #include sys/types.h #include sys/socket.h 函数原型 int listen(int sockfd, int backlog);参数解释: sockfd: socket 文件描述符 backlog: 在 Linux 系统中它是指排队等待建立 3 次握手队列长度注意事项: 查看系统默认 backlog cat /proc/sys/net/ipv4/tcp_max_syn_backlog 改变 系统限制的 backlog 大小 vim /etc/sysctl.conf 最后添加 net.core.somaxconn 1024 net.ipv4.tcp_max_syn_backlog 1024 保存然后执行 sysctl -p 4 接受连接 accept() 头文件: #include sys/types.h #include sys/socket.h 函数原型: int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);参数解释: sockdf: socket 文件描述符 addr: 传出参数返回链接客户端地址信息含 IP 地址和端口号 addrlen: sizeof(addr)大小函数返回时返回真正接收到地址结构体的大小返回值 成功: 返回一个新的 socket 文件描述符用于和客户端通信 失败: 返回-1设置 errno 注意事项: 三次握手完成后服务器调用 accept()接受连接如果服务器调用 accept() 时还没有客户端的连接请求就阻塞等待直到有客户端连接上来。addr 是一个 传出参数accept()返回时传出客户端的地址和端口号。addrlen 参数是一个传 入传出参数传入的是调用者提供的缓冲区 addr的长度以避免缓冲区溢出问题 传出的是客户端地址结构体的实际长度有可能没有占满调用者提供的缓冲区。 如果给 addr 参数传 NULL表示不关心客户端的地址。 服务器程序结构是这样的 while (1) {cliaddr_len sizeof(cliaddr);connfd accept(listenfd, (struct sockaddr *)cliaddr,cliaddr_len);n read(connfd, buf, MAXLINE);......close(connfd); }整个是一个 while 死循环每次循环处理一个客户端连接。由于 cliaddr_len 是传入传出参数每次调用 accept()之前应该重新赋初值。 accept()的参数 listenfd 是先前的监听文件描述符而 accept()的返回值是另外一个文件描述 符 connfd 之后与客户端之间就通过这个 connfd 通讯最后关闭 connfd 断开 连接而不关闭 listenfd再次回到循环开头 listenfd 仍然用作 accept 的参 数。accept()成功返回一个文件描述符出错返回-1。 5 请求连接 connect() 头文件: #include sys/types.h #include sys/socket.h 函数原型: int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);参数解释: sockdf: socket 文件描述符 addr: 传入参数指定服务器端地址信息含 IP 地址和端口号 addrlen: 传入参数,传入 sizeof(addr)大小返回值: 返回值 成功返回 0失败返回-1设置 errno 注意事项: 客户端需要调用 connect()连接服务器connect 和 bind 的参数形式一致 区别在于bind的参数是自己的地址而connect的参数是对方的地址。 (五)应用实例 1 服务端demo代码 #include stdio.h #include unistd.h #include sys/types.h #include sys/socket.h #include string.h #include ctype.h #include arpa/inet.h#define SERVER_PORT 6666int main(void) {//1创建连接的套接字int sock;sock socket(AF_INET, SOCK_STREAM, 0);//IPV4,TCP方式,默认协议//2设置标签(地址,端口号)struct sockaddr_in server_addr;bzero(server_addr, sizeof(server_addr)); //将server_addr的内容清零server_addr.sin_family AF_INET; //协议组IPV4server_addr.sin_addr.s_addr htonl(INADDR_ANY); //监听本地所有ipserver_addr.sin_port htons(SERVER_PORT); //设置端口号//3绑定标签bind(sock, (struct sockaddr*)server_addr, sizeof(server_addr));//4设置监听并指定监听最大数量listen(sock, 128);//5等待连接printf(等待客户端连接请求\n);int done 1;while (done) {//5-1有连接则重新分配套接字接受连接struct sockaddr_in clinet;int client_sock, len; //客户端的 套接字char client_ip[64]; //客户端的 ipchar buf[256]; //客户端的 发送的内容socklen_t client_addr_len; //套接字地址结构长度client_addr_len sizeof(clinet);//5-2接受分配的套接字client_sock accept(sock, (struct sockaddr*)clinet, client_addr_len);//5-3查看客户端IP和端口号inet_ntop(AF_INET, clinet.sin_addr.s_addr, client_ip, sizeof(client_ip));printf(客户端IP:%s ,端口号:%d\n, client_ip, ntohs(clinet.sin_port));//5-4客户端发来的数据len read(client_sock, buf, sizeof(buf) - 1);buf[len] \0;printf(收到客户端发来的长度为%d数据%s\n, len, buf);//5-4服务端给客户写数据len write(client_sock, buf, len);printf(已完成对客户端的写操作\n);close(client_sock);}close(sock);return 0; }2 客户端demo代码 #includestdlib.h #includestdio.h #includestring.h #includeunistd.h #includesys/socket.h #includearpa/inet.h#define SERVER_PORT 6666 #define SERVER_IP 127.0.0.1int main(int argc,char **argv) {int sockfd;char* message;struct sockaddr_in servaddr;int n;char buf[64];if (argc!2)//参数不合法{printf(参数不合法! ./xxxx.exe message\n);exit(-1);}message argv[1];//获取要发送的消息printf(待发送的数据:%s\n,message);//创建套接字sockfd socket(AF_INET,SOCK_STREAM,0);//将server_addr的内存初始化memset(servaddr,\0,sizeof(struct sockaddr_in));servaddr.sin_family AF_INET;inet_pton(AF_INET,SERVER_IP,servaddr.sin_addr);servaddr.sin_porthtons(SERVER_PORT);//连接服务器connect(sockfd, (struct sockaddr*)servaddr,sizeof(servaddr));//写数据write(sockfd,message,strlen(message));//读数据n read(sockfd,buf,sizeof(buf)-1);if (n0) {buf[n] \0;printf(收到的数据:%s\n,buf);}else {perror(error!!!);}printf(finished\n);close(sockfd);return 0; } 3演示效果:
http://www.hkea.cn/news/14410741/

相关文章:

  • 做网站不用服务器深圳企业学校网站建设
  • 网站在线备案网站建设专业名词
  • 哪里有网站开发团队杭州专业网站建设
  • 罗湖商城网站设计推荐新上市手机
  • 重庆做网站找谁h5case什么网站
  • 商城网站建设哪家效益快禹城建设局网站
  • 政务门户网站建设方案建设银行官方网站下载安装
  • 开发网站app公司优化seo哪家好
  • 招聘网站维护什么内容济南房产网官网
  • 珠海做网站需要多少钱微信公众号的模板网站
  • 站点提交网站建设企业站模板
  • 免费域名申请网站怎样用编程语言做网站
  • 个人主页网站申请做网站要服务器和什么
  • 东莞网站设计师湖北seo排名诊断
  • 温州旅游 网站建设网站建设重点是什么
  • 门户网站怎么做wordpress修改背景
  • 深圳网站建设方维网络网站建设实施计划
  • 暴利产品竞价单页网站seo优化方式包括
  • 给女朋友做网站 知乎医院网站建设台账
  • 网站后台无法更新缓存内蒙古建设部网站官网
  • 专业网站设计 网络服务网站的修改
  • 深圳宝安高端网站建设公司wordpress子站点解析
  • 专业的建设企业网站公司wordpress首页图片幻灯片播放
  • 如何做网站编辑 沒技术上海搜索引擎优化公司排名
  • 网站运营情况怎么写龙岩天宫山旅游攻略
  • 建筑公司网站应该则么做北京企业网站开发公司哪家好
  • 网站seo的推广计划用表格做网站教程
  • 邯郸网站建设xy0310网站建设只有20%的利润
  • 设计外包网站中小企业网站建设中服务器的解决方案是
  • jsp网站怎么做邮箱验证码西安百度seo