文档章节

Head First C 第十一章 网络与套接字 创建knock-knock 服务器 part I

AlexTuan
 AlexTuan
发布于 2016/04/24 12:42
字数 1166
阅读 47
收藏 1

Head First C 第十一章 网络与套接字 创建knock-knock 服务器 part I

关于套接字

套接字是一种数据流。

用途:不同计算机通过互联网进行通信。

服务器可以与多个客户端进行通信,客户端与服务器将展开一段结构化对话,被称为协议。协议通畅有一套严格的规则,客户端和服务器都严格遵守这套规则就没事,只要其中一方违反了规则,对话就会戛然而止。

BLAB:服务器连接网络四部曲

为了与外界沟通,C程序用数据流读写字节。到目前为止,我们使用过文件,标准输入,标准输出三种数据流。如果想与网络通信,就需要引入一种新的数据流——套接字

在使用套接字与客户端程序通信前,服务器要经历四个阶段:绑定(Bind)、监听(Listen)、接受(Accept)、开始(Begin),首字母缩写为BLAB。

绑定端口

计算机可能运行多个服务器程序,为了防止不同对话发生混淆,每项服务必须使用不同的端口。服务器在启动时,需要告诉系统要使用哪个端口,这个过程叫做端口绑定,knock-knock服务器将使用30000端口,为了绑定它,我们需要两样东西:套接字描述符套接字名。套接字名是一个表示“互联网30000端口”的结构。

  1. 创建套接字描述符

    
    	  int listener_d = socket(PF_INET, SOCK_STREAM, 0);
      if (listener_d == -1) {
        error("Can't open socket");
      }
      int reuse = 1;
    	  if (setsockopt(listener_d, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse,
                 sizeof(int)) == -1)
      error("Can't set the reuse option on the socket");
    
    

    这步操作是要打开套接字,socket函数接收3个参数

    
    	int socket(int domain, int type, int protocol);
    
    

    分别是:域、类型和协议,我们选用的PF_INET表示使用ipv4协议族,SOCKADDR_STREAM表示序列化的、可靠的、双向通信的字节流。0代表的是协议,协议用来制定一个特定的用于当前socket的协议,通常只用已有的协议族里的一个协议。

    另外,绑定端口有延时:当你在某个端口绑定了套接字,在接下来的30秒内,操作系统不允许任何程序再绑定它,包括上一次绑定这个端口的程序。所以当你关闭服务器再立即重启,在很多系统下很可能会失败。所以我们要设置reuse:

    
    	  setsockopt(listener_d, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse,sizeof(int))
    
    

    该函数接收5个参数,分别是:套接字描述符、级别、设置选项、要设置的值和选项长度。

  2. 创建套接字名

    
    	  struct sockaddr_in name;
    	  name.sin_family = PF_INET;
    	  name.sin_port = (in_addr_t)htons(30000);
    	  name.sin_addr.s_addr = htonl(INADDR_ANY);
    
    

    创建一个sockaddr_in套接字,然后指定协议,端口。

  3. 绑定

    
    	  int c = bind(listener_d, (struct sockaddr *)&name, sizeof(name));
      if (c == -1)
      error("Can't bind port");
    
    

    绑定函数接收套接字描述符、套接字名的地址,以及套接字名的长度。

监听端口

如果有多个客户端来连接你的服务器,那么客户端需要排队,可以用listen()来告诉系统希望队列有多长:

  if (listen(listener_d, 10) == -1)
    error("Can't listen port");
  puts("waiting for connection...");
接受连接

一旦绑定端口,设置完等待队列,唯一可以做的就是等待。accept()系统调用会一直等待,直到有客户端连接服务器时,它会返回第二个套接字描述符,然后就可以用它通信了。

  struct sockaddr_storage client_addr;
  unsigned int address_size = sizeof(client_addr);
  int connect_d = accept(listener_d, (struct sockaddr *)&client_addr, &address_size);
  if (connect_d == -1)
    error("Can't open storage socket");

accept()系统调用接收三个参数:已创建并绑定端口的socket、连接实体的地址和连接实体的长度。

开始通信

套接字不是传统意义上的数据流

到目前为止,我们见过的数据流都一样,不管是连接文件的数据流,还是标准输入输出数据流,都可以用fprintf()fscanf()和它们通信。但套接字有一点点不同,它既可以作为输入,也可以作为输出,也就是说,要用其它函数与它通信。

如果想向套接字输出数据,就要用send()函数:

  char *msg = "Internet Knock-Knock Protocol Server\r\nVersion 1.0\r\nKnock!Knock!\r\n>";
  if(send(connect_d, msg, strlen(msg), 0) == -1)
    error("Send");

一定要检查系统调用的返回值,send()也不例外。网络错误随处可见,服务器必须处理它们。

代码

advice server sample

© 著作权归作者所有

AlexTuan
粉丝 4
博文 27
码字总数 17966
作品 0
程序员
私信 提问
Head First C 第十一章 网络与套接字 创建knock-knock服务器 partII

Head First C 第十一章 网络与套接字 创建knock-knock服务器 partII 继续上一小节socket使用的内容,创建一个Knock_Knock服务器。与上一节不同之处在于,我们要实现从客户端发送数据到服务器...

AlexTuan
2016/04/26
46
0
Linux多线程并发服务器编程(线程池,FTP服务器)

分享网盘下载:https://pan.baidu.com/s/1gfNCcXt 密码: irfk 内容简介 本课程从最基础的进程、线程概念讲起逐步深入,通过理论与实践结合的方式,使学员快说掌握linux多线程网络编程技术,并...

人气王子333
2018/06/26
0
0
25个必须记住的SSH命令

25个必须记住的SSH命令 OpenSSH是SSH连接工具的免费版本。telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的,但SSH是加密的,OpenSSH加密所有通信(包括密码),有...

guojianwei2008
2012/11/13
0
0
思科路由器恶意后门惊现,全球 19 个国家受威胁

国外媒体报道称,最近关于攻击思科系统路由器的事件相较过去又多了很多。据说目前19个国家至少79台设备受到安全威胁影响,其中还包括了美国的一家ISP网络服务提供商,旗下25台设备都存在恶意...

oschina
2015/09/18
4.6K
15
简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定

众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对...

晨曦之光
2012/04/10
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

zookeeper - leader选举

让我们分析如何在ZooKeeper集合中选举leader节点。考虑一个集群中有N个节点。leader选举的过程如下: 所有节点创建具有相同路径 /app/leader_election/guid_ 的顺序、临时节点。 ZooKeeper集...

Canaan_
18分钟前
5
0
金九银十裸辞跳槽面试,却被面试官吊打

目前已经达到金九银十的阶段,相信有不少程序员蠢蠢欲动,开始出去试试水,想要跳槽涨薪了!有一个朋友就想改变现状,于是找了大量网上的面试题,强行记下之后,开始出去“试水”。 他试水之...

别打我会飞
21分钟前
4
0
Spring 官方出品应用监控度量指标门面类库Micrometer介绍

前言 上篇文章 Spring Boot 2.x 中的 Actuator 我们提到了在Spring Boot Actuator中的metirc指标。在Spring Boot 2.x中 官方引入了新的监控门面(facade)类库Micrometer。如果你对门面不是很清...

码农小胖哥
50分钟前
7
0
获取form对象

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head> <......

前端老手
52分钟前
5
0
CSS-字体格式化

一、字体属性 1、自定字体的类型 font-family:黑体,华文彩云,宋体; 用逗号隔开多个字体类型 2、字体大小 font-size 取值:(1)以px为单位的数字 (2)以pt为单位的数字 (3)em/rem 3、...

wytao1995
55分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部