`
unsoundboy
  • 浏览: 63317 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Linux网络编程--6. 高级套接字函数

阅读更多
Linux网络编程--6. 高级套接字函数
http://linuxc.51.net 作者:hoyt (2001-05-08 11:22:09)

    在前面的几个部分里面,我们已经学会了怎么样从网络上读写信息了.前面的一些函数(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来关闭子进程的套接字描述符. 
分享到:
评论

相关推荐

    实战linux socket编程--示例源码.rar_C++ socket_linux 源码_socket 编程 linux_s

    - 常见的套接字级别有SOL_SOCKET(适用于所有类型套接字)和IPPROTO_TCP/UDP(针对TCP或UDP特定的选项)。 6. **多线程与并发处理** - 为了处理多个客户端连接,服务器端通常会采用多线程或者异步I/O模型。 - 每...

    libevent-2.1.11-stable.tar.gz

    libevent的核心功能是为多种事件源提供一个统一的接口,包括文件描述符、信号、时间事件以及网络套接字等。在本篇中,我们将详细探讨libevent-2.1.11-stable这一稳定版本在CentOS系统中的安装、使用和重要特性。 ...

    Linux程序设计-网络编程-第9章.ppt

    Socket,即套接字,是TCP/IP协议传输层提供的一种接口,它允许程序员通过API访问网络资源。在Linux系统中,Socket类似于文件描述符,可以用于读写数据,且Socket接口定义了一系列函数,如`socket()`、`bind()`、`...

    Linux程序设计-网络编程-第9章.rar

    本章重点讨论的是"Linux程序设计-网络编程"中的第九章内容,虽然具体的章节标题未给出,但我们可以推测这可能涉及到TCP/IP套接字编程,这是Linux网络编程的核心。 网络编程的基本概念包括协议、套接字、端口和IP...

    linux网络编程-源代码.rar

    1. **套接字(Sockets)编程**:这是Linux网络编程的基础,涉及到socket创建、绑定、监听、连接、接受和发送数据等步骤。通过学习源代码,你可以理解如何使用套接字API进行客户端-服务器通信。 2. **TCP/IP协议栈**...

    node-v0.10.0-linux-arm-pi.tar.gz

    6. **网络编程**:Node.js有强大的网络库,可以方便地创建HTTP服务器、TCP套接字等。 7. **包管理器npm**:Node.js的包管理器npm是最大的开源软件包生态系统,允许开发者轻松安装、共享和依赖管理代码。 8. **性能...

    Linux网络编程-文字版.pdf

    在Linux网络编程中,套接字API包括创建套接字(socket())、绑定地址(bind())、监听连接(listen())、接受连接(accept())、发起连接(connect())、数据传输(send()、recv()、sendto()、recvfrom())和关闭套...

    libevent-2.0.15-stable.tar.gz

    libevent的核心功能是管理一组事件,这些事件可以是文件描述符(如套接字)、信号、时间或者任何其他可触发回调函数的事件源。它通过一个统一的接口,使得开发者可以方便地处理这些事件,而无需关心底层操作系统如何...

    muduo-0.9.1-beta.tar.gz

    muduo库的核心特点是线程安全和轻量级,它包含网络编程的基础组件,如网络套接字、事件处理器、定时器、线程池等,简化了复杂网络服务的构建。 二、安装muduo库 1. 解压文件:首先,我们需要将下载的“muduo-0.9.1...

    Linux操作系统网络编程--原始套接字

    Linux操作系统中的网络编程涉及到各种类型的套接字,包括TCP套接字、UDP套接字以及原始套接字。原始套接字(SOCK_RAW)是一种特殊的套接字类型,允许程序员对网络协议栈进行更底层的控制。在这个场景下,我们将深入...

    实验27网络通信-套接字.zip

    在本实验"实验27网络通信-套接字.zip"中,主要涉及的是使用Linux操作系统进行网络通信的基础知识,特别是通过套接字(Socket)这一编程接口实现客户端(Client)和服务器端(Server)的交互。以下是关于这个主题的...

    linux-api-2.6.22.rar_linux-api-2.6.22_linux-api-2.6.22.chm

    5. **网络编程**:socket()、bind()、connect()、listen()、accept()等,用于创建套接字、绑定地址、连接服务器、监听连接请求等网络操作。 三、内核模块开发 在Linux 2.6.22版本中,内核模块的编写也变得更加灵活...

    glibc-2.5-24.i386

    4. **网络编程**:glibc包含丰富的网络编程接口,如套接字API,支持TCP/IP协议和其他网络协议,使得开发网络应用变得简单。 5. **动态链接**:glibc还负责动态链接,即在程序运行时加载共享库,减少了程序的启动...

    10-Linux系统编程-第10天(网络编程基础-socket)111.zip

    Socket在计算机网络中被称作套接字,它是网络协议(如TCP/IP)的抽象接口。通过socket,程序员可以创建、连接、发送和接收数据,从而构建跨网络的通信系统。在Linux系统中,socket编程通常涉及到以下关键步骤: 1. ...

    Linux-socket-serverandclient.rar_embedded_linux server socket_l

    本篇将围绕"Linux-socket-serverandclient.rar"这个压缩包中的知识点展开,主要涉及Linux下的服务器套接字(socket)编程,包括服务器端和客户端的实现。 首先,我们来理解什么是套接字(Socket)。套接字是网络...

    linux-c-api-ref.zip_linux api_linux-c-api-ref

    7. **网络编程**:`socket()`创建套接字,`bind()`将套接字与地址关联,`listen()`设置服务器监听,`accept()`接收连接请求,`connect()`客户端建立连接。`send()`和`recv()`发送和接收数据,`select()`和`poll()`...

    linux-c-develop.rar

    9. **网络编程**:在Linux下,C程序员可以使用套接字API进行网络通信,包括`socket`创建套接字,`bind`绑定地址,`listen`监听连接,`accept`接受连接,`send`和`recv`发送接收数据等。 10. **动态库链接**:C程序...

    diveintopythonzh-cn.tar.gz

    7. **网络编程**:涵盖网络通信的基础知识,如套接字编程,HTTP协议,以及如何使用Python构建网络客户端和服务端。 8. **数据库编程**:介绍如何使用Python连接和操作各种类型的数据库,如SQLite、MySQL等。 9. **...

    Linux-C-function-user.rar_linux user

    9. **网络编程**:涉及socket编程,包括TCP/IP连接、套接字选项、服务器和客户端的实现等。 10. **并发和多线程**:介绍如何创建和管理线程,以及同步和互斥的概念,如mutex, semaphore, condition variable等。 ...

    Linux-application-development.rar_Linux编程实例

    8. **网络编程**:在Linux下,网络编程涉及套接字(socket)API,包括TCP/IP协议栈、UDP通信、套接字选项等,这对于开发网络应用至关重要。 9. **信号处理**:理解信号机制,如何注册信号处理器(signal handler)...

Global site tag (gtag.js) - Google Analytics