RosettaCodeData/Task/Distributed-programming/FreeBASIC/distributed-programming-1.b...

74 lines
1.7 KiB
Plaintext

#include "win/winsock2.bi"
Const PORT = 12345
Sub initialize_winsock()
Dim wsadata As WSADATA
If WSAStartup(&h0202, @wsadata) <> 0 Then
Print "WSAStartup failed"
End 1
End If
End Sub
Sub cleanup_winsock()
WSACleanup()
End Sub
Sub handle_client(client_socket As SOCKET)
Dim buffer As zstring * 1024
Dim bytes_received As Integer
Do
bytes_received = recv(client_socket, @buffer, Sizeof(buffer), 0)
If bytes_received <= 0 Then Exit Do
Print "Received: "; buffer
send(client_socket, @buffer, bytes_received, 0)
Loop
closesocket(client_socket)
End Sub
initialize_winsock()
Dim server_socket As SOCKET
server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
If server_socket = INVALID_SOCKET Then
Print "Socket creation failed"
cleanup_winsock()
End 1
End If
Dim server_addr As sockaddr_in
server_addr.sin_family = AF_INET
server_addr.sin_port = htons(PORT)
server_addr.sin_addr.S_addr = INADDR_ANY
If bind(server_socket, Cast(sockaddr Ptr, @server_addr), Sizeof(server_addr)) = SOCKET_ERROR Then
Print "Bind failed"
closesocket(server_socket)
cleanup_winsock()
End 1
End If
If listen(server_socket, SOMAXCONN) = SOCKET_ERROR Then
Print "Listen failed"
closesocket(server_socket)
cleanup_winsock()
End 1
End If
Print "Server listening on port "; PORT
Do
Dim client_socket As SOCKET
client_socket = accept(server_socket, NULL, NULL)
If client_socket = INVALID_SOCKET Then
Print "Accept failed"
closesocket(server_socket)
cleanup_winsock()
End 1
End If
handle_client(client_socket)
Loop
closesocket(server_socket)
cleanup_winsock()