- 论坛徽章:
- 0
|
在REDHAT 9编程中遇到两个问题,已经被折磨了好几天了,希望有高手可以指点一二,谢谢先
问题一:
通过UDP连接发送报文的函数, 在对方机器不存在的情况下, 用SEND函数发送报文会返回ERRNO为29的错误,即连接拒绝,但有时候又成功, 所以无法根据这点来判断对方程序是否正常, 是什么原因? 大家有遇到类似的问题吗?
问题二:
有一个简单的函数, 接收已建立UDP连接的SOCKET上来的数据, 需要循环调用
如果超时没有收到数据,返回一个值, 调用处做了一些处理后循环调用该函数
我目前遇到的问题是, 如果接收不到数据,第一次超时的时候, 都可以判断出超时,
但之后就再也无法触发超时事件
函数如下:
jmp_buf udp_jmp_env;
void handle_timeout()
{
printf("\nTime Out.\n");
alarm ( 0 );
signal ( SIGALRM , handle_timeout );
longjmp ( udp_jmp_env , 1 );
}
int RecvData(int iTimeout, struct commhb *rcv_hb)
{
char sBuffer[512];
int iRcvLen;
int iRet;
iRet = 0;
alarm(iTimeout);
signal ( SIGALRM , handle_timeout );
if ( setjmp ( udp_jmp_env ) != 0 )
{
iRet = alarm(0);
printf("Into setjmp.\n");
return(1);
}
memset(sBuffer, 0, sizeof(sBuffer) );
if ((iRcvLen=recv(server_fd, sBuffer, MAXDATASIZE, 0)) == -1)
{
perror("recv error");
printf("errno=%d [%s]\n", errno, strerror(errno));
return(2);
}
memcpy( (char *)rcv_hb, sBuffer+2, sizeof(struct commhb) );
alarm(0);
return(0);
}
其中,下面这两句的顺序调整过,结果一样
alarm(iTimeout);
signal ( SIGALRM , handle_timeout ); |
|