socket编程send()函数和recv函数

参考:https://blog.csdn.net/wangzhida2008/article/details/72901938 文章整理。

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

send函数是将数据拷贝到socket发送缓冲区中。

拷贝过程中存在各种情况:

假设socket发送缓冲区的长度为  sendLength;

      比较拷贝数据的大小len与发送缓冲区的大小sendLength的值,

              1、如果len>sendLength,则函数返回SOCKET_ERROR;

                          ------要拷贝的数据都超过了缓冲区大小了,所以报错!

              2、如果len<=sendLength,send检查协议是否在发送缓冲区中的数据

                     1) 如果在发,就等待数据发送完成;

                     2) 如果没在发送,或者缓冲区中没有数据,send比较len和发送缓冲区剩余空间 leftLength大小

                            i)如果len >leftLength,等待协议把发送缓冲区的数据发送完成;

                               ---------虽然没在发送,尽管总的空间时够的,但是,剩余空间不足,只能等了

                            ii)如果len<leftLength,send把buf中的数据拷贝到剩余空间里。

                              ----------- 空间够了,而且也没有在发送数据,趁空闲把数据拷贝到缓冲区。

                                    a)拷贝完成,返回实际拷贝的字节数;

                                    b)拷贝出错,返回SOCKET_ERROR;

                                    c)send在等待协议传送数据时,网络断开,返回SOCKET_ERROR.

                                      ------不是拷贝出错,而是等待协议传送时,网络断开,即网络出错。

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

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

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

recv函数将数据从缓冲区中拷贝到指定buf中;

拷贝过程中存在多种情况:

      1、调用recv函数时,recv先等待s的发送缓冲区中数据被协议传送完成;

              1)协议在传送数据过程中出现网络错误,则recv函数返回SOCKET_ERROR

               -------每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,                 如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR

       2、如果缓冲区中没有数据或者数据已经被协议成功发送完成后

              1)recv检查套接字s的接收缓冲区

                      i)接收缓冲区中没有数据或者协议正在接收数据,recv一直等待,直到协议把数据接收完毕。

                            a)接收完毕后,recv函数就把s的接收缓冲区中数据拷贝到buf中,recv函数返回的是实际拷贝的字节数。

                              ------协议接收到的数据可能大于buf的长度,所以此时需要多调用几次recv函数才能把s的接收

                                       缓冲区的数据拷贝完。

                              -------recv在拷贝时出错,则函数SOCKET_ERROR,如果recv函数在等待协议接收数据时网络中断了,则返回0.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值