socket的连接过程
请问,buffer的定义是character,能是其他类型吗?我改了之后会提示形参与虚参类型不匹配在recv(connection,clientservermessage%buffer, 15,0)里。而且楼主的这个例子,矩阵A,B是怎么传递给server方的呢?不太懂union map的用法,只看到说map中一块使用时,另一块就不被使用了。
能麻烦大神吗解答吗?谢谢~ jesuis 发表于 2020-2-27 22:11
请问,buffer的定义是character,能是其他类型吗?我改了之后会提示形参与虚参类型不匹配在recv(connection ...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 BC 和 buffer 是等效的,他们占用相同的内存地址,任何一方变化,另一方也变化
愿对你有帮助。
kyra 发表于 2020-2-27 22:53
type T_client_server_message
union
ma ...
你好,感谢你的解答,我这样修改了之后,好像我把A=abcd的值send后,server端只能接收到A一个,即a同样,我用来接收server段的数据的C也是没有的。请问这还有什么问题呢,也许我没有完全明白。
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。 把你的帖子编辑一下吧,好乱。
文字也描述不清楚
页:
[1]