首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > VxWorks >

在vxWorks上网络编程的有关问题,connect()总是报错,会进入EHOSTUNREACH分支,请!感激不尽

2013-01-01 
在vxWorks下网络编程的问题,connect()总是报错,会进入EHOSTUNREACH分支,请高手指点!感激不尽个人刚开始接

在vxWorks下网络编程的问题,connect()总是报错,会进入EHOSTUNREACH分支,请高手指点!感激不尽
个人刚开始接触VxWorks,想要利用FTP传输文件,FTP服务端是Windows,客户端是VxWorks(虚拟在与Windows同一台机器上),我在Windows上装了Serv-U,可以实现ftp服务器的功能了(利用cmd,可以与ftp服务器交互操作),但是VxWorks客户端跑起来,利用ftpXfer函数连接服务器时总是出错,我跟进汇编发现在ftpHookup里就错了,于是又跟进ftpHookup里,最后发现是connect函数出了问题,进入了EHOSTUNREACH分支,无法连接服务器,因此问题转化成了TCP连接时无法连接。
我就想问问:

1. 为什么连接不上服务器,参考以前的帖子,难道是因为我Windows上的IP,跟Simulator上的ip不一致,可是我用127.0.0.1也试了呀,也不行(用Windows下cmd命令倒是可以ping通本地IP);
2. 难道VxWorks中编的VIP中还有哪些configuration没有设置到,导致连接不上?(目前我加入了ftp client组件和DHCP组件);
3. 如果connect能够成功,那我利用simulator的ftp能够与Windows上的serv-U ftp服务器交换数据吗?

由于我是VwWorks新手,还请高手们不吝赐教,我贴出tcp连接部分的代码,大家帮忙看看吧

#include "VxWorks.h"
#include "stdio.h"
#include "errnoLib.h"
#include "ftpLib.h"
#include "ioLib.h"
#define HOST "169.254.128.31"   //本机的IP,不一定是Simulator的IP
                                //问题在这里?????

#define USER "sa"
#define PWD "sa"
#define DIR "D:/SYS"
#define RD_CMD "RETR %s"
#define FILE "1.txt"
#include <inetLib.h>
#include <socket.h>
#include <inetLib.h>
#include <remLib.h>



typedef struct sockaddr_in SOCKADDR_IN;

int ftpTest()
{
    FAST int ctrlSock;
    FAST int inetAddr;
    UINT32 retryCount = 0;
    int a = 0;
    SOCKADDR_IN ctrlAddr;
    struct linger optVal;
    int ctrlOptval;

    if (((inetAddr = (int) inet_addr (HOST)) == ERROR))
        {
        return (ERROR);
        }

     ctrlSock = socket (AF_INET, SOCK_STREAM, 0);
    if (ctrlSock < 0)
        {
         return (ERROR);
        }

    optVal.l_onoff = 1;
    optVal.l_linger = 0;

    if (setsockopt (ctrlSock, SOL_SOCKET, SO_LINGER, (char*)&optVal, 
            sizeof (optVal)) == ERROR)  
        {
        close (ctrlSock);
        return (ERROR);
        }
    ctrlOptval = 1;

    if (setsockopt (ctrlSock, SOL_SOCKET, SO_KEEPALIVE, (char*)&ctrlOptval,
            sizeof (ctrlOptval)) == ERROR)
{
 close(ctrlSock);
return (ERROR);
}

     ctrlAddr.sin_family      = AF_INET;
    ctrlAddr.sin_addr.s_addr = INADDR_ANY;
    ctrlAddr.sin_port        = htons (0);


    ctrlAddr.sin_len    = sizeof (struct sockaddr_in);

    if (bind (ctrlSock, (struct sockaddr *)&ctrlAddr, sizeof (ctrlAddr)) < 0)
        {
        close (ctrlSock);
        return (ERROR);
        }
    ctrlAddr.sin_addr.s_addr = inetAddr;
    ctrlAddr.sin_port        = htons (21);

    for (;;)
        {
        //就在这句出现问题,connect始终无法成功
        if (connect (ctrlSock, (struct sockaddr *)&ctrlAddr, sizeof (ctrlAddr)) < 0)
            { 
            switch (errno)
                {
                case EHOSTUNREACH:    //进入这个分支
                a = 1;
                case ENETUNREACH:
                a = 2;
                case ENETDOWN:
                    /* could be due to DHCP negotiation not complete, retry */
                    if (retryCount++ < 5)
                        {
                        a = 3;
                         continue;
                        }
                   default:

                    close (ctrlSock);
                    return (ERROR);
                }
            }

            break;
        }

/*上面的代码基本从ftpHookup中摘出的,已终止,注释这段ftpXfer
if (ERROR == ftpXfer(HOST, USER, PWD, "", RD_CMD, DIR,
FILE, &ctrlSock, &dataSock))
{
printf("\n failed");


return ;
}
*/
}

[解决办法]
贴我的代码,你参考吧!
流程如下:
1. 设置本地网卡IP
2. Bind Socket
3. 连接服务端, 注意:客户端和服务端要在同一个网段内!
4. 可使用命令行cmd中: netstat -an ,查看网络连接状态!



#define   LOWPC_IP2      "192.168.1.88"
BOOL    g_bConnectServerOK = FALSE;   /*是否连接成功,TRUE表示成功,FALSE表示失败*/
/************************************************************************/
/* Function : 初始化SBS's PC104 单网卡
/* Input    : 无
/* RetValue : 无
/* Author   : qcj_21 at 2008-07-21 9:33
/************************************************************************/
void Set_82559CardIP()
{
//初始化网卡,设置子网掩码,设置IP
if(0 != ipAttach(1, "fei"))
{
printf("fei1 attach failed");
return;
}
// if(0 != ifMaskSet("fei1", 0xffffff00))
// {
// printf("fei1 ifMaskSet failed \n ");
// return;
// }
if(0 != ifAddrSet("fei1", LOWPC_IP2))
{
printf("fei1 ip address set failed \n ");
return;
}
    
printf("Set Intel 82559 Card OK, The IP is: LOWPC_IP2 \n");
}



/*****************************************************************/
/* Function : Open SCPI Socket Connection. The opne socket connection
/*            is using the default port number 5025.
/* Input    : 无
/* RetValue : 成功返回TRUE,失败返回FALSE
/* Author   : qcj_21 at 2008-07-24 18:06
/****************************************************************/
BOOL BindSocket()
{
int  nPortNO      = 5025;
int  nRet         = 0;
int  nBuffSize    = 52224;        /*定义发送与接收缓冲区的大小*/
int  nOn          = 1; 
struct sockaddr_in ServerAddr;    /*服务器地址信息即N6705A的网络接口*/
struct sockaddr_in SBS_SockAddr;  /*盛博PC104网卡的地址 */


/* 创建SOCKET */
g_SCPISocket = socket(AF_INET, SOCK_STREAM, 0);
if (ERROR == g_SCPISocket)
{
LogFile("Error: g_SCPISocket error:%s\n",(int)strerror(errno), 0, 0, 0, 0, 0);
return FALSE;
}

//qcj_21 at 2008-08-05 15:24:48, 将网卡2的地址与LOWPC_IP2 绑定
bzero((char *)&SBS_SockAddr, sizeof(SBS_SockAddr));
SBS_SockAddr.sin_family      = AF_INET;

//将htonl(inet_addr())中的htonl()函数去掉!!! Mod by qcj-21 at 2008-08-06 10:16
//注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用 函数htonl()。
SBS_SockAddr.sin_addr.s_addr = inet_addr(LOWPC_IP2);
SBS_SockAddr.sin_port        = htons(rand()%100+6666);  //端口为大于6666-6766之间端口

if (ERROR == bind(g_SCPISocket, (struct sockaddr *)&SBS_SockAddr, sizeof(SBS_SockAddr)) )
{
LogFile("Error: BindSocket() bind() errorno = %d\n", (int)strerror(errno), 0, 0, 0, 0, 0);


close(g_SCPISocket);
return FALSE;
}
else
{
LogFile("BindSocket(), bind() OK !!!!!!!!!!!!!!!!!!!!!\n");
}

// Adjust the recv and send buffer size of the socket
// Ignore errors because the op sys might not support what we ask for
setsockopt(g_SCPISocket, SOL_SOCKET, SO_SNDBUF, (char *)&nBuffSize, sizeof(int));
setsockopt(g_SCPISocket, SOL_SOCKET, SO_RCVBUF, (char *)&nBuffSize, sizeof(int));

// Turn on TCP No Delay option
setsockopt(g_SCPISocket, IPPROTO_TCP, 1, (char *)&nOn, sizeof(nOn));

}




SOCKET   g_SCPISocket = 0;       //初始化Socket,用于连接仪器
const char const *g_pszServerIP = "192.168.1.119";
POWERSET g_PowerSet[4];             //电源输出属性设置

BOOL  g_bConnectAgiIsOk = FALSE;   //连接Agilent电源,TRUE表示连接成功,FLASE表示连接失败

/*****************************************************************/
/* Function : 连接服务端-安捷伦电源
/* Input    : 无
/* RetValue : 成功返回TRUE,失败返回FALSE
/* Author   : qcj_21 at 2008-08-19 09:55:12
/****************************************************************/
BOOL Connect_119Server()
{
int  nPortNO      = 5025;         /*服务器端口号*/
int  nRet         = 0;
struct sockaddr_in ServerAddr;    /*服务器地址信息即N6705A的网络接口*/
struct sockaddr_in SBS_SockAddr;  /*盛博PC104网卡的地址 */

//Add by qcj_21 at 2008-08-26, 加上这个代码,可以多次进行27V/7A上电与掉电
 if(0 != SocketWrite(g_SCPISocket, "*RST\r\n"))
 {
 LogFile("Connect_119Server(), Test Write OK ......... \n");
 return TRUE;
 }

memset(&ServerAddr, 0, sizeof(SOCKADDR));
ServerAddr.sin_family      = AF_INET;
//htonl(), thons()将主机字节序转换为TCP/IP网络字节序.
ServerAddr.sin_addr.s_addr = inet_addr(g_pszServerIP);
ServerAddr.sin_port        = htons(nPortNO);                

/* 连接服务端即连接安捷伦N6705A直流电源分析仪 */
nRet = connect(g_SCPISocket, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) ); 
if(0 == nRet)
{
LogFile("Connect_119Server(), Connect Server OK !!!!!!!!!!!!!1\n");
AddState(TYPE_CMD_TESTORDER_STEP, STATE_OK, "连接 安捷伦电源N6705A 成功!");

//Add by qcj_21 at 2009-10-22 11:36, 连接成功后,对设备进行复位
SocketWrite(g_SCPISocket, "*RST\r\n");
 
return TRUE;
}
else
{
LogFile("Connect_119Server(), Connect Server Error, Error NO = %d \n", nRet);
AddState(TYPE_CMD_TESTORDER_STEP, STATE_ERR, "连接 安捷伦电源N6705A 失败!");
AddState(TYPE_CMD_TESTORDER_STEP, STATE_ERR, "请重启下位机系统与安捷伦电源!!!");
return FALSE;
}

}

[解决办法]


不就是ftp传输文件么?那你添加上ftp组建不就行了,怎么还要修改代码?

热点排行