linux – 套接字编程gfortran

我希望能够在我的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,protocol
      END FUNCTION
    END INTERFACE

    sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
    WRTIE(*,*)"Socket returned: ",sock

END PROGRAM

当我运行程序时,套接函数返回-1失败.我真的不知道发生了什么.我没有在命令行上添加任何库,所以我猜它正在正确链接默认库.我编译使用

gfortran -o MAIN_PROGRAM MAIN_PROGRAM.f90 -fno-underscoring

解决方法

您可以使用Fortran 2003中引入的ISO_C_Binding来访问C库功能,这是您拥有的最干净,最便携的选项.与任何其他供应商手册一样,Gfortran documentation有一些细节.还有一些项目旨在为Fortran 90: fortranposixposix90实现POSIX接口.但正如我所说,使用F2003功能的正确C-Binding接口可能是最干净的选项,另请参阅 fortranwiki.

编辑:
以下是添加了ISO-C-Binding胶水的代码(使用gfortran 4.4.5测试):

program testsocket
  use,intrinsic ::  iso_c_binding

  implicit none

  interface
    function socket(domain,protocol) bind(c,name="socket")
      use,intrinsic :: iso_c_binding
      integer(kind=c_int) :: socket
      integer(kind=c_int),value :: domain,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

相关文章

文件查找(find) 1 find 简单的说,就是实时查找指定的内容或条件。特点:最新、最快、最准确。 用法:...
非交互式添加分区 方法一 添加/deb/sdb 下的分区,其实位置为1到1000M,第二个分区位置为1001至3000M,...
编译安装httpd 1 去官网下载源码包 为避免非法软件,一定要去官网下载http://www.apache.org httpd-2.4...
gdisk用法 gdisk - InteractiveGUIDpartitiontable (GPT) manipulator GPTfdisk (akagdisk) isatext-mo...
1 一定用快捷键 这里简单的说下几个常用的快捷按键。 1.1 移动光标快捷键 Crtl + a 光标回到命令行...
bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立...