首先你要知道,语言本身并没有,也不会有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] syntaxhighlighter_viewsource syntaxhighlighter_copycode 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 
 
 |