社区
通信技术
帖子详情
recvfrom 问题!
zhaistone
2004-04-29 04:47:46
系统:RH9+ 256M +C2.0G
程序问题:
1。单线程用recvfrom接收数据,UDP格式。收到一定数目的包后,recvfrom就返回-1,不再接收。请问是什么原因?(注:接收线程中收到包后有处理函数代码调用。接收缓冲用的是局部字符串缓冲。线程机制用的是POSIX的pthread。)
2。由于利用的是非阻塞收包,所以需要无限循环等待,程序每次启动后占用CPU很高。请问是不是由于无限循环的问题引起的?
在线等待!!多谢
...全文
342
10
打赏
收藏
recvfrom 问题!
系统:RH9+ 256M +C2.0G 程序问题: 1。单线程用recvfrom接收数据,UDP格式。收到一定数目的包后,recvfrom就返回-1,不再接收。请问是什么原因?(注:接收线程中收到包后有处理函数代码调用。接收缓冲用的是局部字符串缓冲。线程机制用的是POSIX的pthread。) 2。由于利用的是非阻塞收包,所以需要无限循环等待,程序每次启动后占用CPU很高。请问是不是由于无限循环的问题引起的? 在线等待!!多谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zhaistone
2004-05-01
打赏
举报
回复
我自己也觉得CPU占用率是由于无限循环!
今天做了一些测试,发现每次只能接收227个数据包,就不处理了,226个可以全部接收(都是用同一组数据包),如果每次延时1秒发送,可以全部接收,接收缓冲1K,可能后面的包把缓冲冲掉了.把套接口设成阻塞仍然一样.
套接口停止接收后,不退出程序,再发包,仍然可接收227个左右,
zhaistone
2004-05-01
打赏
举报
回复
UDP联接虽然不保证包全部到达,但此程序确实是有问题.请帮我测一下.多谢!!
zhaistone
2004-05-01
打赏
举报
回复
#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <termio.h>
using namespace std;
int main(int argc, char* argv[])
{
int nServersocket;
struct sockaddr_in ser_addr;
if ((nServersocket = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
{
cout<<"socket create error!\n";
return -1 ;
}
//将socket该为非阻塞模式
unsigned long noBlock = 1;
if (ioctl(nServersocket, FIONBIO, (unsigned long*)&noBlock) != 0)
{
cout<<"socket: ioctl error\n";
close(nServersocket);
return -1 ;
}
const int on = 1;
if( setsockopt( nServersocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
{
cout << "setsockopt failed \n";
close(nServersocket);
return -1;
}
bzero(&ser_addr, sizeof(oMyAddress));
ser_addr.sin_family=PF_INET;
ser_addr.sin_port = htons(5555);
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(nServersocket, (struct sockaddr*)&ser_addr, sizeof(struct sockaddr)) != 0)
{
cout<<"bind error\n";
close(nServersocket);
return -1 ;
}
//接收数据包
char strReceivebuf[10240] = {0};
static int recvNum ;
while(1)
{
int ret = recvfrom(nServersocket, strReceivebuf, 1024, 0, NULL, NULL);
//由于改为非阻塞模式,可能出现没有接收到数据的错误
if (ret < 0 )
{
continue;
}
cout << "--" << ++recvNum << "--\n";
}
close(nServersocket);
return 0;
}
COM_MOC
2004-04-30
打赏
举报
回复
接收之前可以用select检测是否有数据可读,然后再接收数据。如果是这样再找找其它原因吧。
icanfeeling
2004-04-30
打赏
举报
回复
POSIX下好象有异步函数吧,好象是aio打头的……
wangle11111
2004-04-30
打赏
举报
回复
我认为cpu占用率高就是因为使用非阻塞模式造成的,因为你要不断的检测函数调用是否返回正确的值,在win下非阻塞模式中如果函数没能处理完数据就会返回WSAEWOULDBLOCK 这个值是100035。
tianxiangyuan
2004-04-29
打赏
举报
回复
应该是你使用POSIX的pthread方面的问题。
sevencat
2004-04-29
打赏
举报
回复
WIN下面的话先用WSAGetLastError,linux下面就不用我说了吧。CPU占用率很高不是因为堵塞的缘故。
zhaistone
2004-04-29
打赏
举报
回复
up!
zhaistone
2004-04-29
打赏
举报
回复
up!
非阻塞
recv
from的设置
系统默认
recv
from函数是阻塞的,这里是非阻塞的设置!!!
Linux系统调用--
recv
/
recv
from 函数详解
从套接字上接收一个消息。对于
recv
from ,可同时应用于面向连接的和无连接的套接字。
recv
一般只用在面向连接的套接字,几乎等同于
recv
from,只要将
recv
from的第五个参数设置NULL。 如果消息太大,无法完整存放在所提供的缓冲区,根据不同的套接字,多余的字节会丢弃。 假如套接字上没有消息可以读取,除了套接字已被设置为非阻塞模式,否则接收调用会等待消息的到来。
recv
from()和sendto()函数
recv
from()和sendto()函数
css.rar_WSASend_WSASendTo与Send_WSASendto_
recv
from_wsasend pudn
主要有调整的处理接口TCP组的有 send WSASend UDP组的是 sendto
recv
from WSASendto WSA
Recv
from 下面的这四个发出封包接口参数二,封包地址,数据类型为整数型,1.8版模块需要选中参考项,原1.5版无需选参考 send WSASend sendto WSASendto 修改了参数二为参考后,当需要修改封包时,直接把新封包的内存地址赋值为该参数即可,居体操作代码见 mydll.e 只所以这么改是为了避免有时拦到的封包长度短,而要修改进去的封包长度超过了他的可写内存字节数时会产生的内存非法操作 UDP这组的四个接口的参数四,网络地址,数据类型在1.8版模块里需要改为文本型,原1.5版的是整数型 sendto
recv
from WSASendto WSA
Recv
from 对于这四个接口的参数四改为文本型后如何操作,可以见1.8版的 取TCP重定向演示程序里的代码。 因为修改这个网络地址的参数为文本型,所以可以直接以文本型读取或赋值修改进去。
tcp.rar_UDP
recv
from_tcp_tcp sendto_udp 函数_udp_sendto
UDP实现的简易通讯程序 用sendto(),
recv
from()函数实现客户机与服务器之间的信息交换。
通信技术
4,358
社区成员
28,927
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章