我要发帖 回复

新手上路

6

主题

2

积分

0

专家分

:

私信
发表时间 : 2011-10-28 16:41:31 | 浏览 : 1731    评论 : 12
不知道那个创建socket和接收数据的过程应该放在哪个位置,我是放在了帧循环里,不知道对不,请大家帮忙看看啦,感谢!!我的数据结构
#mission
x,y
#mission
中间就是传递过来的一系列数据。
int main( int argc, char**argv )

{
    vp::initialize( argc, argv );
   vpMarineOcean::setUpdateSemantic(

                              vpMarineOcean::UPDATE_SEMANTICS_ASYNCHRONOUS );
    myApp *pMyApp = new myApp;
    pMyApp->define( (argc == 1) ?"vpmarine_simple.acf" : argv[1] );
    pMyApp->configure();
   
     WORD wVersionRequested;
     WSADATA wsaData;
     interr;
     wVersionRequested = MAKEWORD( 1,1 );
     err = WSAStartup(wVersionRequested, &wsaData );
     if( err != 0 ) {
         return0;
     }
     if( LOBYTE( wsaData.wVersion ) != 1 ||
         HIBYTE( wsaData.wVersion )!= 1 ) {
              WSACleanup( );
              return 0;
     }
    pMyApp->run();
    pMyApp->unconfigure();
    pMyApp->unref();
    vp::shutdown();
    return0;
}
void myApp::run()
{
    while( beginFrame() > 0 )
    {
         SOCKETsockSrv=socket(AF_INET,SOCK_DGRAM,0);
         SOCKADDR_IN addrSrv;
         addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
         addrSrv.sin_family=AF_INET;
         addrSrv.sin_port=htons(6000);
         bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
         SOCKADDR_IN addrClient;
         intlen=sizeof(SOCKADDR);
         charrecvBuf[100];
         recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
         chardata[100];
         Cstring temp (recvBuf);
         inti=0,j=0,index=0;   
         floata=0;
         intnum=temp.getlength();
         while(num!=0)
         {
              index=temp.findoneof('\n,');
              sscanf(temp.mid(0,index),"%lf",&a);
              data[j]=a;
              j++;
            num=temp.delete(0,index+1);
         }
         if(data[0]=='#mission')
         {
              for(i=1;i<100;i++)
              {
                   if(data=='#mission')break;
                   x=data;
                   y=data[i+1];
                   i++;
                   if ( m_bPositionShip )
                          positionShip();
              }
         }
         closesocket(sockSrv);
         WSACleanup();
        endFrame();
    }
}

最近VR访客

qingyuximo 评论于2011-10-28 17:07:16
补充一下,这个运行有问题,说是Cstring类没有定义,有一系列的错误,按照网上的方法试了些但依然不好使,有知道应该怎么设置的吗,我用的visual studio 2005,呵呵。
99daodan 评论于2011-10-29 17:01:25
建议楼主先学习基于单视图的vc与vp结合方法,再学习socket编程,最后把两者结合起来,这样便于调试和最终形成程序。
obuil 评论于2011-10-29 22:09:55
本版块中 置顶帖 有个 websamples  下载,里面有个socket 结合vp的例子,楼主可以看一下
UE4   |   虚幻引擎   |   Unity VR    |    Hololens
qingyuximo 评论于2011-10-30 00:46:17 来自手机
obuil 发表于 2011-10-29 10:09 PM  本版块中 置顶帖 有个 websamples 下载,里面有个socket 结合vp的例子,楼主可以看一下 ...

嗯,谢老大哈,想跟老大Q上聊可以不,哈哈……
qingyuximo 评论于2011-10-30 00:48:19 来自手机
99daodan 发表于 2011-10-29 05:01 PM  建议楼主先学习基于单视图的vc与vp结合方法,再学习socket编程,最后把两者结合起来,这样便于调试和最终形 ...

可以再具体点不,嘿嘿……那我这样就是不行的喽……
cneter 评论于2011-10-30 13:01:41
使用vp自带的vuSocket很好用的
cneter 评论于2011-10-30 13:05:21
socket的创建不要放在帧循环里,接收可以放在帧循环里,但最好的方法是开启独立的数据循环交换线程,帧循环线程每次需要数据直接可以从数据线程获取最新数据,这样能保证更好的效率
qingyuximo 评论于2011-10-30 13:54:26 来自手机
cneter 发表于 2011-10-30 01:01 PM  使用vp自带的vuSocket很好用的

嗯……没用过这个,可以研究下,呵呵……
qingyuximo 评论于2011-10-30 13:57:45 来自手机
cneter 发表于 2011-10-30 01:05 PM  socket的创建不要放在帧循环里,接收可以放在帧循环里,但最好的方法是开启独立的数据循环交换线程,帧循环 ...

那创建什么的,还是要放main函数里喽……唉,线程这个东东仅限于了解点,也完全没用到过呃……
cneter 评论于2011-11-2 18:04:09
在myApp中建立自己的私有变量vuSocketUDP* s;
然后在configure中对其初始化:
//设置udp为非阻塞
s->setBlocking(false);
//指定接收端口与ip(本地任意),非广播
s->init(port, INADDR_ANY, false);
s->setRemoteHost("192.168.1.100",12345);
//端口可复用
s->setReuseAddr(true);
然后在帧循环中去s->read
注意,udp读取数据时要每次读空为止,否则会数据延迟,所以比较理想的方法是数据交换线程独立帧循环线程之外
qingyuximo 评论于2011-11-2 21:26:49
cneter 发表于 2011-11-2 06:04 PM
在myApp中建立自己的私有变量vuSocketUDP* s;
然后在configure中对其初始化:
//设置udp为非阻塞

很好很详细呢,我会结合自带的例子在研究看看。。。那要是直接用vc6.0里那些方法,也就是我写的那种,可以吗?O(∩_∩)O~
cneter 评论于2011-11-3 21:36:47
vuSocketUDP/vuSocketTCP都是继承vuSocket的,你查看vuSocket其实就是对winsocket的封装,你也可以对winsoket进行类似封装

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2022-11-30 08:41 AM

返回顶部