Fortran Coder

查看: 5176|回复: 3
打印 上一主题 下一主题

[绘图界面库] socket的连接过程

[复制链接]

2

帖子

0

主题

0

精华

新人

F 币
33 元
贡献
10 点
跳转到指定楼层
楼主
发表于 2020-2-27 22:11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问,buffer的定义是character,能是其他类型吗?我改了之后会提示形参与虚参类型不匹配在recv(connection,clientservermessage%buffer, 15,0)里。
而且楼主的这个例子,矩阵A,B是怎么传递给server方的呢?不太懂union map的用法,只看到说map中一块使用时,另一块就不被使用了。
能麻烦大神吗解答吗?谢谢~
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
沙发
发表于 2020-2-27 22:53:13 | 只看该作者
jesuis 发表于 2020-2-27 22:11
请问,buffer的定义是character,能是其他类型吗?我改了之后会提示形参与虚参类型不匹配在recv(connection ...
[Fortran] 纯文本查看 复制代码
type T_client_server_message
                union
                     map
                        character*(500) buffer

                     end map
                     map
                        real A(2,2)
                        real B(2,2)
                        real C(2,2)
                        integer i
                     end map
                end union
         end type

在你的程序里,请使用 A B C 这些内容,他们按顺序,可以是任意内容。
传递给 recv 的时候,使用 buffer。(必须是 character)
A B  C 和 buffer 是等效的,他们占用相同的内存地址,任何一方变化,另一方也变化
愿对你有帮助。

2

帖子

0

主题

0

精华

新人

F 币
33 元
贡献
10 点
板凳
 楼主| 发表于 2020-2-28 14:49:38 | 只看该作者
kyra 发表于 2020-2-27 22:53
[Fortran] 纯文本查看 复制代码
type T_client_server_message
                union
                     ma ...[/quote]

你好,感谢你的解答,我这样修改了之后,好像我把A=abcd的值send后,server端只能接收到A一个,即a同样,我用来接收server段的数据的C也是没有的。请问这还有什么问题呢,也许我没有完全明白。
[mw_shl_code=fortran,true]module socketconnect
  contains


  subroutine rpccall(A,C)
      use KERNEL32
      use WS2_32
         
         
         implicit none
         character::A
         character::C
         
         integer WINSOCK_V2_2                        !版本
         
         integer success
         parameter(WINSOCK_V2_2=X'202',success=0)
         type(T_WSADATA) wsaInfo                     !版本信息结构

         integer receivelen        
         integer sendlen   
         
         type T_SOCKADDR_UNION
         sequence
             union
                  map
                      type(T_SOCKADDR_IN) sockAddrIn
                  end map
                  map
                      type(T_SOCKADDR) sockAddr
                  end map
             end union
         end type

         type(T_SOCKADDR_UNION) connectionInfo  !Client_add
                           

         type T_client_server_message
             sequence  
             union
                 MAP
                     character*4 A
                     character*4 C
                     ENDMAP
                     map
                        character*4 buffer
                        
                     end map
                   
                     
                end union
         end type

         type(T_client_server_message) ClientServerMessage   

         integer sender       !socket_send
         character*(15) host
         integer*2 port
         integer r
         integer status


         ! Initialize Winsock v2.
         status=WSAStartup(WINSOCK_V2_2,wsaInfo)
         if(status.NE.success)then
            write(*,*)'WSAStartup-',status
            stop
         end if

         ! 创建套接字
         sender=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)   
         if(sender.EQ.INVALID_SOCKET) then
             write(*,*)'socket-',INVALID_SOCKET

             status=WSACleanup()
         end if

         ! 设置连接地址
         host='127.0.0.1'
         port=5000

         connectionInfo%sockAddrIn%sin_family=AF_INET
         connectionInfo%sockAddrIn%sin_port=htons(port)
         connectionInfo%sockAddrIn%sin_addr%s_addr =inet_addr(host(1:LEN_TRIM(host)))

         status=connect(sender,%ref(connectionInfo%sockAddr),SIZEOF(connectionInfo%sockAddr))
         if(status.EQ.SOCKET_ERROR)then
            write(*,*)'连接失败'
         end if

         
         !进行聊天
         do while(.true.)
                  


                        !发送数据
                          write(*,*)"please enter message:"
                           read(*,*)A
                        
                          clientServerMessage%A=A
                                              
                          sendlen=send(sender,clientServerMessage%BUFFER,sizeof(clientservermessage%a),0)
                        
                          if(sendlen<0)then
                            write(*,*)"发送失败"
                          end if
                          !接收数据
                          receivelen=recv(sender,clientServerMessage%buffer,sizeof(clientservermessage%buffer),0)
                          if(receivelen<0)then
                            write(*,*)"接受失败,程序退出"
                            stop
                          else
                            write(*,*)"server say:"
                            C=clientServerMessage%C
                        print*, C   
                          end if

                     end do
              

            
             status =closesocket(sender)
             status =WSACleanup()

             pause

        stop

end subroutine




end module socketconnect


program client
use socketconnect


 character:: aarray2
 character:: aarray1



call rpccall(aarray1,aarray2)        
      
end
  。

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
地板
发表于 2020-2-28 16:49:30 | 只看该作者
把你的帖子编辑一下吧,好乱。
文字也描述不清楚
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-23 09:49

Powered by Tencent X3.4

© 2013-2024 Tencent

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