5 发送数据与错误处理

本文介绍了FastDFS中的tcpsenddata_nb函数在非阻塞模式下发送数据,以及在遇到EAGAIN、EWOULDBLOCK和EINTR错误时的处理方式。特别讨论了EINTR错误的产生原因,并探讨了为何需要处理errno=0的情况,可能是由于信号中断导致的errno被修改。同时提到了服务器崩溃时,客户端的重传机制和超时错误ETIMEOUT。
摘要由CSDN通过智能技术生成

一、tcpsenddata_nb

tcpsenddata_nb()是fastdfs中主要的用于发送数据的函数。注意:本例sock的非阻塞的。

int tcpsenddata_nb(int sock, void* data, const int size, const int timeout)
{
	int left_bytes;
	int write_bytes;
	int result;
	unsigned char* p;
#ifdef USE_SELECT
	fd_set write_set;
	struct timeval t;
#else
	struct pollfd pollfds;
#endif

#ifdef USE_SELECT
	FD_ZERO(&write_set);
	FD_SET(sock, &write_set);
#else
	pollfds.fd = sock;
	pollfds.events = POLLOUT;
#endif

	p = (unsigned char*)data;
	left_bytes = size;
	while (left_bytes > 0)
	{
		write_bytes = send(sock, p, left_bytes, 0);
		if (write_bytes < 0)
		{
			if (!(errno == EAGAIN || errno == EWOULDBLOCK))  //如果是这两个错误,则问题不太,重新调用send()即可。
			{
				return errno != 0 ? errno : EINTR;
			}
		}
		else
		{
			left_bytes -= write_bytes;
			p += write_bytes;
			continue;
		}
//以下在write_bytes<0时执行。
#ifdef USE_SELECT
		if 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值