|
首先你要知道,语言本身并没有,也不会有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] 纯文本查看 复制代码 02 | Use ws 2 _ 32 , ID_Cancel = > IDCancel |
03 | Use kernel 32 , only : sleep |
09 | Type ( t_sockaddr_in ) sockaddrin |
12 | Type ( t_sockaddr ) sockaddr |
15 | End Type t_sockaddr_union |
16 | Integer , parameter , private :: winsock_v 2 _ 2 = x '202' , success = 0 |
19 | Integer Function Socket_UDP_Conn ( host , port ) |
20 | Character ( len = 15 ) host |
22 | type ( t_wsadata ) WSAInfo |
24 | type ( t_sockaddr_union ) ConnectionInfo |
25 | Integer hSocket , status , i |
27 | status = WSAStartup ( winsock_v 2 _ 2 , WSAInfo ) |
28 | If ( status /= success ) return |
30 | hSocket = Socket ( af_inet , SOCK_DGRAM , ipproto_udp ) |
31 | If ( hSocket == invalid_socket ) goto 999 |
32 | ConnectionInfo.sockaddrin.sin_family = af_inet |
33 | ConnectionInfo.sockaddrin.sin_port = htons ( port ) |
34 | ConnectionInfo.sockaddrin.sin_addr % s_addr = inet_addr ( host ( 1 : len_trim ( host ) ) ) |
35 | status = Connect ( hSocket , % ref ( ConnectionInfo % sockaddr ) , sizeof ( ConnectionInfo % sockaddr ) ) |
36 | If ( status == socket_error ) return |
38 | status = ioctlsocket ( hSocket , FIONBIO , loc ( 1 ) ) |
39 | Socket_UDP_Conn = hSocket |
41 | 999 status = WSACleanup ( ) |
42 | End Function Socket_UDP_Conn |
44 | Integer Function Socket_UDP_Disconn ( hSocket ) |
46 | Socket_UDP_Disconn = CloseSocket ( hSocket ) |
47 | Socket_UDP_Disconn = WSACleanup ( ) |
48 | End Function Socket_UDP_Disconn |
50 | Integer Function Socket_UDP_Send ( hSocket , c , len_c ) |
53 | Integer hSocket , iSendLen |
55 | iSendLen = Send ( hSocket , c , len_c , 0 ) |
56 | If ( iSendLen < 0 ) return |
58 | End Function Socket_UDP_Send |
60 | Integer Function Socket_UDP_Recv ( hSocket , c , len_c , timeout ) |
62 | Integer :: len_c , timeout |
63 | Integer :: hSocket , receivelen , i |
67 | receivelen = Recv ( hSocket , c , len_c , 0 ) |
68 | If ( receivelen == len_c ) goto 999 |
72 | 999 Socket_UDP_Recv = 1 |
73 | End Function Socket_UDP_Recv |
|
|