免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1962 | 回复: 9
打印 上一主题 下一主题

SCO Unix 5.0.6原始套接字编程失败 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-28 09:48 |只看该作者 |倒序浏览
在SCO OpenServer 5.0.6上要实现接收别的机器上发送过来的ping消息,于是用原始套接字编写了一个小程序,但是编译运行后,发现不能接收到别的机器上ping过来的消息。用dbx调试,发现程序一直停留在该行:size = recvfrom(sd, pkt, sizeof(pkt), 0, NULL,NULL);
     但是将该程序移植到RH Linux AS3平台下,程序则能接受到别的机器ping过来的消息。
    请各位大虾指点,为什么SCO平台上接受不到别的机器ping来的消息啊!
    感谢各位了!

ceshi.c:

#include   <stdio.h>
#include   <stddef.h>
#include   <sys/types.h>
#include   <sys/stat.h>
#include   <time.h>
#include   <sys/timeb.h>
#include   <fcntl.h>
#include   <signal.h>
#include   <termio.h>
#include   <netinet/in.h>
#include   <sys/socket.h>
#include   <netdb.h>
#include   <sys/ipc.h>
#include   <sys/msg.h>
#include   <unistd.h>
#include   <string.h>
#define SIZE_OF_PACKET   100
int main(int argc, char *argv[])
{
        int sd, size, fromlen;
        char pkt[512];
        int i,pid;
        struct protoent *proto;
        struct sockaddr_in from;
        signal(SIGCHLD,SIG_IGN);
        proto = getprotobyname("icmp";
        //if ((sd = socket(AF_INET, SOCK_RAW, proto->p_proto)) < 0)
        if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
                exit(0);
        setuid(getuid());
        printf("sd=%d\n",sd);
        do
        {
                        printf("begin to rcv\n ";
                        size = recvfrom(sd, pkt, sizeof(pkt), 0, NULL,NULL);
                        printf("ping of %i\n ", size-2;        
        } while (size != SIZE_OF_PACKET + 2;      
        close(sd);
        return 0;
}

# cc -g -o ceshi ceshi.c -lsocket

论坛徽章:
0
2 [报告]
发表于 2008-12-29 08:47 |只看该作者

回复 #1 renguoh 的帖子

没人回答吗?我顶一下,希望各位大虾帮忙!

论坛徽章:
0
3 [报告]
发表于 2008-12-29 08:57 |只看该作者
Ping应该是接收不到的,至少只使用socket是接收不到的

论坛徽章:
0
4 [报告]
发表于 2008-12-29 09:14 |只看该作者

回复 #1 renguoh 的帖子

但是同样这个程序,在RH Linux AS3(或者更高版本)平台上市能够接收到别的机器ping来的消息啊!只是在SCO上,程序阻噻在recvfrom这个函数上

论坛徽章:
0
5 [报告]
发表于 2008-12-29 09:27 |只看该作者
不会吧,ping不是用ICMP么?你怎么recvfrom?

论坛徽章:
0
6 [报告]
发表于 2008-12-29 09:35 |只看该作者

回复 #1 renguoh 的帖子

我已经用了原始套接字(ICMP协议),你们可以将这个现成的程序在Linux上编译一下,然后执行一次就能看到能收到别的机器的消息了!

论坛徽章:
0
7 [报告]
发表于 2008-12-29 09:49 |只看该作者

回复 #6 renguoh 的帖子

或许是你的套接字发包写错了呢

论坛徽章:
0
8 [报告]
发表于 2008-12-29 09:58 |只看该作者

回复 #7 alexhappy 的帖子

Linux上绝对没有问题,程序已经在Linux上跑了,别的机器ping一个50字节的包,屏幕就能在这句 printf("ping of %d\n ", size-2;打印出:ping of 50
只是在SCO上就阻噻在recvfrom函数上。

论坛徽章:
0
9 [报告]
发表于 2008-12-29 10:06 |只看该作者
那这么说,数据有可能在缓冲区里?你试着刷下缓冲区
顺便吧char pkt[512];改为char pkt[50];

论坛徽章:
0
10 [报告]
发表于 2008-12-29 10:18 |只看该作者

回复 #9 alexhappy 的帖子

肯定是不行的了,试过了,没有用,难道SCO上不支持socket的ICMP原始套接字?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP