21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
24 #include <arpa/inet.h>
29 #include <sys/ioctl.h>
31 #include <sys/filio.h>
35 #define WSAGetLastError() (errno)
43 static bool Connecting =
false;
44 static bool Connected =
false;
47 static sockaddr_in FS2NetD_addr;
53 shutdown(mySocket, 2);
64 struct hostent *my_host = NULL;
73 int rc = WSAStartup(MAKEWORD(2,0), &wsa);
76 ml_printf(
"FS2NetD ERROR: Failed to start WinSock!");
81 memset(&FS2NetD_addr, 0,
sizeof(sockaddr_in));
82 FS2NetD_addr.sin_family = AF_INET;
83 FS2NetD_addr.sin_addr.s_addr = INADDR_ANY;
84 FS2NetD_addr.sin_port = 0;
86 mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
91 ml_printf(
"FS2NetD ERROR: Couldn't get socket (\"%s\")!", strerror(my_error));
93 ml_printf(
"FS2NetD ERROR: Couldn't get socket!");
98 if ( bind(mySocket, (sockaddr *)&FS2NetD_addr,
sizeof(sockaddr)) ==
SOCKET_ERROR ) {
101 ml_printf(
"FS2NetD ERROR: Couldn't bind socket (\"%s\")!", strerror(my_error));
103 ml_printf(
"FS2NetD ERROR: Couldn't bind socket!");
120 if ( !isdigit(host_str[0]) ) {
121 my_host = gethostbyname( host );
123 if (my_host == NULL) {
126 ml_printf(
"Failure from gethostbyname() for host '%s'", host);
128 }
else if (my_host->h_addrtype != AF_INET) {
129 ml_printf(
"Invalid address type returned by gethostbyname()!");
131 }
else if (my_host->h_addr_list[0] == NULL) {
132 ml_printf(
"Unable to determine IP from host name '%s'", host);
136 FS2NetD_addr.sin_addr.s_addr = ((in_addr *)(my_host->h_addr_list[0]))->s_addr;
140 FS2NetD_addr.sin_addr.s_addr = inet_addr( host );
143 if (FS2NetD_addr.sin_addr.s_addr == INADDR_ANY) {
144 ml_printf(
"No valid server address to connect with!");
149 long m_port = strtol(port, (
char**)NULL, 10);
150 FS2NetD_addr.sin_port = htons( (
ushort)m_port );
153 if ( connect(mySocket, (sockaddr *)&FS2NetD_addr,
sizeof(sockaddr)) ==
SOCKET_ERROR ) {
160 ml_printf(
"FS2NetD ERROR: Couldn't connect to remote system at %s (\"%s\")!", inet_ntoa(FS2NetD_addr.sin_addr), strerror(errv));
162 ml_printf(
"FS2NetD ERROR: Couldn't connect to remote system at %s!", inet_ntoa(FS2NetD_addr.sin_addr));
183 fd_set write_fds, error_fds;
190 FD_SET(mySocket, &write_fds);
193 if ( select(mySocket+1, NULL, &write_fds, NULL, &timeout) > 0 ) {
196 size_t err_val_size =
sizeof(err_val);
197 getsockopt(mySocket, SOL_SOCKET, SO_ERROR, (
char*)&err_val, (
socklen_t*)&err_val_size);
213 FD_SET(mySocket, &error_fds);
216 if ( select(mySocket+1, NULL, NULL, &error_fds, &timeout) )
229 memset(buffer, 0, blen);
233 return recvfrom(mySocket, buffer, blen, flags, (sockaddr*)&FS2NetD_addr, &from_len);
242 return sendto(mySocket, buffer, blen, flags, (sockaddr*)&FS2NetD_addr, to_len);
254 FD_SET(mySocket, &recvs);
257 int status = select(1, &recvs, NULL, NULL, &wait);
259 int status = select(mySocket+1, &recvs, NULL, NULL, &wait);
262 return ( (status != 0) && (status != -1) && FD_ISSET(mySocket, &recvs) );
int FS2NetD_SendData(char *buffer, int blen)
void FS2NetD_Disconnect()
int FS2NetD_ConnectToServer(const char *host, const char *port)
#define WSAGetLastError()
int FS2NetD_GetData(char *buffer, int blen)
void ml_printf(const char *format,...)
GLbitfield GLuint64 timeout
#define ioctlsocket(x, y, z)