`
san_yun
  • 浏览: 2662227 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Socket send函数和recv函数详解

 
阅读更多

int send( SOCKET s,      const char FAR *buf,      int len,      int flags ); 

不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。

客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

该函数的第一个参数指定发送端套接字描述符;

第二个参数指明一个存放应用程序要发送数据的缓冲区;

第三个参数指明实际要发送的数据的字节数;

第四个参数一般置0。

这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲 的 长度 , 如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议 是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余 空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的, send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里 )。 如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端 。 如 果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR)

注意:在Unix系统下,如果send在等待协议传送数据时网络断开的话,调用send的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

recv函数

int recv( SOCKET s,     char FAR *buf,      int len,     int flags     );  

不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。

该函数的第一个参数指定接收端套接字描述符;

第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;

第三个参数指明buf的长度;

第四个参数一般置0。

这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲 中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数 据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到 协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的 ),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

注意:在Unix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。

分享到:
评论

相关推荐

    socket send和recv详解

    Socket 编程中的 send 和 recv 函数详解 在 Socket 编程中,send 和 recv 函数是最基本的网络通信函数。它们用于在客户端和服务端之间传递数据。在 TCP/IP 协议中,send 函数用于将数据发送到服务端,而 recv 函数...

    send函数 和recv函数

    ### send函数与recv函数详解 在计算机网络编程中,socket编程是实现进程间通信的一种重要方式,其中`send`函数和`recv`函数是进行数据发送与接收的关键接口。下面将详细阐述这两个函数的工作原理、参数意义以及使用...

    socket_recv函数使用心得.

    在 Windows 平台下,使用 winsock 函数时,recv 函数也会返回-1,但是如果没有设置超时,send 和 recv 函数都会堵住不动。 学习 socket_recv 函数需要了解其返回值的含义和使用场景,了解套接字的选项和多路复用 ...

    Socket-send-and-recv-.rar_c socket send recv_socket

    Socket API提供了send和recv函数,它们是TCP/IP通信的核心组件,用于在套接字之间发送和接收数据。在C语言环境中,socket编程主要涉及到以下知识点: 1. **套接字(Socket)概念**:套接字是网络通信的一种端点,...

    python数据分析与可视化-02-socket之send和recv的原理剖析.ev4.rar

    Python的socket模块提供了一系列的函数和类,用于实现TCP(传输控制协议)和UDP(用户数据报协议)等网络通信协议。在开始使用socket之前,我们需要导入socket模块,并创建一个socket对象。 2. **socket的创建**:...

    Socket编程函数说明

    该函数的原型为:`send(socket, data, length, flags)`。 * `socket`:是所用套接字的描述符。 * `data`:是待发送数据在内存中的地址。 * `length`:是一个整数,指定数据的字节数。 * `flags`:包含请求特殊选项...

    send-recv-init

    在Linux操作系统中,`send`和`recv`是两个核心的网络编程函数,它们用于实现套接字(socket)间的通信。这两个函数是基于Berkeley套接字API的一部分,广泛应用于客户端-服务器程序的设计中。本文将深入探讨`send`和`...

    Socket常用函数大全

    `recv()`和`send()`函数分别用于接收和发送数据。`recv()`函数从套接字接收数据,而`send()`函数则将数据发送到套接字。它们是网络通信中最基本且最频繁使用的函数。 ### recvfrom() 和 sendto() `recvfrom()`和`...

    ws2_32.dll 拦截send函数并把发送内容写到ob文件里

    在Windows系统中,`ws2_32.dll`是一个重要的动态链接库,它包含了用于网络编程的函数,如`send()`和`recv()`。这些函数是Windows Socket API(Winsock)的一部分,允许开发者进行TCP/IP通信。在这个话题中,我们主要...

    Socket Send and Receive

    #### 一、Send函数详解 `send`函数用于从一个套接字中发送数据。其原型如下: ```c++ int send( SOCKET s, const char FAR *buf, int len, int flags ); ``` - **参数解释**: - `SOCKET s`: 指定发送数据的...

    windows socket api函数大全

    《Windows Socket API函数详解》 Windows Socket API,简称Winsock,是Microsoft为Windows操作系统实现的一套网络编程接口,它遵循BSD Socket模型,提供了丰富的函数集,用于开发TCP/IP网络应用程序。这些API函数...

    简单的测试socket函数程序

    - `send()` 和 `recv()`:这两个函数用于发送和接收数据。在连接建立后,客户端和服务器都可以通过`send()`发送数据,通过`recv()`接收数据。 在局域网内收发信息,我们通常会使用广播或多播技术。广播是将信息发送...

    对send(),recv()函数的全面理解

    int send( SOCKET s, const char FAR *buf, int len, int flags );...这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的 长度, 如果

    socket函数使用说明

    发送数据的主要函数是`send()`和`recv()`,它们分别用于向连接的Socket发送数据和接收数据: ```c int send(SOCKET s, const char *buf, int len, int flags); int recv(SOCKET s, char *buf, int len, int flags);...

    有关socket编程的函数详解

    ### 有关socket编程的函数详解 #### 一、概述 Socket编程是网络编程的重要组成部分,它使得不同计算机之间可以通过网络进行通信。在Windows环境下,使用socket编程时,我们需要调用一系列特定的API函数来实现这一...

    Socket编程的发送接收消息函数

    相比之下,recv函数用于从TCP连接的另一端接收数据。它的函数原型为: ```cpp int recv(SOCKET s, char FAR *buf, int len, int flags); ``` 参数含义与send类似,但recv在接收数据时的行为有所不同。recv会等待发送...

    Socket编程所有函数说明[详细]

    ### Socket编程核心函数详解 #### 1. accept(接受socket连接) ...在实际应用中,还需结合`socket()`, `listen()`, `send()`, `recv()`等其他函数,以及理解socket的不同类型和协议族,才能构建完整的网络通信系统。

    linux下socket模板函数发送与接受

    Socket接口提供了丰富的函数,使得开发者能够创建、连接、发送和接收数据。本教程将深入探讨Linux下的Socket模板函数,以帮助你理解如何有效地进行发送和接收操作。 一、Socket基础概念 Socket可以视为进程间通信的...

    与socket有关的一些函数介绍

    6. send()和recv()函数 这两个函数用于在已连接的Socket之间发送和接收数据。send()的原型为: ```c ssize_t send(int sockfd, const void *buf, size_t len, int flags); ``` recv()的原型为: ```c ssize_t recv...

Global site tag (gtag.js) - Google Analytics