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