socket编程(2024超级详细、Linux)

前言

本文是作者在学习linux网络编程的时候所写的学习笔记,同时方便巩固自己学习的知识和网友们一起分享,尚若发现有什么不对的地方,欢迎指正。

一、网络编程(socket)

1.网络

网络是指将多个计算机或设备通过通信链路连接起来,以实现信息传输和资源共享的系统。网络可以是局域网(LAN),用于连接同一地理位置范围内的设备,也可以是广域网(WAN),用于连接不同地理位置范围内的设备。通过网络,用户可以通过电子邮件、网页浏览、文件传输等方式进行信息交流和资源共享。网络的基础是互联网,它是全球范围内的计算机网络,由各种硬件设备、协议和技术组成。互联网使得人们可以在全球范围内进行通信和访问各种信息资源。网络的发展和应用对现代社会的各个领域都有着重要的影响,包括通信、商务、教育、娱乐等。

2.socket()函数 用来创建套字节

2.1 Linux系统下的C语言socket函数原型

// Create a socket
// Parameters:
//   domain: communication domain (e.g., AF_INET for IPv4)
//   type: socket type (e.g., SOCK_STREAM for TCP)
//   protocol: specific protocol (e.g., 0 for default protocol)
// Return value:
//   If successful, returns the socket file descriptor; otherwise, returns -1
int socket(int domain, int type, int protocol);

2.2 Linux系统下的C语言socket位于哪个头文件

#include <sys/socket.h>

2.3 Linux系统下的C语言socket函数参数说明

函数是在网络编程中用于创建套接字的系统调用函数。套接字是实现网络通信的一种机制,它可以用于在不同的计算机之间进行数据传输。

int socket(int domain, int type, int protocol);
  • domain :指定套接字的地址族,常见的有 AF_INET (IPv4)和 AF_INET6 (IPv6)。
  • type :指定套接字的类型,常见的有 SOCK_STREAM (面向连接的流套接字)和 SOCK_DGRAM (无连接的数据报套接字)。
  • protocol :指定套接字使用的协议,通常为0,表示使用默认协议。

2.4 socket里面的domain说明

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

下面我将列举出15个协议族,并且以表格的形式列举出来。注意,这只是一些常见的通信域,实际上还有其他更多的特定协议族可供选择:
man page里面数字的含义,即ip(7)之中7的含义

Protocol Family Name(协议族名字)Description(说明)Chinese(中文)man page(手页册)Commonly Used
AF_INETIPv4 Internet protocolsIPv4网络协议ip(7)*
AF_INET6IPv6 Internet protocolsIPv6网络协议ipv6(7)*
AF_UNIXUNIX domain protocolsUNIX域协议unix(7)*
AF_PACKETLow level packet interface protocols底层数据包接口协议packet(7)*
AF_BLUETOOTHBluetooth protocols蓝牙协议bluetooth(7)*
AF_NETLINKLinux Kernel user interface device protocolsLinux 内核用户界面设备协议netlink(7)*
AF_LOCALLocal to host protocols本地协议unix(7)
AF_X25ITU-T X.25 / ISO-8208 protocol familyX.25协议x25(7)
AF_AX25Amateur radio AX.25 protocol业余无线电AX.25协议ax25(7)*
AF_ATMPVCAccess to raw ATM PVCsATM PVC协议atmarp(7)
AF_APPLETALKAppleTalkAppleTalk协议ddp(7)
AF_ECONETAcorn EconetAcorn Econet协议econet(7)
AF_IPXIPX - Novell protocolsIPX协议ipx(7)
AF_ROSEAmateur Radio X.25 PLP业余无线电X.25 PLP协议rose(7)
AF_NETROMAmateur radio NET/ROM protocol业余无线电NET/ROM协议netrom(7)
AF_SECURITYSecurity Attribute-based Access Control Kernel Extensions安全属性访问控制内核扩展security(7)

2.5 socket里面的type

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

对于网络编程,最常用的是SOCK_STREAM(TCP协议)和SOCK_DGRAM(UDP协议)两种socket类型,分别对应TCP和UDP协议。如果你有任何其他问题,请随时提问!

Socket TypeDescription
SOCK_STREAM提供面向连接的、可靠的数据传输服务。使用TCP协议。
SOCK_DGRAM提供无连接的、不可靠的数据传输服务。使用UDP协议。
SOCK_SEQPACKET提供面向连接的、可靠的数据传输服务。与SOCK_STREAM不同的是,保留了数据的边界(即数据报之间不会混淆)。
SOCK_RAW提供原始网络协议访问。需要应用程序自行构造协议头部。
SOCK_RDM提供面向连接的、可靠的数据传输服务,但是保留数据的边界。这个类型的socket基本上已经被废弃了。
SOCK_DCCP提供基于数据报的数据传输服务,使用DCCP协议。
SOCK_PACKET提供原始以太网数据包的访问,需要特权权限。已经过时。
SOCK_CLOEXEC在创建socket时设置close-on-exec标志位,使得socket在exec调用时自动关闭。
SOCK_NONBLOCK在创建socket时设置non-blocking标志位,使得socket的I/O操作变为非阻塞。

SOCK_PACKET已经被废弃了。在Linux 2.2版本以前,SOCK_PACKET是一种特殊的socket类型,可以用于访问网络驱动程序,但是需要特权权限。在Linux 2.2版本之后,SOCK_PACKET被替换为了SOCK_RAW,SOCK_RAW可以提供相同的功能,而且不需要特权权限。
在Linux 2.4版本之后,SOCK_PACKET被重新引入了,但这次它只是作为一种socket族别(socket family),而不是一种socket类型。也就是说,现在我们可以使用PF_PACKET来创建一个SOCK_PACKET socket了,而不再使用SOCK_PACKET socket类型。
请注意,PF_PACKET是一种特殊的socket族别,用于在数据链路层上发送和接收数据。它可以与SOCK_RAW结合使用,来构造和解析以太网帧、ARP报文等,从而实现更灵活的网络编程。

2.6 socket里面的protocol

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

当调用socket函数时,如果protocol参数设置为0,则会选择默认的协议。默认的协议通常是与给定的域和套接字类型最匹配的协议。
但是,有些域和套接字类型支持多种协议。在这种情况下,可以使用protocol参数来选择特定的协议。例如,在IPv4中,SOCK_STREAM套接字类型支持TCP和SCTP协议,SOCK_DGRAM套接字类型支持UDP和DCCP协议。如果我们要使用SCTP协议而不是TCP协议来创建一个SOCK_STREAM套接字,则可以将protocol参数设置为IPPROTO_SCTP。
需要注意的是,不同的操作系统可能支持不同的协议,因此要根据具体的环境来选择正确的协议。此外,还需要了解不同协议之间的性能和特性差异,以确保选择的协议适合应用程序的需求。
当调用socket函数时,protocol参数可以根据不同的domain和type组合来选择适合的协议。以下是一些常见的domain和type组合以及对应的protocol:

DomainTypeProtocol
AF_INETSOCK_STREAMIPPROTO_TCP (TCP协议)
AF_INETSOCK_DGRAMIPPROTO_UDP (UDP协议)
AF_INET6SOCK_STREAMIPPROTO_TCP (TCP协议)
AF_INET6SOCK_DGRAMIPPROTO_UDP (UDP协议)
AF_UNIXSOCK_STREAM0 (默认协议,通常是UNIX域套接字)
AF_UNIXSOCK_DGRAM0 (默认协议,通常是UNIX域套接字)

这只是一些常见的组合,实际上还有很多的组合。

2.7 Linux系统下的C语言socket函数返回值

在Linux系统下,C语言的套接字函数(如socket()、bind()、listen()等)的返回值类型通常是int型。这些函数的返回值表示函数执行的结果或错误代码。如果函数执行成功,则返回一个非负的套接字描述符,用于后续的套接字操作。如果函数执行失败,则返回-1,并且可以通过检查全局变量errno来获取具体的错误代码。
常见的套接字函数返回值为-1的错误代码包括:

  • EACCES:权限不足,无法创建套接字。
  • EAFNOSUPPORT:不支持指定的地址族。
  • EINVAL:无效的参数。
  • EMFILE:达到了进程打开的文件描述符数量的上限。
  • ENFILE:达到了系统打开的文件描述符数量的上限。
  • ENOBUFS/ENOMEM:内存不足,无法分配资源。
    需要根据套接字函数的返回值和具体的错误代码来判断函数是否执行成功,并根据错误情况采取适当的处理措施。

3.setsockopt()函数 来设置socket的属性

3.1 Linux系统下的C语言setsockopt函数原型

// Set socket options
// Parameters:
//   sockfd: socket file descriptor
//   level: protocol level of the option (e.g., SOL_SOCKET for socket-level options)
//   optname: the name of the option to be set
//   optval: pointer to the memory area where the option value is stored
//   optlen: the length of the option value in bytes
// Return value:
//   If successful, returns 0; otherwise, returns -1
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

3.2 Linux系统下的C语言setsockopt位于哪个头文件

#include <sys/socket.h>

3.3 Linux系统下的C语言setsockopt函数参数说明

setsockopt()函数是一个用于设置套接字选项的系统调用函数。它允许应用程序在已打开的套接字上设置各种选项,以控制套接字的行为。
参数说明:

  • sockfd:指定要设置选项的套接字描述符。
  • level:指定选项所在的协议层。常用的协议层包括SOL_SOCKET(通用套接字选项)、IPPROTO_TCP(TCP协议选项)和IPPROTO_IP(IP协议选项)等。
  • optname:指定要设置的选项名称。
  • optval:指向存储选项值的缓冲区。
  • optlen:指定选项值的大小。
    下面是一些常见的套接字选项和它们的使用示例:
  1. 设置套接字为可重用:
int optval = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) 
{
    perror("setsockopt failed");
    exit(EXIT_FAILURE);
}

这个示例中, SO_REUSEADDR 选项被设置为1,表示允许地址重用。这对于服务器程序在关闭后立即重新启动时很有用。

  1. 设置接收或发送超时时间:
struct timeval timeout;
timeout.tv_sec = 5; // 5秒
timeout.tv_usec = 0;
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) < 0) 
{
    perror("setsockopt failed");
    exit(EXIT_FAILURE);
}

在这个示例中, SO_RCVTIMEO 选项被设置为5秒,表示在接收数据时最多等待5秒钟。如果在指定时间内没有接收到数据, recv() 函数将返回超时错误。

  1. 设置套接字缓冲区大小:
int optval = 8192; // 8KB
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, sizeof(optval)) < 0) 
{
    perror("setsockopt failed");
    exit(EXIT_FAILURE);
}

这个示例中, SO_RCVBUF 选项被设置为8KB,表示接收缓冲区的大小为8KB。

3.4 Linux系统下的C语言setsockopt函数返回值

setsockopt()函数的返回值是一个整数,表示函数执行的结果。如果函数执行成功,则返回值为0;如果函数执行失败,则返回值为-1,并且可以通过检查全局变量errno来获取具体的错误代码。常见的错误代码包括:

  • EBADF:无效的套接字描述符。
  • ENOTSOCK:指定的文件描述符不是套接字。
  • EINVAL:无效的选项名称或选项值。
  • EPERM:当前用户权限不足,无法设置该选项。
    需要根据返回值来判断函数是否执行成功,并根据具体的错误代码来处理错误情况。

4.bind()函数 用于绑定端口

4.1 Linux系统下的C语言bind函数原型

// Bind the socket to an address
// Parameters:
//   sockfd: socket file descriptor
//   addr: pointer to the address structure to bind to
//   addrlen: length of the address structure in bytes
// Return value:
//   If successful, returns 0; otherwise, returns -1
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

4.2 Linux系统下的C语言bind位于哪个头文件

#include <sys/types.h>
#include <sys/socket.h>

4.3 Linux系统下的C语言bind函数参数说明

在 bind 函数中,有三个参数需要说明:

  1. sockfd :表示要绑定的套接字文件描述符。它是通过调用 socket 函数创建的套接字的文件描述符。
  2. addr :是一个指向 struct sockaddr 类型的指针,用于指定要绑定的 IP 地址和端口信息。具体的地址信息取决于所使用的协议族(如 IPv4 或 IPv6)以及地址结构体的类型(如 struct sockaddr_in 或 struct sockaddr_in6 )。
  3. addrlen :是一个 socklen_t 类型的参数,表示传递给 addr 参数的地址结构体的长度。
    通过这三个参数, bind 函数可以将指定的套接字与特定的 IP 地址和端口进行绑定。
    4.4Linux系统下的C语言bind函数返回值
    在 Linux 系统下,C 语言的 bind 函数返回一个整数值。它的返回值表示函数执行的结果,具体含义如下:
  • 如果绑定成功, bind 函数返回 0。
  • 如果出现错误, bind 函数返回 -1,并设置相应的错误码。你可以使用 perror 函数打印错误信息,或者使用 errno 变量获取错误码。
    需要注意的是,不同的错误码代表不同的错误情况。你可以参考相关的文档或使用 man 命令来查看特定的错误码所对应的含义。

5.listen()函数 用于监听连接

5.1 Linux系统下的C语言listen函数原型

// Set the socket to listen for incoming connections
// Parameters:
//   sockfd: socket file descriptor
//   backlog: maximum number of pending connections in the waiting queue
// Return value:
//   If successful, returns 0; otherwise, returns -1
int listen(int sockfd, int backlog);

5.2 Linux系统下的C语言listen位于哪个头文件

#include <sys/types.h>
#include <sys/socket.h>

5.3 Linux系统下的C语言listen函数参数说明

listen 函数接受两个参数:

  • sockfd :表示要监听的套接字文件描述符。它是通过调用 socket 函数创建的套接字的文件描述符。
  • backlog :表示等待连接队列的最大长度。它指定了在调用 accept 函数之前,可以排队等待的连接请求数量。

5.4 Linux系统下的C语言listen函数返回值

listen 函数返回一个整数值,表示函数执行的结果。具体含义如下:

  • 如果监听成功, listen 函数返回 0。
  • 如果出现错误, listen 函数返回 -1,并设置相应的错误码。你可以使用 perror 函数打印错误信息,或者使用 errno 变量获取错误码。
    需要注意的是,调用 listen 函数之前,必须先调用 bind 函数将套接字与特定的 IP 地址和端口进行绑定。否则, listen 函数将会失败。

6.accept()函数 接受连接并处理请求

6.1 Linux系统下的C语言accept函数原型

// Accept a client connection request and create a new socket to handle the connection
// Parameters:
//   sockfd: socket file descriptor
//   addr: pointer to the structure that will hold the client address information
//   addrlen: pointer to the length of the structure in bytes
// Return value:
//   If successful, returns the new socket file descriptor; otherwise, returns -1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

6.2 Linux系统下的C语言accept位于哪个头文件

#include <sys/types.h>
#include <sys/socket.h>

6.3 Linux系统下的C语言accept函数参数说明

  • sockfd :表示要接受连接请求的套接字文件描述符。它是通过调用 socket 函数创建的套接字的文件描述符。
  • addr :是一个指向 struct sockaddr 类型的指针,用于存储连接的客户端的地址信息。
  • addrlen :是一个指向 socklen_t 类型的指针,用于指定 addr 参数所指向的地址结构体的长度,并在函数调用后更新为实际接受的地址结构体的长度。

6.4 Linux系统下的C语言accept函数返回值

  • 如果接受连接成功, accept 函数返回一个新的套接字文件描述符,用于与客户端进行通信。
  • 如果出现错误, accept 函数返回 -1,并设置相应的错误码。你可以使用 perror 函数打印错误信息,或者使用 errno 变量获取错误码。
    需要注意的是, accept 函数会阻塞程序的执行,直到有客户端连接请求到达,或者出现错误。在多线程或多进程的网络编程中,可以使用 accept 函数来接受客户端连接请求,并将处理客户端请求的任务交给其他线程或进程来处理。

有空随手记,未完待续—

2024-01-09

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 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
Linux Socket编程是指在Linux操作系统下使用Socket API进行网络编程的过程。Socket是用于在计算机网络之间进行通信的一种机制,它提供了一种标准的、可移植的接口,使得不同操作系统之间的程序可以进行网络通信。在Linux系统下,Socket API是一个非常强大的网络编程接口,它提供了一系列的函数和数据结构,可以方便地实现各种网络应用程序。 Socket编程的基本原理是通过创建Socket对象,在网络上建立连接,然后进行数据的传输和接收。在Linux系统下,Socket编程主要包括以下步骤: 1. 创建Socket对象:使用socket函数创建Socket对象,并指定协议类型和套接字类型。 2. 绑定Socket对象:使用bind函数将Socket对象与本地IP地址和端口号进行绑定。 3. 监听Socket对象:使用listen函数将Socket对象转换为被动套接字,等待客户端的连接请求。 4. 接受连接:使用accept函数接受客户端的连接请求,返回一个新的Socket对象,用于与客户端进行通信。 5. 发送和接收数据:使用send和recv函数进行数据的发送和接收。 6. 关闭Socket对象:使用close函数关闭Socket对象,释放资源。 在进行Socket编程时,需要注意以下几点: 1. Socket编程需要对网络编程有一定的了解,包括TCP/IP协议、网络编程模型等。 2. 处理网络编程中可能出现的错误,例如连接超时、网络中断等。 3. Socket编程需要考虑网络安全问题,例如数据加密、防止拒绝服务攻击等。 总之,Socket编程网络编程中非常重要的一部分,如果您想要进行网络编程开发,那么对Socket编程的掌握是必不可少的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值