hw1*_*w12 7 sockets linux networking fortran fortran-iso-c-binding
我希望能够在我的Fortran应用程序中调用网络功能.我的老板要我在Fortran中做所有事情,而不是使用C和Fortran.我们已经在Windows上使用PGI的Fortran编译器完成了该应用程序的一个版本.我们正在将它转移到Linux,我们可能会使用它们的编译器.现在,我正在使用gfortran.
我为这些网络调用创建了一个接口,所有内容都编译和链接.下面的代码类似于我正在做的事情,除了接口和常量在模块中.
PROGRAM MAIN
INTEGER,PARAMETER ::AF_INET = 2
INTEGER,PARAMETER ::SOCK_STREAM = 1
INTEGER,PARAMETER ::IPPROTO_TCP = 6
INTERFACE
FUNCTION socket(domain,type,protocol)
INTEGER ::socket,domain,type,protocol
END FUNCTION
END INTERFACE
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
WRTIE(*,*)"Socket returned: ",sock
END PROGRAM
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,套接字函数返回-1失败.我真的不知道发生了什么.我没有在命令行上添加任何库,所以我猜它正在正确链接默认库.我编译使用
gfortran -o MAIN_PROGRAM MAIN_PROGRAM.f90 -fno-underscoring
Run Code Online (Sandbox Code Playgroud)
har*_*dkl 10
您可以使用Fortran 2003中引入的ISO_C_Binding来访问C库功能,这是您拥有的最干净,最便携的选项.与任何其他供应商手册一样,Gfortran文档中有一些详细信息.还有一些项目旨在实现Fortran 90的POSIX接口:fortranposix和posix90.但正如我所说,使用F2003功能的正确C-Binding接口可能是最干净的选择,另请参阅fortranwiki.
编辑: 这是你添加了ISO-C-Binding胶水的代码(用gfortran 4.4.5测试):
program testsocket
use, intrinsic :: iso_c_binding
implicit none
interface
function socket(domain, type, protocol) bind(c, name="socket")
use, intrinsic :: iso_c_binding
integer(kind=c_int) :: socket
integer(kind=c_int), value :: domain, type, protocol
end function socket
end interface
integer :: sock
sock = socket(2_c_int, 1_c_int, 6_c_int)
write(*,*) "Socket returned: ", sock
end program testsocket
Run Code Online (Sandbox Code Playgroud)