在前面的几个部分里面,我们已经学会了怎么样从网络上读写信息了.前面的一些函数(read,write)是网络程序里面最基本的函数.也是最原始的通信函数.在这一章里面,我们一起来学习网络通信的高级函数.这一章我们学习另外几个读写函数.
6.1 recv和send
recv和send函数提供了和read和write差不多的功能.不过它们提供 了第四个参数来控制读写操作.
int recv(int sockfd,void *buf,int len,int flags)
int send(int sockfd,void *buf,int len,int flags)
前面的三个参数和read,write一样,第四个参数可以是0或者是以下的组合
_______________________________________________________________
| MSG_DONTROUTE | 不查找路由表 |
| MSG_OOB | 接受或者发送带外数据 |
| MSG_PEEK | 查看数据,并不从系统缓冲区移走数据 |
| MSG_WAITALL | 等待所有数据 |
|--------------------------------------------------------------|
MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP协议.目的主机在本地网络上面,没有必要查找路由表.这个标志一般用网络诊断和路由程序里面.
MSG_OOB:表示可以接收和发送带外的数据.关于带外数据我们以后会解释的.
MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲区的内容.这样下次读的时候,仍然是一样的内容.一般在有多个进程读写数据时可以使用这个标志.
MSG_WAITALL是recv函数的使用标志,表示等到所有的信息到达时才返回.使用这个标志的时候recv回一直阻塞,直到指定的条件满
足,或者是发生了错误. 1)当读到了指定的字节时,函数正常返回.返回值等于len 2)当读到了文件的结尾时,函数正常返回.返回值小于len 3)
当操作发生错误时,返回-1,且设置错误为相应的错误号(errno)
如果flags为0,则和read,write一样的操作.还有其它的几个选项,不过我们实际上用的很少,可以查看 Linux Programmer's Manual得到详细解释.
6.2 recvfrom和sendto
这两个函数一般用在非套接字的网络程序当中(UDP),我们已经在前面学会了.
6.3 recvmsg和sendmsg
recvmsg和sendmsg可以实现前面所有的读写函数的功能.
int recvmsg(int sockfd,struct msghdr *msg,int flags)
int sendmsg(int sockfd,struct msghdr *msg,int flags)
struct msghdr
{
void *msg_name;
int msg_namelen;
struct iovec *msg_iov;
int msg_iovlen;
void *msg_control;
int msg_controllen;
int msg_flags;
}
struct iovec
{
void *iov_base; /* 缓冲区开始的地址 */
size_t iov_len; /* 缓冲区的长度 */
}
msg_name和 msg_namelen当套接字是非面向连接时(UDP),它们存储接收和发送方的地址信息.msg_name实际上是一个
指向struct sockaddr的指针,msg_name是结构的长度.当套接字是面向连接时,这两个值应设为NULL. msg_iov和
msg_iovlen指出接受和发送的缓冲区内容.msg_iov是一个结构指针,msg_iovlen指出这个结构数组的大
小. msg_control和msg_controllen这两个变量是用来接收和发送控制数据时的 msg_flags指定接受和发送的操作选项.和
recv,send的选项一样
6.4 套接字的关闭
关闭套接字有两个函数close和shutdown.用close时和我们关闭文件一样.
6.5 shutdown
int shutdown(int sockfd,int howto)
TCP连接是双向的(是可读写的),当我们使用close时,会把读写通道都关闭,有时侯我们希望只关闭一个方向,这个时候我们可以使用shutdown.针对不同的howto,系统回采取不同的关闭方式.
howto=0这个时候系统会关闭读通道.但是可以继续往接字描述符写.
howto=1关闭写通道,和上面相反,着时候就只可以读了.
howto=2关闭读写通道,和close一样 在多进程程序里面,如果有几个子进程共享一个套接字时,如果我们使用shutdown, 那么所有的子进程都不能够操作了,这个时候我们只能够使用close来关闭子进程的套接字描述符.
|
|
相关推荐
- 常见的套接字级别有SOL_SOCKET(适用于所有类型套接字)和IPPROTO_TCP/UDP(针对TCP或UDP特定的选项)。 6. **多线程与并发处理** - 为了处理多个客户端连接,服务器端通常会采用多线程或者异步I/O模型。 - 每...
libevent的核心功能是为多种事件源提供一个统一的接口,包括文件描述符、信号、时间事件以及网络套接字等。在本篇中,我们将详细探讨libevent-2.1.11-stable这一稳定版本在CentOS系统中的安装、使用和重要特性。 ...
Socket,即套接字,是TCP/IP协议传输层提供的一种接口,它允许程序员通过API访问网络资源。在Linux系统中,Socket类似于文件描述符,可以用于读写数据,且Socket接口定义了一系列函数,如`socket()`、`bind()`、`...
本章重点讨论的是"Linux程序设计-网络编程"中的第九章内容,虽然具体的章节标题未给出,但我们可以推测这可能涉及到TCP/IP套接字编程,这是Linux网络编程的核心。 网络编程的基本概念包括协议、套接字、端口和IP...
1. **套接字(Sockets)编程**:这是Linux网络编程的基础,涉及到socket创建、绑定、监听、连接、接受和发送数据等步骤。通过学习源代码,你可以理解如何使用套接字API进行客户端-服务器通信。 2. **TCP/IP协议栈**...
6. **网络编程**:Node.js有强大的网络库,可以方便地创建HTTP服务器、TCP套接字等。 7. **包管理器npm**:Node.js的包管理器npm是最大的开源软件包生态系统,允许开发者轻松安装、共享和依赖管理代码。 8. **性能...
在Linux网络编程中,套接字API包括创建套接字(socket())、绑定地址(bind())、监听连接(listen())、接受连接(accept())、发起连接(connect())、数据传输(send()、recv()、sendto()、recvfrom())和关闭套...
libevent的核心功能是管理一组事件,这些事件可以是文件描述符(如套接字)、信号、时间或者任何其他可触发回调函数的事件源。它通过一个统一的接口,使得开发者可以方便地处理这些事件,而无需关心底层操作系统如何...
muduo库的核心特点是线程安全和轻量级,它包含网络编程的基础组件,如网络套接字、事件处理器、定时器、线程池等,简化了复杂网络服务的构建。 二、安装muduo库 1. 解压文件:首先,我们需要将下载的“muduo-0.9.1...
Linux操作系统中的网络编程涉及到各种类型的套接字,包括TCP套接字、UDP套接字以及原始套接字。原始套接字(SOCK_RAW)是一种特殊的套接字类型,允许程序员对网络协议栈进行更底层的控制。在这个场景下,我们将深入...
在本实验"实验27网络通信-套接字.zip"中,主要涉及的是使用Linux操作系统进行网络通信的基础知识,特别是通过套接字(Socket)这一编程接口实现客户端(Client)和服务器端(Server)的交互。以下是关于这个主题的...
5. **网络编程**:socket()、bind()、connect()、listen()、accept()等,用于创建套接字、绑定地址、连接服务器、监听连接请求等网络操作。 三、内核模块开发 在Linux 2.6.22版本中,内核模块的编写也变得更加灵活...
4. **网络编程**:glibc包含丰富的网络编程接口,如套接字API,支持TCP/IP协议和其他网络协议,使得开发网络应用变得简单。 5. **动态链接**:glibc还负责动态链接,即在程序运行时加载共享库,减少了程序的启动...
Socket在计算机网络中被称作套接字,它是网络协议(如TCP/IP)的抽象接口。通过socket,程序员可以创建、连接、发送和接收数据,从而构建跨网络的通信系统。在Linux系统中,socket编程通常涉及到以下关键步骤: 1. ...
本篇将围绕"Linux-socket-serverandclient.rar"这个压缩包中的知识点展开,主要涉及Linux下的服务器套接字(socket)编程,包括服务器端和客户端的实现。 首先,我们来理解什么是套接字(Socket)。套接字是网络...
7. **网络编程**:`socket()`创建套接字,`bind()`将套接字与地址关联,`listen()`设置服务器监听,`accept()`接收连接请求,`connect()`客户端建立连接。`send()`和`recv()`发送和接收数据,`select()`和`poll()`...
9. **网络编程**:在Linux下,C程序员可以使用套接字API进行网络通信,包括`socket`创建套接字,`bind`绑定地址,`listen`监听连接,`accept`接受连接,`send`和`recv`发送接收数据等。 10. **动态库链接**:C程序...
7. **网络编程**:涵盖网络通信的基础知识,如套接字编程,HTTP协议,以及如何使用Python构建网络客户端和服务端。 8. **数据库编程**:介绍如何使用Python连接和操作各种类型的数据库,如SQLite、MySQL等。 9. **...
9. **网络编程**:涉及socket编程,包括TCP/IP连接、套接字选项、服务器和客户端的实现等。 10. **并发和多线程**:介绍如何创建和管理线程,以及同步和互斥的概念,如mutex, semaphore, condition variable等。 ...
8. **网络编程**:在Linux下,网络编程涉及套接字(socket)API,包括TCP/IP协议栈、UDP通信、套接字选项等,这对于开发网络应用至关重要。 9. **信号处理**:理解信号机制,如何注册信号处理器(signal handler)...