首先你要知道,语言本身并没有,也不会有socket通讯功能。
其实C语言本身也不规定如何使用 socket,它只规定逻辑关系和数学计算的写法。
具体到各平台下的实现,是编译器和第三方库的事情。
换过来说,socket 是一个网络通讯规范,本身也不规定如何使用。像 winsock 一类的库才是它的实现,类似的还有 Java 的 Jsocket 接口等等。注意 winsock 不等于 socket。
理解了这两个问题,才能回到你的问题上。如果你是在 windows 上 intel fortran 通过 winsock 来实现的话,那么可以 Use ws2_32 来使用 windows 标准的 ws2_32 的 API 库实现。
如果你是在其他平台(Linux),使用其他编译器,通过其他 socket 的接口(如LSocket,ServerSocket等)实现,那么用法会不一样。这一点请你深刻理解!
以下是我曾经写过的一个 UDP 协议的封装。仅供参考,具体细节请翻阅 winsock 文档!
注意它有使用局限性:
1.仅限windows,使用 winsocket接口
2.仅限Intel fortran
3.仅限 UDP 协议,TCP/IP协议请照猫画虎。
[Fortran] 纯文本查看 复制代码 Module SocketMod
Use ws2_32 , ID_Cancel => IDCancel
Use kernel32 , only : sleep
Implicit None
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 t_sockaddr_union
Integer , parameter , private :: winsock_v2_2 = x'202' , success = 0 !版本
contains
Integer Function Socket_UDP_Conn( host , port )
Character(len=15) host
Integer(kind=2) port
type (t_wsadata) WSAInfo !版本信息结构
!integer receivelen , iSendLen , ic
type (t_sockaddr_union) ConnectionInfo !Client_add
Integer hSocket , status , i
Socket_UDP_Conn = 0
status = WSAStartup(winsock_v2_2, WSAInfo)
If (status/=success) return
! 创建套接字
hSocket = Socket( af_inet , SOCK_DGRAM , ipproto_udp )
If (hSocket==invalid_socket) goto 999
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(hSocket, %ref(ConnectionInfo%sockaddr), sizeof(ConnectionInfo%sockaddr))
If (status==socket_error) return
i = 1
status = ioctlsocket( hSocket , FIONBIO , loc(1) )
Socket_UDP_Conn = hSocket
return
999 status = WSACleanup()
End Function Socket_UDP_Conn
Integer Function Socket_UDP_Disconn( hSocket )
integer :: hSocket
Socket_UDP_Disconn = CloseSocket( hSocket )
Socket_UDP_Disconn = WSACleanup()
End Function Socket_UDP_Disconn
Integer Function Socket_UDP_Send( hSocket , c , len_c )
Character(len=*) :: c
Integer :: len_c
Integer hSocket , iSendLen
Socket_UDP_Send = 0
iSendLen = Send( hSocket , c , len_c , 0 )
If ( iSendLen < 0 ) return
Socket_UDP_Send = 1
End Function Socket_UDP_Send
Integer Function Socket_UDP_Recv( hSocket , c , len_c , timeout )
Character(len=*) :: c
Integer :: len_c , timeout
Integer :: hSocket , receivelen , i
Socket_UDP_Recv = 0
c = char(0)
do i = 1 , timeout
receivelen = Recv( hSocket , c , len_c , 0 )
If ( receivelen == len_c ) goto 999
call sleep(10)
end do
return
999 Socket_UDP_Recv = 1
End Function Socket_UDP_Recv
End Module SocketMod
|