Fortran Coder

查看: 14285|回复: 14
打印 上一主题 下一主题

[绘图界面库] fortran语言实现socket通信/winsock

[复制链接]

12

帖子

2

主题

0

精华

入门

F 币
78 元
贡献
29 点
跳转到指定楼层
楼主
发表于 2015-7-27 20:38:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
fortran语言实现tcpip功能,用socket选项实现实现数据交换。比如在同一台电脑中同时使用fortran语言编写的程序和c++语言编写的程序,实现两个程序之间的数据交换。c语言中有socket选项,fortran语言如何实现呢?
分享到:  微信微信
收藏收藏 点赞点赞1 点踩点踩

12

帖子

2

主题

0

精华

入门

F 币
78 元
贡献
29 点
15#
 楼主| 发表于 2015-8-14 09:15:05 | 只看该作者
fcode 发表于 2015-8-13 17:18
winsock 的发送接收,有 TCP 和 UPD 两种。
其中 UDP 是没有反馈信息的,发送方只管发送,不知道接收方是否 ...

嗯那,我用的就是tcp
只是同样的代码,如果我先发送,再接收,不成功
如果把发送代码复制在前,接收,然后再发送,却是成功了。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

14#
发表于 2015-8-13 17:18:42 | 只看该作者
winsock 的发送接收,有 TCP 和 UPD 两种。
其中 UDP 是没有反馈信息的,发送方只管发送,不知道接收方是否接收到。
而这又分为阻塞和非阻塞两种。
如果你使用的是非阻塞方式,那可能需要循环一段时间,来判断是否接收到。
即:
发送方发送后,循环等待回应。
接收方循环接收,直到收到,发送回应。

如果你需要一边发送,一边接收(而且两者还有关联)。那么 TCP 其实更适合你。

12

帖子

2

主题

0

精华

入门

F 币
78 元
贡献
29 点
13#
 楼主| 发表于 2015-8-13 17:07:03 | 只看该作者
楚香饭 发表于 2015-8-11 12:58
我觉得最好不要用字符串发送。都是数据,用二进制多好。
干嘛要转换成字符串,然后接收以后再转换回来呢? ...

代码如下:
        ! 接收数据
      ireceivelen=recv(isender,ClientServerMessage%buffer,500,0)
         if(ireceivelen<0)then
          write(*,*)"连接失败"
          stop
         else
             dpred=ClientServerMessage%buffer
             write(*,*)"sever say:"
             write(*,*) dpred
             write(*,*) ClientServerMessage%buffer
         end if
      
      
      ! 发送数据
      write(*,*)"please enter message:"
      ClientServerMessage%bufferout=rfoutput
      isendlen=send(isender,ClientServerMessage%bufferout,500,0)
      write(*,*) ClientServerMessage%bufferout
      if(isendlen<0)then
          write(*,*)"连接失败"
      end if为什么先发送数据,后接收不好使?先发送那面收不到
如果改为先接收(后面不变),再发送,再接收却又好使,那面也能收到。

12

帖子

2

主题

0

精华

入门

F 币
78 元
贡献
29 点
12#
 楼主| 发表于 2015-8-11 19:49:56 | 只看该作者
楚香饭 发表于 2015-8-11 12:58
我觉得最好不要用字符串发送。都是数据,用二进制多好。
干嘛要转换成字符串,然后接收以后再转换回来呢? ...

嗯哪  谢谢
对二进制不太了解,我先用字符串做做。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

11#
发表于 2015-8-11 12:58:38 | 只看该作者
我觉得最好不要用字符串发送。都是数据,用二进制多好。
干嘛要转换成字符串,然后接收以后再转换回来呢?多此一举不是。

对于后面有二进制的数据,你可以直接用 fortran read 。
也可以控制 matlab,发送完字符串以后,接着发送一系列的 \0 或空格。都可以

12

帖子

2

主题

0

精华

入门

F 币
78 元
贡献
29 点
10#
 楼主| 发表于 2015-8-11 09:03:18 | 只看该作者
vvt 发表于 2015-8-11 08:24
我不知道你的发送方是什么,代码是怎么样的。
从表现来看,后面的不是文本内容,是二进制内容。 ...

发送方是matlab,代码如下:
fwrite(Tcpsever,num2str(dpredout'));
其中dpredout是一个1*4向量,转化为字符串发送。
按理来说后面的应该是空格才对,却不知为何乱码了。然后我想读取空格前面的那些数据,然后存到一个向量里面。这该怎么做?

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
9#
发表于 2015-8-11 08:24:59 | 只看该作者
我不知道你的发送方是什么,代码是怎么样的。
从表现来看,后面的不是文本内容,是二进制内容。

12

帖子

2

主题

0

精华

入门

F 币
78 元
贡献
29 点
8#
 楼主| 发表于 2015-8-10 16:11:27 | 只看该作者
楚香饭 发表于 2015-8-10 15:33
你定义的 character*(500) bufferout 就是字符串啊,所以当然就是字符串了。
fortran 直接操作字符串会在后 ...

恩恩,您的这个有点高级,看不太懂。
我的Log文件里面的文本是这样的:


sever say:
0.00012393  0.00012393  0.00012393  0.00012393
@    牫=    l薰     8?   
  葕    膴    ?=     :=    `:=     薰     `?     >=    @==         
   ?       @       @?    €?    `?    @p3                              
    ?       ?6     ?    8&     ?                                   劺4
            ?6                  ?              `B+           €?    来?
      拇?     `?    却?     €B    ?     q〩            ?              ?
                     ?   


我只是需要前面的四个数,然后后面的从matlab输过来时时空格,不知为啥就乱码了。我只想提取前面的数据组成一个实型的向量,这个该怎么解决一下?

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

7#
发表于 2015-8-10 15:33:50 | 只看该作者
你定义的 character*(500) bufferout 就是字符串啊,所以当然就是字符串了。
fortran 直接操作字符串会在后面自动加空格。

我的习惯是用 Equivalence 方便处理:
[Fortran] 纯文本查看 复制代码
Type T_DAQ
    SEQUENCE
    character(len=3) :: cFlagStart !// 一般会有帧头,但不是必须的
    !// 此处是你的各数据,用 type 会更方便多种不同数据放在一起
    character(len=3) :: cFlagEnd !// 一般会有帧尾,但不是必须的
  End Type T_DAQ

type(T_DAQ) , private :: stDAQ !// 这是你真正的数据
character(len=80) , private :: C_DAQ !// 这是为了方便书写
Equivalence( C_DAQ , stDAQ ) !// 让 C_DAQ 和 stDAQ 公用一个内存地址!这样,当你传输时,使用 C_DAQ,而使用时,使用 stDAQ


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

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-7 12:37

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表