5484|8

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

菜鸟请教VxWorks下socket通信问题 [复制链接]

 有一块ARM7下的目标板,VxWorks操作系统移植完毕。想用PC机和目标板用socket通信,有相应的程序tcpserver、tcpclinet。请问应该怎么样操作?或者推荐点资料,谢啦

最新回复

low
可以看看帮助里de例子,当然你要是想了解网络tcp通信的原理,你就要看看更多的书了,我最近在用UDP里的东西,唉。  详情 回复 发表于 2008-1-30 20:37
点赞 关注
 

回复
举报

83

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我也想知道
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
是一样的,其实vxworks有现成的socket通信代码,你只要改一下就行 ,很简单的!
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

4
 
Vxworks的socket编程接口和Windows的基本是一样的
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
参照编程手册,很详细的,不过我用的UDP,不难
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
有与Windows通信的原代码!这是服务器端的,TCP 方式
#include "VxWorks.h"
#include "taskLib.h"
#include "sockLib.h"
#include "inetLib.h"
#include "ioLib.h"
#include "logLib.h"
#include "string.h"
#include "stdio.h"
#include "netinet\\tcp.h"
#include "vxSvr.h"



int listenSkt;
int commuSkt;
int flagNetInit=NET_INIT_NULL;
STATUS netInit();
STATUS netRecv();
STATUS netSend(char *pBuff);
void netCloseAll();



STATUS netInit()
{
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
int sockAddrSize;
int i;
char optval=1;

if(flagNetInit==NET_INIT_COMMUSKT)
{
   logMsg("netinit:server has a already been initialized\n",0,0,0,0,0,0);
   return(OK);
}
else if(flagNetInit==NET_INIT_NULL)
{
   if((listenSkt=socket(AF_INET,SOCK_STREAM,0))==ERROR)
   {
       logMsg("netinit:can not open listen socket\n",0,0,0,0,0,0);
       return(ERROR);
   }
   
    sockAddrSize=sizeof(struct sockaddr_in);
    bzero((char*)&serverAddr,sockAddrSize);
    serverAddr.sin_family=AF_INET;
    serverAddr.sin_len=(u_char)sockAddrSize;
    serverAddr.sin_port=htons(LOCAL_SERVER_PORT);
    serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);

    if(bind(listenSkt,(struct sockaddr*) &serverAddr,sockAddrSize)==ERROR)
    {
        logMsg("netinit:unable to bind to port %d\n",LOCAL_SERVER_PORT,0,0,0,0,0);
        close(listenSkt);
        return(ERROR);
     }
     
     /*else*/
     logMsg("netinit:successfully bind to prot\n",LOCAL_SERVER_PORT,0,0,0,0,0);

     if(listen(listenSkt,1)==ERROR)
     {
        logMsg("netInit:can not listen to listen tolisten socker\n",0,0,0,0,0,0);
        close(listenSkt);
        return(ERROR);
     }
     else
     {
       flagNetInit=NET_INIT_LISTENSKT;
      }

}


commuSkt=accept(listenSkt,(struct sockaddr*)(&clientAddr),&sockAddrSize);


   if(commuSkt==ERROR)
     {
      logMsg("netinit:can not accept command socker\n",0,0,0,0,0,0);
      close(listenSkt);
      return(ERROR);
     }
    else
    {
     logMsg("netInit:net Init finished\n",0,0,0,0,0,0);
     setsockopt(commuSkt,IPPROTO_TCP,TCP_NODELAY,&optval,sizeof(optval));
          if(taskNameToId(TNAME_RECV)==ERROR)
            {
              taskSpawn(TNAME_RECV,TPRI_CMDRECV,0,USER_STACK_SIZE,(FUNCPTR)netRecv,0,0,0,0,0,0,0,0,0,0);
             }
     
     }
     flagNetInit=NET_INIT_COMMUSKT;
     return(OK);
}
STATUS netSend(char *pBuff)
{
int buffLen;
if((pBuff!=NULL)&&(flagNetInit==NET_INIT_COMMUSKT))
{
    buffLen=strlen(pBuff);
    if(buffLen>=NET_MSG_MAX_SIZE)
       {
         
             buffLen=NET_MSG_MAX_SIZE;
             pBuff[buffLen-1]=0;
       }
      if(send(commuSkt,pBuff,buffLen,0)==ERROR)
       {
              logMsg("netsend:error in sending buff to client\n",0,0,0,0,0,0);
              netCloseAll();
              return(ERROR);
        }
           return(OK);
}
else
{
    if(flagNetInit==NET_INIT_NULL)
      logMsg("netsend:server has not been initialized\n",0,0,0,0,0,0);
    else if (flagNetInit==NET_INIT_LISTENSKT)
           {
            logMsg("netSend:no connection created yet\n",0,0,0,0,0,0);
            logMsg("netSend:please connect to vxworks server with pc programm\n",0,0,0,0,0,0);
           }
          else
           {
            logMsg("netSend:you message is invalid\n",0,0,0,0,0,0);
           }
           return(ERROR);
}

}



STATUS netRecv()
{
   char pBuff[NET_MSG_MAX_SIZE+1];
   int  recvLen;
   while(flagNetInit==NET_INIT_COMMUSKT)
     {
         recvLen=recv(commuSkt,pBuff,NET_MSG_MAX_SIZE,0);
         if((recvLen!=ERROR)&&(recvLen!=0))
             {
                pBuff[recvLen]=0;
                logMsg("netRecv:received message from client:\n%s\n",(int)pBuff,0,0,0,0,0);
              }
          else
            {
              netCloseAll();
              return(ERROR);
             }
      }
   logMsg("netRecv:net connection is shut down,quit\n",0,0,0,0,0,0);
   return(OK);
}


void netCloseAll()
{  
  int taskId;
   taskId=taskNameToId(TNAME_RECV);
   if((taskId!=taskIdSelf()&&taskId!=ERROR))
      {
          taskDelete(taskId);
       }
    if(flagNetInit==NET_INIT_COMMUSKT)
      {
       close(commuSkt);
       close(listenSkt);
      }
    else if (flagNetInit==NET_INIT_LISTENSKT)
      {
       close(listenSkt);
      }
     flagNetInit=NET_INIT_NULL;
    logMsg("netCloseAll:net connection shut down\n",0,0,0,0,0,0);
}
以上是调试通过的
另外VX下支持一种ZBUF方式,速度很快,可以试试,我也有代码!
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
找个问题我刚刚做过,首先你是一台PC机,一台目标机,PC机是WINDOWS,目标机是VXWORKS,两端的socket有一些不一样,但是大致想同,VXWORKS下的socket很多书上有例子,主要说下WINDOWS下的不同之处。

首先,windows下要先将一个库包含进去,忘记是什么库了,上网可以搜到
然后,要初始化一下,后边的大致和vxworks差不多了。

具体你可以看下好像最新的MSDN里有个例子,具体你可以查阅一下。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
网络编程 不论Windows 还是linux 还是Vxworks 都是源自BSD 4.4 , 随便找本Socket 编程的书,就够了,有那么复杂么
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 
可以看看帮助里de例子,当然你要是想了解网络tcp通信的原理,你就要看看更多的书了,我最近在用UDP里的东西,唉。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表