我想用原始套接字写一个类似ping的程序,里面有一行是recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);但是程序在运行时出现问题:现象是,能够到达的ip程序正常工作,不能到达的ip程序就不动了,好像死掉一样,我调了一下发现程序停在了上面那行语句。我已经设置了超时为1秒,但是10分钟也没有返回。请各位大侠救命啊!!
解决方案 »
- clistctrl能收到dragDrop中的LVN_BEGINDRAG(开始拖曳)消息,但是HDN_ENDDRAG(结束拖曳)的消息收不到,不知何解
- 单核上用多线程没多大用处
- 怎样实现位图放大缩小,框选放大,鼠标拖动(请出世源代码),再现等待
- 我用Dev-C++编opengl程序,请问如何连接opengl32.lib、glu32.lib、glaux.lib,并且请告诉我这三个包在那有的下?谢谢!!
- CFileDialog 选择保存类型的问题
- 如何监视局域网内某个共享文件夹的变化
- CRecordset
- 怎样在用户拖动拆分条改变FORMVIEW大小时让FORMVIEW里的控件随之改变相应的位置?
- 组合框和数据库
- 请教如何打开这样的东东?????
- 请教一个基础问题!!!!见笑了
- 请教:GetQueuedCompletionStatus函数的参数说明及函数的作用!急!!多谢!
int TimeOut=6000; //设置发送超时6秒
if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
return 0;
}
TimeOut=6000;//设置接收超时6秒
if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
return 0;
}
sizeof(timeout)),但是超时后recvfrom函数并没有返回错误,而是一直阻塞。我看到有些帖子说需要设置异步模式取消阻塞,请问如果用异步模式,recvfrom在超时后会怎样?呵呵,我好像看到希望了。
int readable_timeo(int fd, int sec)
{
fd_set rset;
struct timeval tv; FD_ZERO(&rset);
FD_SET(fd, &rset);
tv.tv_sec = sec;
tv.tv_usec = 0; return (select(fd+1, &rset, NULL, NULL, &tv));
}
对readable_timeo的调用实例
void dg_cli(FILE *fp, int sockfd, const struct sockaddr *pservaddr,
socklen_t servlen)
{
int n;
char sendline[MAXLINE],recvline[MAXLINE+1]; while (fgets(sendline, MAXLINE, fp)!=NULL){
sendto(sockfd, sendline, strlen(sendline),0,pservaddr,servlen);
if (readable_timeo(sockfd,5)==0){
fprintf(stderr,"socket timeout\n");
}else{
n = recvfrom(sockfd,recvline,MAXLINE,0,NULL,NULL);
recvline[n]=0; /* null terminate */
fputs(recvline,stdout);
}
}
}