求助:两个机器互相ping的问题!

fsadfsfsf   2008-1-8 09:39 楼主
两个机器都是vxWorks。由于两个机器是网线直连,这就引入了一个问题。如果机器不开机则网卡没有激活,创建的socket会丢数据。所以甲机器写了一个ping程序,如果甲先开机则首先通过ping来判断乙是否已经开机,判断乙开机后才创建socket,从而保证通信质量。但现在发现一个非常奇怪的现象:甲相连其他的windows机器(不下5台),都可以实现上述意图。但就是连接乙,如果甲先开机,乙后开,则始终Ping不通。但如果乙先开机,后开甲,却能ping通并成功创建socket。请问各位大虾,这是什么原因?谢谢了

回复评论 (8)

甲先开机,抓一下包看看arp是不是一直再发,然后乙开机看看有没有arp的应答,也许会有所帮助
点赞  2008-1-8 10:26
所以找个hub比较方便~~~
点赞  2008-1-8 10:30
呵呵,要是能装hub早就装了,没办法,特殊用途,所以没有空间装hub。可以肯定的是甲先开机,程序运转是正常的。底层icmp包一直在发送,所以在连接其他机器是可以的。

不过,还是谢谢楼上这位朋友
点赞  2008-1-8 19:18

5楼 nec 

乙机本身有没有什么异常呢??感觉如果别的都行是不是考虑一下乙的问题
点赞  2008-1-9 09:03
在我这里OK的!!!
代码如下

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define SERVER_PORT_NUM 5000
STATUS  TestA ( char *              serverName     /* name or IP address of server */ )
{
     char                myRequest[] =  /* request to send to server */
          "Request From Machine A!!  Some Context Here )))))))))))))))))))))))))))))))))))))))) ";
     struct sockaddr_in  serverAddr;    /* server's socket address */
     int                 sockAddrSize;  /* size of socket address structure */
     int                 sFd;           /* socket file descriptor */  
   
    /* create client's socket */

    if ((sFd = socket (AF_INET, SOCK_DGRAM, 0)) == ERROR)
        {
        perror ("socket");
        return (ERROR);
        }

    sockAddrSize = sizeof (struct sockaddr_in);
    bzero ((char *) &serverAddr, sockAddrSize);
    serverAddr.sin_len = (u_char) sockAddrSize;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons (SERVER_PORT_NUM);

    if (((serverAddr.sin_addr.s_addr = inet_addr (serverName)) == ERROR) &&
        ((serverAddr.sin_addr.s_addr = hostGetByName (serverName)) == ERROR))
        {
        perror ("unknown server name");
        close (sFd);
        return (ERROR);
        }

    FOREVER
         {
              while(OK!=ping(serverName,5,0))
                   taskDelay(sysClkRateGet()<<2);
              printf("Ping OK ,run Socket!\n");
              while (sendto (sFd, (caddr_t) &myRequest, sizeof (myRequest), 0,
                             (struct sockaddr *) &serverAddr, sockAddrSize) != ERROR) ;
              perror ("sendto");
              taskDelay(sysClkRateGet()<<2);
         }
               
    close (sFd);
    return OK;
}

STATUS  TestB ( )
{
    struct sockaddr_in  serverAddr;             /* server's socket address */
    struct sockaddr_in  clientAddr;             /* client's socket address */
    char                clientRequest[1024];    /* request/Message from client */
    int                 sockAddrSize;           /* size of socket address structure */
    int                 sFd;                    /* socket file descriptor */

    /* set up the local address */

    sockAddrSize = sizeof (struct sockaddr_in);
    bzero ((char *) &serverAddr, sockAddrSize);
    serverAddr.sin_len = (u_char) sockAddrSize;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons (SERVER_PORT_NUM);
    serverAddr.sin_addr.s_addr = htonl (INADDR_ANY);

    /* create a UDP-based socket */

    if ((sFd = socket (AF_INET, SOCK_DGRAM, 0)) == ERROR)
        {
        perror ("socket");
        return (ERROR);
        }

    /* bind socket to local address */

    if (bind (sFd, (struct sockaddr *) &serverAddr, sockAddrSize) == ERROR)
        {
        perror ("bind");
        close (sFd);
        return (ERROR);
        }

    /* read data from a socket and satisfy requests */

    FOREVER
         {
              if (recvfrom (sFd, (char *) &clientRequest, sizeof (clientRequest), 0,
                            (struct sockaddr *) &clientAddr, &sockAddrSize) == ERROR)
              {
                   perror ("recvfrom");
              }
              else printf(".");
         }
    close (sFd);
    return OK;
}


机器甲运行
TestA ("192.168.31.2");
机器乙运行
TestB();

谁在先都试过,没问题,甲在先,会慢一些,因为arp有发送间隔的,比ping的调用要少很多。
注意确保两台target有不同的IP地址和物理地址(Mac地址).
不知道楼主的问题出在那里,希望楼主能临时找个Hup,拉几根网线过去,Hub可以放在远一些方便的地方。
点赞  2008-1-9 13:19
谢谢楼上。
点赞  2008-1-16 14:03
哦,不好意思偶的程序有点小问题,在通讯中间没有作乙机关机的,只能做Demo,楼主别忘了加上呀,其实过一段时间加个arpFlush就行,偶一贯喜欢偷懒的办法:)。
eeworld上第一次有人给俺分,谢谢楼主呦,眼泪哗哗滴.
点赞  2008-1-21 10:40
哦,不好意思偶的程序有点小问题,在通讯中间没有作乙机关机的检测,只能做Demo,楼主别忘了加上呀,其实过一段时间加个arpFlush就行,偶一贯喜欢偷懒的办法:)。
eeworld上第一次有人给俺分,谢谢楼主呦,眼泪哗哗滴.
(刚才漏了俩字)
点赞  2008-1-21 10:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复