
在得到以下问题:
我做了一个服务器,它能够通过使用select ()来处理多个连接。 但是,如果套接字刚刚得到像“客户端断开连接”或其他任何错误, select也返回一个客户端( FD_SET的索引)。
是否可以在不调用recv ()的情况下检查套接字。 因为接收我需要从我的“ BufferPool ”
示例代码:
在fork()子项中inheritance父套接字
通过套接字接收GET请求
有没有办法阻止套接字发送(),直到我们得到该数据包的确认?
linux的TCP / IP非阻塞发送套接字stream.. TCP recv缓冲区发生了什么?
带epoll的TCP服务器的线程和缩放模型
int ret = recv(clIEnt,buffer_pool->get(),BUFFER_SIZE,0); if(ret == -1) ... // something went wrong
那么我必须再次释放缓冲区,这几乎浪费了我池中的一个缓冲区。 (很短的时间)
所以不能调用recv ()来检查套接字
便携式C ++ 11的方式同时等待一个套接字和布尔variables
有没有办法获得unix套接字连接的另一端的uID
处理socket描述符如文件描述符(fstream)? C ++ / linux的
ETH_P_IP没有按预期工作,我只能接收传入的数据包
如何防止windows试图通过Pcap.net连接到某人时发送RST数据包?
我不确定windows,但是在POSIX兼容的系统上使用getsockopt()就像一个魅力。 尽管在使用之前,确保从池中获取缓冲区比创建额外的系统调用要昂贵。 这是一个代码片段:
int my_get_socket_error(int fd) { int err_code; socklen_t len = sizeof(err_code); if (getsockopt(fd,Sol_SOCKET,SO_ERROR,&err_code,&len) != 0) err_code = errno; else errno = err_code; return err_code; }
更新:
根据这个文件 ,windows似乎也支持它。
不,没有办法避免recv()调用。 如果select()报告套接字是可读的,那么你必须从套接字读取以确定它的新状态。 如果客户端正常断开, recv()将返回0,而不是-1。 如果你不想浪费一个池缓冲区,那么你必须首先读入一个临时的本地缓冲区,然后如果recv()返回任何数据,你可以检索一个池缓冲区并将读取的数据复制到缓冲区中。
调用recv和类似的功能不直接与网络设备或类似的东西。 当您发送或接收数据时,您所做的只是向 *** 作系统询问可用数据,或者将数据放入队列以供发送。 那么当你的代码已经走得更远的时候,OS会做另一个工作。 这就是为什么在下次调用将“联系”OS网络层的套接字函数之后,您会收到错误。
在这一点上得到错误是正常的,你必须处理它们。
但为了防止阻塞套接字和浪费缓冲区,请查看实现或准备库的在线技术,使您可以使用异步方式处理套接字,这样,在套接字将触发接收回调函数之前,您不需要定义任何内容实际接收。
同样,一次性接收大量数据并不是一个好的技术,因为通过TCP层合并或分解数据会面临问题,因为它是基于流的层。 建议在数据包(少量字节)中包含标题并接收它们,这样您就不需要拉取标题,但是只有在标题之后,您才能根据标题中提供的长度读取其余的消息。 这只是一个可能的例子。
经过几分钟的工作和你的帮助,我只收到1byte才收到全额:
SOCKET clIEnt = ...; char temp = 0x00; int len = recv(clIEnt,&temp,1,0); if(len == 0) { // .. clIEnt error handling return; } char* buffer = m_memory_pool->Get(); len = recv(clIEnt,buffer + 1,m_memory_pool->buffer_size() - 1,0); buffer[0] = temp; // data handling
总结以上是内存溢出为你收集整理的在调用recv()之前检查错误全部内容,希望文章能够帮你解决在调用recv()之前检查错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)