send函数

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

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

客户程序一般用send函数向server发送请求,而server则通经常使用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   );

不论是客户还是server应用程序都用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信号,进程对该信号的默认处理是进程终止。

sendto和recvfrom一般用于UDP协议中,可是假设在TCP中connect函数调用后也能够用.

sendto()和recvfrom()——利用数据报方式进行传输数据 
  在无连接的数据报socket方式下,因为本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址,sendto()函数原型为: 
  int sendto(int sockfd, const void *msg,int len unsigned int flags, const struct sockaddr *to, int tolen); 
  该函数比send()函数多了两个參数,to表示目地机的IP地址和port号信息,而tolen经常被赋值为sizeof (struct sockaddr)。Sendto 函数也返回实际发送的数据字节长度或在出现发送错误时返回-1。 
  recvfrom()函数原型为: 
  int recvfrom(int sockfd,void *buf,int len,unsigned int lags,struct sockaddr *from,int *fromlen); 
  from是一个struct sockaddr类型的变量,该变量保存源机的IP地址及port号。fromlen常置为sizeof (struct sockaddr)。当recvfrom()返回时,fromlen包括实际存入from中的数据字节数。Recvfrom()函数返回接收到的字节数或当出现错误时返回-1,并置对应的errno。 
  应注意的一点是,当你对于数据报socket调用了connect()函数时,你也能够利用send()和recv()进行传输数据,但该socket仍然是数据报socket,而且利用传输层的UDP服务。但在发送或接收数据报时,内核会自己主动为之加上目地和源地址信息。

send,recv,sendto,recvfrom的更多相关文章

  1. UNIX网络编程-send、recv、sendto、recvfrom详解

    send.recv和sendto.recvfrom,一般情况下,send.recv在TCP协议下使用,sendto.recvfrom在UDP协议下使用,也可以在TCP协议下使用,不过用的很少. 1.s ...

  2. vb6通send和recv请求网络资源

    最近为了弄清楚send和recv的用法,特意用vb6测试了一下,头文件冗余的比较多: Option Explicit Private Declare Function setsockopt Lib & ...

  3. socket中send和recv函数

    Socket一次Recv接受的字节有限制么? 从套接字接收数据. 返回值是表示接收数据的字符串. 一次接收的最大数据量由bufsize指定.它默认为零. 注意为了最好地匹配硬件和网络现实,bufsiz ...

  4. 程序编写安全代码——sendto和recvfrom的大坑

    近日帮一个兄弟查代码问题,再处理完一系列问题以后,发现程序某些时候工作还是不正常,甚至会崩溃.因为环境所限,不能使用gdb,所以我只能review他的代码.最终发现原来是sendto和recvfrom ...

  5. send,recv,sendto,recvfrom ~转载

     send,recv,sendto,recvfrom send函数 int send( SOCKET s,    const char FAR *buf,    int len,    int fla ...

  6. socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

    Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...

  7. [转]socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

    Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...

  8. IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

  9. send和sendmsg性能测试【sendmsg和send的性能基本一样,并没有得到优化】

    1,摘要:测试send和sendmsg的性能,影响这两个函数性能的因素主要有发送的字节大小,增加循环次数,从100到10000000(千万)减少计算误差 2,基本信息cat /proc/cpuinfo ...

随机推荐

  1. JSOI2007文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1613  Solved: 656[Submit][Statu ...

  2. Fiddler的基本介绍

    fiddler 简介: 一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视.设置断 ...

  3. session问题

    如果 <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424&q ...

  4. vtiger 支持 物业收费功能 微信收费

    谁要?需要什么功能? 直接在下面留言,博主会整理大家的需求,形成产品,发出来.

  5. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)

    于ASP.NET MVC Preview5. 前一篇中我们已经了解了Action Filter 与 内置的Filter实现,现在我们就来写一个实例.就写一个防盗链的Filter吧. 首先继承自Filt ...

  6. tpl + ccr

    不是非此即彼的场景.如下混合使用CCR+TPL的代码说明问题:It's not an either/or scenario.You can intermix CCR and TPL code like ...

  7. 在 MacOS 上编译链接 OpenGL 程序

    几个星期以前开始折腾在我的MBA上写 OpenGL 小程序.我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接.网上查了一下,MacOS上的Open ...

  8. js中的继承2--原型继承

    一. 原型与构造函数 Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型.这个函数包括构造函数和普通函数,我们讲的更多是构造函数的原型,但是也不能否定普通函数 ...

  9. Makefile.am讲解

    Makefile.am详解 实战Makefile.amMakefile.am是一种比Makefile更高层次的规则.只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成.表一列出了可执行 ...

  10. 中断——中断描述符表的定义和初始化(一) (基于3.16-rc4)

    1.中断描述符表的定义(arch/x86/kernel/traps.c) gate_desc debug_idt_table[NR_VECTORS] __page_aligned_bss; 定义的描述 ...