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

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信号,进程对该信号的默认处理是进程终止。

分享到:
评论

相关推荐

    send函数 和recv函数

    里面有socket函数和recv函数的详细讲解,有用

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

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

    java初学者ui练手项目(3个)

    1.socket函数send和recv函数2.另外俩个忘了,Java开发的ui的部分代码

    c语言socket编程指南

    12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()函数 15) getpeername()函数 16) gethostname()函数 17) 域名服务(DNS) 18) 客户-服务器背景知识 19) 简单的服务器 20) ...

    linux 下收发数据

    linux 下收发数据 socket函数 以及send recv 函数都用到了

    python网络编程调用recv函数完整接收数据的三种方法

    最近在使用python进行网络编程开发一个通用的tcpclient测试小工具。...适用场景:客户端和服务器的链接为短链接(即一次socket通讯后连接就会关闭)。代码如下: import socket,struct,sys,time Port

    Linux-socket编程指南

    12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()函数 15) getpeername()函数 16) gethostname()函数 17) 域名服务(DNS) 18) 客户-服务器背景知识 19) 简单的服务器 20) ...

    网络编程 socket函数

    体验并掌握Winsock流式编程中常用函数(如socket(),bind(),listen(),accept(),connect(),recv(),send()等)的用法;体验并掌握Winsock流式程序设计的一般方法;

    socket教程

    12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()函数 15) getpeername()函数 16) gethostname()函数 17) 域名服务(DNS) 18) 客户-服务器背景知识 19) 简单的服务器 20) ...

    C语言SOCKEt编程指南.rar

    12) send()和recv()函数 13) sendto()和recvfrom()函数 14) close()和shutdown()函数 15) getpeername()函数 16) gethostname()函数 17) 域名服务(DNS) 18) 客户-服务器背景知识 19) 简单的服务器 ...

    C语言TCP实现代码案例

    和客户端进行数据传输,使用send()和recv()函数进行数据发送和接收。 关闭连接,使用close()函数关闭套接字。 客户端: 创建一个套接字(socket),使用socket()函数。 连接到服务器的IP地址和端口号,使用connect...

    socket和TCP之间的关系

    Socket API提供了一些基本的接口函数,如socket()、bind()、connect()、listen()、accept()、send()、recv()等,这些函数可以方便地实现TCP连接的建立和数据传输等操作。 具体来说,应用程序在使用Socket API进行...

    socket_linux_client.c

    #include<stdio.h> //fopen();fwrite(); #include <stdlib.h> //标准函数库 #include <errno.h> //定义错误码 #include <string.h>//字符串...#include <sys/socket.h>//send();recv(); #include #include <dirent.h>

    ios socket demo

    简单Demo , 对socket 各个函数运用 核心代码 socket即网络, 这就是咱所用网络(NSURLSession/Connection/AFN...等)最底层代码了 // 创建 int socket(int domain, int type, int protocol); // 连接 int connect(int,...

    计算机网络 python socket通信

    Python中的socket通信是一种在计算机网络中实现进程间通信的方法。它基于套接字(socket)API...发送和接收数据:使用套接字对象的send()函数向对方发送数据,使用recv()函数接收对方发送的数据。注意,数据必须按照约

    C++socket编程_socket编程_splitbnd_socket_Listen!_c++socket编程_

    网络编程,当然要用到Windows Socket(套接字)技术。Socket相关的操作由一系列API函数来完成,比如socket、bind、listen、connect、accept、send、sendto、recv、recvfrom等。

    WinSocket 常用函数及结构

    常用结构定义及函数 WSADATA sockaddr_in fd_set timeval WSAStartup WSACleanup htons htonl ...socket closesocket ...send recv ...send 、sendto 、recv 、recvfrom函数在不同模式下的不同表现

    http服务器 c/c++写成 (只使用了socket)

    只用到了socket send recv等基础socket函数写成的多线程http网页服务器。一般静态网页的显示以及多人同时访问都没有问题。使用内存映射文件技术读取资源,可载入较大的网页资源。

    精通Windows Sockets网络开发:基于Visual C++实现-带源码

    3.4.7send()函数 3.4.8closesocket()函数 3.4.9shutdown()函数 3.4.10connect()函数 3.5tcp示例程序 3.5.1服务器实现 3.5.2客户端实现 3.6基本udp套接字编程 3.6.1recvfrom()函数 3.6.2sendto()函数 3.7...

Global site tag (gtag.js) - Google Analytics