Linux 网络编程——socket编程

二、网络编程基础

1、套接字概述

       套接字就是网络编程的ID。网络通信,归根到底还是进程间的通信(不同计算机上的进程间的通信)。在网络中,每一个节点(计算机或路由器)都有一个网络地址,也就是IP地址,两个进程通信时,首先要确定各自所在网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中哪一个进程通信,因此套接口中还需要有其他的信息,也就是端口号(port)。在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应的关系。所以,使用端口号和网络地址的组合就能唯一确定整个网络中的一个网络进程。

      把网络地址和端口号信息放在一个结构体中,也就是套接口地址结构,大多数的套接口函数都需要一个指向套接口地址结构的指针作为参数,并以此来传递地址信息。每个协议族都定义了它自己的套接口地址结构,套接字地址结构都以"sockaddr_” 开头,并以每个协议族名中两个字母作为结尾。

     下面是socket所在位置:

可以看到套接口有3种类型:

1)流式套接字(SOCK_STREAM)

      流式套接字提供可靠的、面向连接的通信刘,保证数据传输的可靠性和按序收发。TCP通信使用的就是流式套接字。

2)数据包套接字(SOCK_DGRAM)

      数据报套接字实现了一种不可靠、无连接的服务。数据通过相互独立的报文进行传输,是无序的,并且不保证可靠的传输。UDP通信使用的就是数据报套接字。

3)原始套接字(SOCK_RAW)

     原始套接字允许对底层协议(如IP或ICMP)进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。

 

2、端口号

      这里的端口号是逻辑意义上的端口,一般是指TCP/IP 协议中的端口,端口号的范围为0~65535,比如用于浏览网页服务(HTTP协议)的80端口,用于FTP服务的21端口等。其中, 0 到1023 一般被系统程序所使用。

     那么TCP/IP协议中的端口指的是什么呢?举个例子,如果IP地址唯一指定了地球上某个地理位置的一间房子,端口号就是出入这间房子的门,只不过这个房子的门有65536个之多,端口是通过端口号来标记的,端口号是一个16位的整数,范围是从0~65535。

    端口号只具有本地意义,即端口号只是为了标识本地计算机上的各个进程。在互联网中不同计算机的相同端口号是没有联系的。16bit 的端口号可允许有64K个端口号,这个数目对一个计算机来说是足够用的。

 

3、IP地址

1)IP地址的作用

       IP地址用来表示网络中的一台主机。准确的说,IP地址是一台主机到一个网络的一个连接,因为现在一个主机中会有多个网卡。

      一个IP地址包含两部分:网络号和主机号。其中,网络号和主机号根据子网掩码来区分。简单的说,有了源IP 和目标 IP,数据包就能在不同主机之间传输。

2)IP地址格式转换

      IP地址有两种不同格式:十进制点分形式和32位二进制形式。前者是用户熟悉的形式,而后者则是网络传输中IP地址的存储方式。

      这里主要介绍IPV4地址转换函数,主要有 inet_addr() 、inet_aton() 、inet_ntoa() 。前两者的功能都是将字符串转换成32位网络字节序二进制值,第三个将32位网络字节序二进制地址转换成点分十进制的字符串。

inet_addr() 函数语法如下:

所需头文件#include <arpa/inet.h>
函数原型int  inet_addr(const char *strptr);
参数

strptr :要转换的IP地址字符串

函数返回值

成功:32位二进制IP地址(网络字节序)

出错:-1

inet_aton() 函数语法如下:

所需头文件#include <arpa/inet.h>
函数原型int  inet_aton(int family, const char *src , void *drt);
参数

family   AF_INET:IPV4协议

             AF_INET6:IPV6协议

src:要转换的IP地址字符串

函数返回值

成功:32位二进制IP地址(网络字节序)

出错:-1

inet_ntoa() 函数语法如下:

所需头文件#include <arpa/inet.h>
函数原型int  inet_ntoa(int family, const char *src , void *dst, size_t len);
参数

family   AF_INET:IPV4协议

             AF_INET6:IPV6协议

src:要转换的二进制IP地址;
dst:存放十进制地址字符串的缓冲区;
len:缓冲区的长度

函数返回值

成功:返回dst

出错:NULL

 

4、字节序

      字节序又称为主机字节序 Host Byte Order,HBO,是指计算机中多字节整型数据的存储方式。字节序有两种:大端(高位字节存储在低位地址,低位字节存储在高位地址)和小端(和大端序相反,PC通常采用小端模式)。

      为什么需要字节序?在网络通信中,发送方和接收方有可能使用不同的字节序;


为了保证数据接受后能被正确的解析处理,统一规定:数据以高位字节优先顺序在网络上传输。因此数据在发送前和接收后都需要在主机字节序和网络字节序之间转换。



1)函数说明

      字节序转换涉及4个函数:htons() 、ntohs() 、htonl() 和 ntohl() 。这里的 h 代表 host , n 代表 network , s 代表 short , l 代表 long 。通常 16bit 的IP端口号用前两个函数处理,而 IP 地址用后两个函数来转换。调用这些函数只是使其得到相应的字节序,用户不需要知道该系统的主机字节序和网络字节序是否真的相等。如果两个相同不需要转换的话,该系统的这些函数会定义成空宏。

2)函数格式

所需头文件#include <netinet/in.h>
函数原型unit16_t htons(unit 16_t hostshort);
unit32_t htonl(unit 32_t hostlong);
unit16_t ntohs(unit 16_t netshort);
unit32_t ntohl(unit 32_t netlong);
函数传入值hostshort:主机字节序的16bit 数据
hostlong :主机字节序的32t 数据
netshort  :网络字节序的16bit 数据
netlong:网络字节序的32bitt 数据
函数返回值成功:返回转换字节序后的数值
出错:-1

5、TCP编程

函数说明

socket()编程的基本函数有socket() 、bind()、listen()、accept()、send()、sendto()、recv()以及recvfrom()等。下面先简单介绍上述函数的功能,再结合流程图具体说明

1)socket() :该函数用于创建一个套接字,同时指定协议和类型。

2)bind()     :该函数将保存在相应地址结构中的地址信息与套接字进行绑定。它主要用于服务器端,客户端创建的套接字可以不绑定地址。

3)listen()   :在服务端程序成功建立套接字并与地址进行绑定以后,通过调用listen() 函数将TCP连接后,该函数会返回一个新的已连接套接字。

5)connect():客户端通过该函数向服务器端的监听套接字发送连接请求。

6)send() 和 recv():这两个函数通常在TCP通信过程中用于发送和接收数据,也可用于UDP中。

7)sendto()和recvfrom() :这两个函数一般在UDP通信过程中用于发送和接受数据。当用于TCP时,后面的几个与地址有关的参数不起作用,函数作用等同于 send() 和 recv()


服务器端和客户端使用TCP的流程如下:



可以看到通信工作的大致流程如下:

1)服务器先用socket() 函数来建立一个套接口,用这个套接口完成通信的监听及数据的收发;

2)服务器用bind() 函数来绑定一个端口号和IP地址,使套接口与制定的端口号和IP地址相关联;

3)服务器调用listen()函数,使服务器的这个端口和IP处于监听状态,等待网络中某一客户机的连接请求。

4)客户机调用socket()函数建立一个套接口,设定远程IP和端口。

5)客户机调用 connect() 函数链接远程计算机指定的端口。

6)服务器调用 accept() 函数来接受远程计算机的连接请求,建立起与客户机之间的通信连接。

7)建立连接以后,客户机用write() 函数 (或send()函数)向socket() 中写入数据,也可以用 read() 函数(或recv()函数)读取服务器发送来的数据。

8)服务器用 read()函数(或recv()函数)读取客户机发送来的数据,也可以用 write() 函数(或send()函数)来发送数据。

9)完成通信以后,使用close()函数关闭socket 连接。


函数格式:

1)创建套接口 socket() 函数

其语法要点

所需头文件#include <sys/socket.h>
函数原型 int socket(int family, int type,int protocol);
函数传入值family:协议族
type:套接字类型
protocol:0(原始套接字除外)
函数返回值成功:非负套接字描述符
出错:-1

参数family 指明协议族,取值如:

AF_INET:IPv4协议

AF_INET6:IPv6协议

AF_LOCAL:UNIX域协议

AF_ROUTE:路由套接字

AF_KEY:密钥套接字

这里“AF”代表“Adress Family”(地址族)

types指明通信字节流类型,其取值如:

SOCK_STREAM:流式套接字(TCP方式)

SOCK_DGRAM:数据包套接字(UDP方式)

SOCK_RAM:原始套接字


2)绑定端口 bind()函数

     用socket() 函数创建一个套接口后,需要使用bind 函数在这个套接口上绑定一个指定的端口号和IP地址。bind函数原型如下:

所需头文件#include <sys/socket.h>
函数原型 int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
函数传入值sockfd:套接字描述符
my_addr:绑定的地址
addrlen:地址长度
函数返回值成功:0
出错:-1

这里my_addr是IPv4地址,IPv4 套接口地址数据结构以socketaddr_in 命名,定义在 <netinet/in.h>头文件中,形式如下:


 
 
  1. struct sockaddr_in
  2. {
  3. sa_family_t sin_family; /* address family: AF_INET */
  4. in_port_t sin_port; /* port in network byte order */
  5. struct in_addr sin_addr; /* internet address */
  6. };

sin_famliy 为套接字结构协议族,如IPv4为AF_INET;

sin_port  是16位 TCP或UDP端口号,网络字节顺序;

结构体成员in_addr也是一个结构体,定义如下:


 
 
  1. struct in_addr
  2. {
  3. uint32_t s_addr; /* address in network byte order */
  4. };
这里s_addr为32位IPv地址,网络字节顺序; 本地地址可以用INADDR_ANY;

字节排序函数上面已经介绍,下面看一个实例:


 
 
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h>
  9. #define PORT 2345
  10. int main()
  11. {
  12. int sockfd;
  13. struct sockaddr_in addr;
  14. int addr_len = sizeof(struct sockaddr_in);
  15. if((sockfd = socket(AF_INET,SOCK_STREAM, 0)) < 0)
  16. {
  17. perror( "socket fail");
  18. exit( -1);
  19. }
  20. else
  21. {
  22. printf( "socket created successfully!\nsocket id is %d\n",sockfd);
  23. }
  24. memset(&addr, 0,addr_len);
  25. addr.sin_family = AF_INET;
  26. addr.sin_port = htons(PORT);
  27. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  28. if(bind(sockfd,(struct sockaddr *)(&addr),addr_len) < 0)
  29. {
  30. perror( "bind error");
  31. exit( -1);
  32. }
  33. else
  34. {
  35. printf( "bind port successfully!\nlocal port:%d\n",PORT);
  36. }
  37. return 0;
  38. }
执行结果如下:

 
 
  1. fs@ubuntu:~/qiang/net$ ./socket
  2. socket created successfully!
  3. socket id is 3
  4. bind port successfully!
  5. local port: 2345
  6. fs@ubuntu:~/qiang/net$


3)等待监听函数

      所谓监听,指的是socket 的端口一直处于等待的状态,监听网络中的所有客户机,耐心等待某一客户机发送请求。如果客户端有连接请求,端口就会接受这个连接。listen 函数用于实现服务器的监听等待功能,它的函数原型如下:

所需头文件#include <sys/socket.h>
函数原型 int listen(int sockfd, int backlog);
函数传入值sockfd:套接字描述符
backlog:请求队列中允许的最大请求数,大多数系统默认值为5
函数返回值成功:0
出错:-1

需要注意的是listen 并未真正的接受连接,只是设置socket 的状态为监听模式,真正接受客户端连接的是accept 函数。通常情况下,listen 函数会在 socket ,bind 函数之后调用,然后才会调用 accept 函数。

     listen函数只适用于SOCK_STREAM或SOCK_SEQPACKET 的socket 类型。如果socket 为 AF_INET ,则参数 backlog 最大值可设至128,即最多可以同时接受128个客户端的请求。

 

4)接受连接函数

      服务器处于监听状态时,如果模式可获得客户机的连接请求,此时并不是立即处理这个请求,而是将这个请求放在等待队列中,当系统空闲时,再处理客户机的连接请求,接受连接请求的函数时accept,函数原型如下:

所需头文件#include <sys/socket.h>
函数原型 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函数传入值

sockfd:套接字描述符

my_addr:用于保存客户端的地址,入参

addrlen:地址长度

函数返回值

成功:建立好连接的套接字描述符

出错:-1

 当 accept 函数接受一个连接时,会返回一个新的 socket 标识符,以后的数据传输与读取就是通过这个新的socket 编号来处理,原来参数中的 socket 也可以继续使用。接受连接以后,远程主机的地址和端口信息会保存在 addr 所指的结构体内。

下面是个实例,体验listen 、accept函数的使用:


 
 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <unistd.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #define PORT 2345
  10. int main()
  11. {
  12. int sockfd,newsockfd;
  13. struct sockaddr_in addr,caddr;
  14. int addr_len = sizeof(struct sockaddr_in);
  15. int caddr_len = sizeof(struct sockaddr_in);
  16. if((sockfd = socket(AF_INET,SOCK_STREAM, 0)) < 0)
  17. {
  18. perror( "socket error");
  19. exit( -1);
  20. }
  21. else
  22. {
  23. printf( "socket successfully!\n");
  24. printf( "socket id : %d\n",sockfd);
  25. }
  26. memset(&addr, 0,addr_len);
  27. addr.sin_family = AF_INET;
  28. addr.sin_port = htons(PORT);
  29. addr.sin_addr.s_addr = htonl(INADDR_ANY);
  30. if(bind(sockfd,(struct sockaddr *)&addr,addr_len) == -1)
  31. {
  32. perror( "bind error");
  33. exit( -1);
  34. }
  35. else
  36. {
  37. printf( "bind successfully!\n");
  38. printf( "local port : %d\n",PORT);
  39. }
  40. if(listen(sockfd, 5) == -1)
  41. {
  42. perror( "listen error");
  43. exit( -1);
  44. }
  45. else
  46. {
  47. printf( "listening...\n");
  48. }
  49. if((newsockfd = accept(sockfd,(struct sockaddr *)&caddr,&caddr_len)) == -1)
  50. {
  51. perror( "accept error");
  52. exit( -1);
  53. }
  54. else
  55. {
  56. printf( "accepted a new connection ..\n");
  57. printf( "new socket id : %d\n",newsockfd);
  58. }
  59. return 0;
  60. }

执行程序,得到输出结果:


 
 
  1. fs@ubuntu:~/qiang/netprogram/tmp$ ./lisacc
  2. socket successfully!
  3. socket id : 3
  4. bind successfully!
  5. local port : 2345
  6. listening...

程序运行到这停止,并一直在这里等待,说明本机计算机的 2345号端口正处于监听的状态,等待本机上的连接服务请求。此时打开浏览器,在浏览器地址栏中输入下列形式的地址:

http://192.168.3.51:2345/

 
 

这个地址是笔者个人IP地址,按"ENTER" 键,这样浏览器会请求连接本地计算机上的2345号端口。此时终端中显示如下结果:


 
 
  1. accepted a new connection ..
  2. new socket id : 4

表明程序已经接受了这个连接,并创建了一个新的套接口(ID为4),然后退出了程序。

 

5、请求连接函数

       所谓请求连接,是指在客户机向服务器发送信息之前,需要先发送一个连接请求,请求与服务器建立TCP通信连接。connect 函数可以完成这项功能,函数原型如下:

所需头文件#include <sys/socket.h>
函数原型 int connect(int sockfd, struct sockaddr * serv_addr, int addrlen);
函数传入值

sockfd:套接字描述符

sock_addr:服务器端地址

addrlen:地址长度

函数返回值

成功:0

出错:-1

这里ser_addr 是一个结构体指针,指向一个sockaddr 结构体,这个结构体存储着远处服务器的IP与端口号信息。


6、数据读写函数

TCP/UDP读写函数总结,注意函数要成对使用

1)send函数

     建立套接口并完成通信连接以后,可以把信息传送到远程主机上,这个过程就是信息的发送。而对于远程主机发送来的信息,本地主机需要进行接收处理。下面开始讲述这种面向连接的套接口信息发送与接收操作。

    用connect 函数连接到远程计算机以后,可以用 send 函数将应答信息发送给请求服务的本地主机,通信时双向的,并且通信的双方是对等的。

    send() 函数原型如下:

所需头文件#include <sys/socket.h>
函数原型 int send(int sockfd, const void*buf, int len, int flags);
函数传入值

sockfd:套接字描述符

buf:发送缓冲区的地址 入参

len:发送数据的长度

flags:一般为0

函数返回值

成功:实际发送的字节数

出错:-1

 

2)recv()函数

       函数recv 可以接收远程主机发送来的数据,并将这些数据保存到一个数组中,函数原型如下:

所需头文件#include <sys/socket.h>
函数原型 int recv(int sockfd, const void*buf, int len, int flags);
函数传入值

sockfd:套接字描述符

buf:存放接收数据的缓冲区 出参

len:接收数据的长度

flags:一般为0

函数返回值

成功:实际接收的字节数

出错:-1

 

    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    第一章 概论 ..................................................................................................................1 1.1 网络的历史.......................................................................................................1 1.2 OSI 模型...........................................................................................................3 1.3 Internet 体系模型..............................................................................................4 1.4 客户/服务器模型...............................................................................................5 1.4 UNIX 的历史 ...................................................................................................7 1.4.1 Unix 诞生前的故事 .................................................................................7 1.4.2 UNIX 的诞生..........................................................................................8 1.4.3 1979 – UNIX 第七版 ............................................................................. 10 1.4.4 UNIX 仅仅是历史吗?............................................................................. 11 1.5 Linux 的发展.................................................................................................. 11 1.5.1 Linux 的发展历史 .................................................................................. 12 1.5.2 什么叫 GNU? ...................................................................................... 12 1.5.3 Linux 的特色 ........................................................................................ 13 1.5.4 硬件需求............................................................................................... 14 1.5.5 Linux 可用的软件 ................................................................................. 14 1.5.6 为什么选择 Linux ? ............................................................................ 15 1.6 Linux 和 Unix 的发展 .................................................................................... 15 第二章 UNIX/Linux 模型...............................................................................................17 2.1 UNIX/Linux 基本结构.......................................................................................17 2.2 输入和输出......................................................................................................19 2.2.1 UNIX/Linux 文件系统简介 ......................................................................19 2.2.2 流和标准 I/O 库......................................................................................20 2.3 进程 ................................................................................................................21 第三章 进程控制 ..........................................................................................................22 3.1 进程的建立与运行 ...........................................................................................22 3.1.1 进程的概念 ............................................................................................22 3.1.2 进程的建立 ............................................................................................22 3.1.3 进程的运行 ............................................................................................24 3.1.4 数据和文件描述符的继承 .......................................................................29 3.2 进程的控制操作...............................................................................................31 3.2.1 进程的终止 ............................................................................................31 3.2.2 进程的同步 ............................................................................................32 3.2.3 进程终止的特殊情况 ..............................................................................33 3.2.4 进程控制的实例 .....................................................................................33 3.3 进程的属性......................................................................................................38 3.3.1 进程标识符 ............................................................................................38 3.3.2 进程的组标识符 .....................................................................................39 3.3.3 进程环境................................................................................................40 3.3.4 进程的当前目录 .....................................................................................42 3.3.5 进程的有效标识符..................................................................................43 3.3.6 进程的资源 ............................................................................................44 3.3.7 进程的优先级.........................................................................................45 3.4 守护进程 .........................................................................................................46 3.4.1 简介.......................................................................................................46 3.4.2 守护进程的启动 ............................................................................................46 3.4.3 守护进程的错误输出 ..............................................................................46 3.4.4 守护进程的建立 .....................................................................................48 3.5 本章小结 .........................................................................................................49 第四章 进程间通信.......................................................................................................50 4.1 进程间通信的一些基本概念 .............................................................................50 4.2 信号 ................................................................................................................50 4.2.1 信号的处理 ............................................................................................52 4.2.2 信号与系统调用的关系...........................................................................54 4.2.3 信号的复位 ............................................................................................55 4.2.4 在进程间发送信号..................................................................................56 4.2.5 系统调用 alarm()和 pause()......................................................................58 4.2.6 系统调用 setjmp()和 longjmp().................................................................62 4.3 管道 ................................................................................................................63 4.3.1 用 C 来建立、使用管道 ..........................................................................65 4.3.2 需要注意的问题 .....................................................................................72 4.4 有名管道 .........................................................................................................72 4.4.1 有名管道的创建 .....................................................................................72 4.4.2 有名管道的 I/O 使用...............................................................................73 4.4.3 未提到的关于有名管道的一些注意 .........................................................75 4.5 文件和记录锁定...............................................................................................75 4.5.1 实例程序及其说明..................................................................................75 4.5.2 锁定中的几个概念..................................................................................78 4.5.3 System V 的咨询锁定..............................................................................78 4.5.4 BSD 的咨询式锁定 .................................................................................79 4.5.5 前面两种锁定方式的比较 .......................................................................81 4.5.6 Linux 的其它上锁技术 ............................................................................81 4.6 System V IPC ...................................................................................................84 4.6.1 ipcs 命令 ................................................................................................85 4.6.2 ipcrm 命令..............................................................................................86 4.7 消息队列( Message Queues) ...........................................................................86 4.7.1 有关的数据结构 .....................................................................................86 4.7.2 有关的函数 ............................................................................................89 4.7.3 消息队列实例—— msgtool,一个交互式的消息队列使用工具 ..................94 4.8 信号量(Semaphores) .........................................................................................97 4.8.1 有关的数据结构 .....................................................................................98 4.8.2 有关的函数 ............................................................................................99 4.8.3 信号量的实例—— semtool,交互式的信号量使用工具...........................103 4.9 共享内存(Shared Memory) ..............................................................................109 4.9.1 有关的数据结构 ...................................................................................109 4.9.2 有关的函数 .......................................................................................... 110 4.9.3 共享内存应用举例—— shmtool,交互式的共享内存使用工具................... 112 4.9.4 共享内存与信号量的结合使用 .............................................................. 114 第五章 通信协议简介 .................................................................................................120 5.1 引言 ..............................................................................................................120 5.2 XNS( Xerox Network Systems)概述..............................................................120 5.2.1 XNS 分层结构......................................................................................120 5.3 IPX/SPX 协议概述........................................................................................122 5.3.1 网际包交换( IPX) .............................................................................122 5.3.2 排序包交换( SPX) .............................................................................124 5.4 Net BIOS 概述................................................................................................124 5.5 Apple Talk 概述 ..............................................................................................125 5.6 TCP/IP 概述...................................................................................................126 5.6.1 TCP/IP 结构模型 ..................................................................................126 5.6.2 Internet 协议( IP) ...............................................................................127 5.6.3 传输控制协议( TCP) .........................................................................132 5.6.4 用户数据报文协议................................................................................134 5.7 小结 ..............................................................................................................135 第六章 Berkeley 套接字 ............................................................................................. 136 6.1 引言 ............................................................................................................. 136 6.2 概述 ............................................................................................................. 136 6.2.1 Socket 的历史...................................................................................... 136 6.2.2 Socket 的功能...................................................................................... 136 6.2.3 套接字的三种类型............................................................................... 138 6.3 Linux 支配的网络协议................................................................................... 141 6.3.1 什么是 TCP/IP? ................................................................................... 141 6.4 套接字地址................................................................................................... 142 6.4.1 什么是 Socket? .................................................................................. 142 6.4.2 Socket 描述符...................................................................................... 142 6.4.3 一个套接字是怎样在网络上传输数据的? ............................................ 143 6.5 套接字的一些基本知识 ................................................................................. 144 6.5.1 基本结构............................................................................................. 144 6.5.2 基本转换函数...................................................................................... 145 6.6 基本套接字调用............................................................................................ 147 6.6.1 socket() 函数....................................................................................... 147 6.6.2 bind() 函数 ......................................................................................... 148 6.6.3 connect()函数 ...................................................................................... 150 6.6.4 listen() 函数........................................................................................ 151 6.6.5 accept()函数 ........................................................................................ 152 6.6.6 send()、 recv()函数 ............................................................................... 154 6.6.7 sendto() 和 recvfrom() 函数 ................................................................. 155 6.6.8 close()和 shutdown()函数...................................................................... 156 6.6.9 setsockopt() 和 getsockopt() 函数 ......................................................... 157 6.6.10 getpeername()函数.............................................................................. 157 6.6.11 gethostname()函数.............................................................................. 158 6.7 DNS 的操作.................................................................................................. 158 6.7.1 理解 DNS............................................................................................ 158 6.7.2 和 DNS 有关的函数和结构 .................................................................. 158 6.7.3 DNS 例程............................................................................................ 159 6.8 套接字的 Client/Server 结构实现的例子.......................................................... 160 6.8.1 简单的流服务器 .................................................................................. 161 6.8.2 简单的流式套接字客户端程序 ............................................................. 163 6.8.3 数据报套接字例程( DatagramSockets) ............................................... 165 6.9 保留端口 ...................................................................................................... 169 6.9.1 简介.................................................................................................... 169 6.9.2 保留端口............................................................................................. 170 6.10 五种 I/O 模式................................................................................................. 179 6.10.1 阻塞 I/O 模式 .................................................................................... 179 6.10.2 非阻塞模式 I/O.................................................................................. 180 6.10.3 I/O 多路复用 ..................................................................................... 181 6.10.4 信号驱动 I/O 模式 ............................................................................. 182 6.10.5 异步 I/O 模式 .................................................................................... 185 6.10.6 几种 I/O 模式的比较.......................................................................... 186 6.10.7 fcntl()函数 ......................................................................................... 186 6.10.8 套接字选择项 select()函数.................................................................. 187 6.11 带外数据..................................................................................................... 190 6.11.1 TCP 的带外数据 ................................................................................ 190 6.11.2 OOB 传输套接字例程(服务器代码 Server.c) ................................... 193 6.11.3 OOB 传输套接字例程(客户端代码 Client.c) .................................... 196 6.11.4 编译例子 ........................................................................................... 199 6.12 使用 Inetd( Internet 超级服务器) ............................................................... 199 6.12.1 简介.................................................................................................. 199 6.12.2 一个简单的 inetd 使用的服务器程序 hello inet service.......................... 199 6.12.3 /etc/services 和 /etc/inetd.conf 文件 ..................................................... 200 6.12.4 一个复杂一些的 inetd 服务器程序 ...................................................... 201 6.12.5 一个更加复杂的 inetd 服务器程序 ...................................................... 203 6.12.6 程序必须遵守的安全性准则............................................................... 205 6.12.7 小结.................................................................................................. 205 6.13 本章总结 .................................................................................................... 205 第七章 网络安全性.....................................................................................................206 7.1 网络安全简介 ................................................................................................206 7.1.1 网络安全的重要性................................................................................206 7.1.2 信息系统安全的脆弱性.........................................................................207 7.2 Linux 网络不安全的因素 ................................................................................209 7.3 Linux 程序员安全........................................................................................... 211 7.3.1 系统子程序 ..........................................................................................212 7.3.2 标准 C 函数库.......................................................................................214 7.3.3 书写安全的 C 程序................................................................................216 7.3.4 SUID/SGID 程序指导准则......................................................................217 7.3.5 root 程序的设计....................................................................................218 7.4 小结 ..............................................................................................................219 第八章 Ping 例程 .......................................................................................................220 8.1 Ping 命令简介 ................................................................................................220 8.2 Ping 的基本原理.............................................................................................220 8.3 小结 ..............................................................................................................221 第九章 tftp 例程.........................................................................................................222 9.1 tftp 协议简介..................................................................................................222 9.2 tftp 的使用 .....................................................................................................222 9.3 tftp 的原理 .....................................................................................................223 9.3 tftp 的基本结构 ..............................................................................................223 9.4 小节 ..............................................................................................................225 第十章 远程命令执行 .................................................................................................226 10.1 引言 ............................................................................................................226 10.2 rcmd 函数和 rshd 服务器...............................................................................227 10.3 rexec 函数和 rexecd 服务器...........................................................................233 第十一章 远程注册.....................................................................................................235 11.1 简介.............................................................................................................235 11.2 终端行律和伪终端........................................................................................235 11.3 终端方式字和控制终端.................................................................................239 11.4 rlogin 概述....................................................................................................242 11.5 窗口环境......................................................................................................242 11.6 流控制与伪终端方式字.................................................................................243 11.7 rlogin 客户程序.............................................................................................245 11.8 rlogin 服务器 ................................................................................................246 第十二章 远程过程调用..............................................................................................249 12.1 引言 ............................................................................................................249 12.2 远程过程调用模型 .......................................................................................249 12.3 传统过程调用和远程过程调用的比较 ...........................................................250 12.4 远程过程调用的定义....................................................................................252 12.5 远程过程调用的有关问题.............................................................................252 12.5.1 远程过程调用传送协议.......................................................................253 12.5.2 Sun RPC ...........................................................................................254 12.5.3 Xerox Courier ....................................................................................254 12.5.4 Apollo RPC........................................................................................255 12.6 stub 过程简介...............................................................................................256 12.7 rpcgen 简介 ..................................................................................................256 12.8 分布式程序生成的例子 ................................................................................257 12.8.1 我们如何能够构造出一个分布式应用程序...........................................257 12.9 小结 ............................................................................................................283 第十三章 远程磁带的访问 ..........................................................................................284 13.1 简介 ............................................................................................................284 13.2 Linux 磁带驱动器的处理 ..............................................................................285 13.3 rmt 协议.......................................................................................................285 13.4 rmt 服务器设计分析 .....................................................................................286 第十四章 WWW 上 HTTP 协议.................................................................................. 290 14.1 引言............................................................................................................ 290 14.2 HTTP 客户请求........................................................................................... 290 14.2.1 客户端 .............................................................................................. 290 14.2.2 服务器端........................................................................................... 290 14.2.3 Web 请求简介.................................................................................... 291 14.2.4 HTTP – HyperText Transfer Protocol 超文本传输协议 ........................... 295 14.3 Web 编程 .................................................................................................... 297 14.4 小结 ........................................................................................................... 301 附录 A 有关网络通信的服务和网络库函数...................................................................302 附录 B Vi 使用简介.....................................................................................................319 B.1 Vi 基本观念...................................................................................................319 B.1.1 进入与离开..........................................................................................319 B.1.2 Vi 输入模式 .........................................................................................319 B.2 Vi 基本编辑...................................................................................................320 B.2.1 删除与修改..........................................................................................320 B.3 Vi 进阶应用...................................................................................................320 B.3.1 移动光标 .............................................................................................320 B.3.2 进阶编辑命令 ......................................................................................322 B.3.3 文件命令 .............................................................................................322 附录 C Linux 下 C 语言使用与调试简介 ......................................................................324 C.1 C 语言编程 ...................................................................................................324 C.2 什么是 C? .....................................................................................................324 C.3 GNU C 编译器...............................................................................................324 C.3.1 使用 GCC............................................................................................324 C.3.2 GCC 选项 ............................................................................................325 C.3.3 优化选项 .............................................................................................325 C.3.4 调试和剖析选项...................................................................................325 C.3.5 用 gdb 调试 GCC 程序..........................................................................326 C.4 另外的 C 编程工具 ........................................................................................330 C.4.1 Xxgdb..................................................................................................330 C.4.2 Calls ....................................................................................................331 C.4.3 cproto ..................................................................................................332 C.4.4 Indent ..................................................................................................333 C.4.5 Gprof...................................................................................................334 C.4.6 f2c 和 p2c ............................................................................................335 附录 D Ping 源码 ........................................................................................................336 附录 E TFTP 服务器程序源码 .....................................................................................362
    第一章概论 ..............1 1.1 网络的历史...1 1.2 OSI 模型.......3 1.3 Internet 体系模型.............4 1.4 客户/服务器模型..............5 1.4 UNIX 的历史 ..................7 1.4.1 Unix 诞生前的故事...7 1.4.2 UNIX 的诞生.........8 1.4.3 1979 – UNIX 第七版........... 10 1.4.4 UNIX 仅仅是历史吗?........... 11 1.5 Linux 的发展................. 11 1.5.1 Linux 的发展历史.... 12 1.5.2 什么叫GNU? ..... 12 1.5.3 Linux 的特色....... 13 1.5.4 硬件需求.............. 14 1.5.5 Linux 可用的软件... 14 1.5.6 为什么选择 Linux ? .......... 15 1.6 Linux 和 Unix 的发展... 15 第二章 UNIX/Linux 模型..............17 2.1 UNIX/Linux 基本结构......17 2.2 输入和输出.....................19 2.2.1 UNIX/Linux 文件系统简介....19 2.2.2 流和标准I/O 库.....20 2.3 进程............21 第三章进程控制 ......22 3.1 进程的建立与运行..........22 3.1.1 进程的概念...........22 3.1.2 进程的建立...........22 3.1.3 进程的运行...........24 3.1.4 数据和文件描述符的继承.....29 3.2 进程的控制操作..............31 3.2.1 进程的终止...........31 3.2.2 进程的同步...........32 3.2.3 进程终止的特殊情况............33 3.2.4 进程控制的实例....33 3.3 进程的属性.....................38 3.3.1 进程标识符...........38 3.3.2 进程的组标识符....39 3.3.3 进程环境...............40 3.3.4 进程的当前目录....42 3.3.5 进程的有效标识符....43 3.3.6 进程的资源...........44 3.3.7 进程的优先级........45 3.4 守护进程.....46 3.4.1 简介...46 3.4.2 守护进程的启动...........46 3.4.3 守护进程的错误输出............46 3.4.4 守护进程的建立....48 3.5 本章小结.....49 第四章进程间通信...50 4.1 进程间通信的一些基本概念...........50 4.2 信号............50 4.2.1 信号的处理...........52 4.2.2 信号与系统调用的关系.........54 4.2.3 信号的复位...........55 4.2.4 在进程间发送信号....56 4.2.5 系统调用alarm()和pause()....58 4.2.6 系统调用setjmp()和longjmp()...........62 4.3 管道............63 4.3.1 用C 来建立、使用管道........65 4.3.2 需要注意的问题....72 4.4 有名管道.....72 4.4.1 有名管道的创建....72 4.4.2 有名管道的I/O 使用.............73 4.4.3 未提到的关于有名管道的一些注意...75 4.5 文件和记录锁定..............75 4.5.1 实例程序及其说明....75 4.5.2 锁定中的几个概念....78 4.5.3 System V 的咨询锁定............78 4.5.4 BSD 的咨询式锁定...79 4.5.5 前面两种锁定方式的比较.....81 4.5.6 Linux 的其它上锁技术..........81 4.6 System V IPC ..................84 4.6.1 ipcs 命令...............85 4.6.2 ipcrm 命令.............86 4.7 消息队列(Message Queues).........86 4.7.1 有关的数据结构....86 4.7.2 有关的函数.....
    很高兴能够回答你的问题。以下是一个简单的即时通信系统的C++网络编程示例,基于Linux平台使用socket库进行开发。 客户端代码: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> using namespace std; int main() { // 创建socket int client_socket = socket(AF_INET, SOCK_STREAM, 0); // 配置服务器地址 sockaddr_in server_address{}; server_address.sin_family = AF_INET; server_address.sin_port = htons(8080); server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); // 连接服务器 int connect_result = connect(client_socket, (sockaddr *) &server_address, sizeof(server_address)); if (connect_result == -1) { cout << "连接服务器失败!" << endl; return -1; } // 发送消息 char message[1024] = {0}; while (true) { cin.getline(message, sizeof(message)); if (strlen(message) == 0) { continue; } send(client_socket, message, strlen(message), 0); memset(message, 0, sizeof(message)); } // 关闭socket close(client_socket); return 0; } ``` 服务器端代码: ```c++ #include <iostream> #include <cstring> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> using namespace std; int main() { // 创建socket int server_socket = socket(AF_INET, SOCK_STREAM, 0); // 配置服务器地址 sockaddr_in server_address{}; server_address.sin_family = AF_INET; server_address.sin_port = htons(8080); server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); // 绑定socket和地址 bind(server_socket, (sockaddr *) &server_address, sizeof(server_address)); // 监听客户端连接 listen(server_socket, 10); // 接受客户端连接 sockaddr_in client_address{}; socklen_t client_address_len = sizeof(client_address); int client_socket = accept(server_socket, (sockaddr *) &client_address, &client_address_len); // 接收消息 char message[1024] = {0}; while (true) { int recv_result = recv(client_socket, message, sizeof(message), 0); if (recv_result <= 0) { break; } cout << "收到消息:" << message << endl; memset(message, 0, sizeof(message)); } // 关闭socket close(client_socket); close(server_socket); return 0; } ``` 在上面的代码中,客户端和服务器端都使用了socket库中的函数来完成网络通信。客户端使用`socket`函数创建socket,使用`connect`函数连接服务器,并使用`send`函数发送消息。服务器端使用`socket`函数创建socket,使用`bind`函数将socket与服务器地址绑定,使用`listen`函数监听客户端连接,并使用`accept`函数接受客户端连接,最后使用`recv`函数接收客户端发送的消息。 当然,这只是一个简单的示例。在实际开发中,你需要考虑更多的细节,例如如何处理多个客户端连接、如何处理异常情况等等。 希望这个示例能够帮助你了解Linux下C++ socket网络编程的基本流程和方法。

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值