Ubuntu下Fortran网络编程操作指南
首先确保系统已安装gfortran(Fortran编译器),它是编译Fortran代码的核心工具。通过以下命令安装:
sudo apt update
sudo apt install gfortran
若需实现高级网络功能(如HTTP请求、加密通信),推荐安装libcurl(支持HTTP/HTTPS/FTP等协议)和OpenSSL(加密通信):
sudo apt install libcurl4-openssl-dev libssl-dev
这些库提供了Fortran通过ISO C Binding调用的C接口。
Fortran本身无原生网络库,需通过以下两种方式实现:
以下代码创建一个TCP服务器,监听12345端口并接收客户端消息:
program tcp_server
use iso_c_binding, only: c_int, c_char, c_void_ptr, c_size_t
implicit none
integer(c_int) :: server_sock, client_sock, addr_len
character(len=1024) :: buffer
type(c_ptr) :: sockaddr_in_ptr
! 创建socket(AF_INET: IPv4, SOCK_STREAM: TCP)
server_sock = socket(AF_INET, SOCK_STREAM, 0)
if (server_sock < 0) then
print *, "Failed to create socket"
stop
end if
! 绑定socket到本地地址(INADDR_ANY: 所有接口, 12345端口)
! 注意:此处需补充sockaddr_in结构体的C绑定代码(略,需定义结构体并填充)
! call bind(server_sock, sockaddr_in_ptr, sizeof(sockaddr_in))
! 监听连接(最多5个客户端排队)
call listen(server_sock, 5)
print *, "Server listening on port 12345..."
! 接受客户端连接
addr_len = sizeof(sockaddr_in)
client_sock = accept(server_sock, sockaddr_in_ptr, addr_len)
if (client_sock < 0) then
print *, "Failed to accept connection"
stop
end if
! 接收数据(最多1024字节)
buffer = repeat(' ', 1024)
call recv(client_sock, buffer, len(buffer, c_size_t), 0)
print *, "Received: ", trim(buffer)
! 关闭连接
call close(client_sock)
call close(server_sock)
end program tcp_server
注:上述代码中sockaddr_in结构体的C绑定需自行定义(参考C语言的<netinet/in.h>),此处省略以保持简洁。
以下代码发送HTTP GET请求到example.com并输出响应:
program http_get_example
use iso_c_binding, only: c_ptr, c_char, c_int, c_null_char
implicit none
type(c_ptr) :: curl
integer(c_int) :: res
character(len=:), allocatable :: url
! 初始化libcurl
curl = curl_easy_init()
if (.not. c_associated(curl)) then
print *, "Failed to initialize curl"
stop
end if
! 设置URL(需替换为目标地址)
url = "http://example.com"
call curl_easy_setopt(curl, CURLOPT_URL, trim(url)//c_null_char)
! 跟随重定向(可选)
call curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1_c_int)
! 执行请求
res = curl_easy_perform(curl)
if (res /= 0) then
print *, "Request failed: ", res
else
print *, "Request succeeded"
end if
! 清理资源
call curl_easy_cleanup(curl)
end program http_get_example
此代码通过libcurl的curl_easy_init、curl_easy_setopt、curl_easy_perform函数完成HTTP请求,无需处理底层socket。
若代码中使用了C网络函数(如socket、bind),需链接libc库(默认已链接):
gfortran -o tcp_server tcp_server.f90
需链接libcurl库(-lcurl):
gfortran -o http_get_example http_get_example.f90 -lcurl
# 运行TCP服务器
./tcp_server
# 运行HTTP GET客户端(在另一个终端)
./http_get_example
访问http://localhost:12345(若有客户端连接)或查看终端输出的HTTP响应。
socket、connect、curl_easy_perform的返回值),避免程序崩溃。close)和清理libcurl资源(curl_easy_cleanup),防止内存泄漏。sudo ufw allow 12345/tcp