recvfrom 问题!

zhaistone 2004-04-29 04:47:46
系统:RH9+ 256M +C2.0G
程序问题:
1。单线程用recvfrom接收数据,UDP格式。收到一定数目的包后,recvfrom就返回-1,不再接收。请问是什么原因?(注:接收线程中收到包后有处理函数代码调用。接收缓冲用的是局部字符串缓冲。线程机制用的是POSIX的pthread。)
2。由于利用的是非阻塞收包,所以需要无限循环等待,程序每次启动后占用CPU很高。请问是不是由于无限循环的问题引起的?

在线等待!!多谢
...全文
342 10 打赏 收藏 转发到动态 举报
写回复
用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!

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧