5 # include <arpa/inet.h>
6 # include <sys/types.h>
7 # include <sys/socket.h>
13 #if defined(CSA_LAN) || defined(DEKUNOBOU) || defined(MNJ_LAN)
15 str_WSAError( const char *str )
18 snprintf( str_message, SIZE_MESSAGE, "%s:%d", str, WSAGetLastError() );
19 str_message[SIZE_MESSAGE-1] = '\0';
30 client_next_game( tree_t * restrict ptree, const char *str_addr, int iport )
34 const char *str_name1, *str_name2;
35 char buf1[SIZE_PLAYERNAME], buf2[SIZE_PLAYERNAME];
39 str_buffer_cmdline[0] = '\0';
40 sckt_csa = sckt_connect( str_addr, iport );
41 if ( sckt_csa == SCKT_NULL ) { return -2; }
43 str_name1 = str_name2 = NULL;
44 iret = sckt_out( sckt_csa, "LOGIN %s %s\n",
45 client_str_id, client_str_pwd );
46 if ( iret < 0 ) { return iret; }
48 Out( "wait for next game-conditions...\n" );
53 iret = next_cmdline( 1 );
54 if ( iret < 0 ) { return iret; }
55 else if ( game_status & flag_quit ) { return 1; }
57 if ( ! strcmp( str_cmdline, "END Game_Summary" ) ) { break; }
58 else if ( ! strcmp( str_cmdline, "Your_Turn:-" ) ) { my_turn = white; }
59 else if ( ! memcmp( str_cmdline, "Name+:", 6 ) )
61 strncpy( buf1, str_cmdline+6, SIZE_PLAYERNAME-1 );
62 buf1[SIZE_PLAYERNAME-1] = '\0';
65 else if ( ! memcmp( str_cmdline, "Name-:", 6 ) )
67 strncpy( buf2, str_cmdline+6, SIZE_PLAYERNAME-1 );
68 buf2[SIZE_PLAYERNAME-1] = '\0';
73 iret = sckt_out( sckt_csa, "AGREE\n" );
74 if ( iret < 0 ) { return -2; }
76 iret = next_cmdline( 1 );
77 if ( iret < 0 ) { return iret; }
78 else if ( game_status & flag_quit ) { return 1; }
80 if ( ! memcmp( str_cmdline, "REJECT:", 7 ) )
85 else if ( ! memcmp( str_cmdline, "START:", 6 ) ) { break; }
87 str_error = str_server_err;
91 if ( ini_game( ptree, &min_posi_no_handicap, flag_history,
92 str_name1, str_name2 ) < 0 )
97 if ( get_elapsed( &time_turn_start ) < 0 ) { return -1; }
99 client_turn = my_turn;
102 Out( "Game Conditions (%dth):\n", client_ngame );
103 Out( " my turn:%c\n", ach_turn[my_turn] );
105 if ( my_turn == root_turn )
107 iret = com_turn_start( ptree, 0 );
108 if ( iret < 0 ) { return iret; }
116 #if defined(CSA_LAN) || defined(MNJ_LAN)
118 sckt_connect( const char *str_addr, int iport )
121 struct sockaddr_in sin;
128 if ( WSAStartup( MAKEWORD(1,1), &wsaData ) )
130 str_error = str_WSAError( "WSAStartup() failed." );
136 ul_addr = inet_addr( str_addr );
137 if ( ul_addr == INADDR_NONE )
139 phe = gethostbyname( str_addr );
142 str_error = str_WSAError( "gethostbyname() faild." );
148 ul_addr = *( (u_long *)phe->h_addr_list[0] );
151 sd = socket( AF_INET, SOCK_STREAM, 0 );
152 if ( sd == SCKT_NULL )
154 str_error = str_WSAError( "socket() faild." );
161 sin.sin_family = AF_INET;
162 sin.sin_addr.s_addr = ul_addr;
163 sin.sin_port = htons( (u_short)iport );
164 if ( connect( sd, (struct sockaddr *)&sin, sizeof(sin) ) == SOCKET_ERROR )
166 str_error = str_WSAError( "connect() faild." );
178 sckt_shutdown( sckt_t sd )
182 if ( sd == SCKT_NULL ) { return 1; }
183 Out( "shut down connection\n" );
186 if ( shutdown( sd, SD_SEND ) == SOCKET_ERROR )
188 str_error = str_WSAError( "shutdown() faild." );
194 iret = recv( sd, str_message, SIZE_MESSAGE, 0 );
195 if ( iret == SOCKET_ERROR )
197 str_error = str_WSAError( "recv() failed." );
201 else if ( ! iret ) { break; }
204 if ( closesocket( sd ) == SOCKET_ERROR )
206 str_error = str_WSAError( "closesocket() failed." );
211 if ( WSACleanup() == SOCKET_ERROR )
213 str_error = str_WSAError( "WSACleanup() faild." );
220 if ( shutdown( sd, SHUT_RD ) == -1 )
222 str_error = "shutdown() faild.";
227 iret = (int)recv( sd, str_message, SIZE_MESSAGE, 0 );
230 str_error = "recv() failed.";
233 else if ( ! iret ) { break; }
236 if ( close( sd ) == -1 )
238 str_error = "close() failed.";
248 sckt_check( sckt_t sd )
254 tv.tv_sec = tv.tv_usec = 0;
257 # if defined(_MSC_VER)
258 # pragma warning(disable:4127)
260 FD_SET( sd, &readfds );
261 # if defined(_MSC_VER)
262 # pragma warning(default:4127)
265 iret = select( (int)sd+1, &readfds, NULL, NULL, &tv );
266 if ( iret == SOCKET_ERROR )
268 str_error = str_WSAError( "select() with a socket connected failed." );
277 sckt_in( sckt_t sd, char *str, int n )
284 Out( "wait for a message ... " );
286 tv.tv_sec = SEC_KEEP_ALIVE;
289 # if defined(_MSC_VER)
290 # pragma warning(disable:4127)
292 FD_SET( sd, &readfds );
293 # if defined(_MSC_VER)
294 # pragma warning(default:4127)
297 iret = select( (int)sd+1, &readfds, NULL, NULL, &tv );
298 if ( iret == SOCKET_ERROR )
300 str_error = str_WSAError( "select() with a socket connected failed." );
308 Out( "time out.\n" );
310 if ( sckt_out( sd, "\n" ) == SOCKET_ERROR )
312 str_error = str_WSAError( "send() failed." );
317 iret = recv( sd, str, n-1, 0 );
318 if ( iret == SOCKET_ERROR )
320 str_error = str_WSAError( "recv() failed." );
323 *( str + iret ) = '\0';
327 Out( "Connection closed.\n" );
331 Out( "%s[END]\n", str );
338 sckt_out( sckt_t sd, const char *fmt, ... )
344 va_start( arg, fmt );
345 nch = vsnprintf( buf, 256, fmt, arg );
347 if ( nch >= 256 || nch < 0 )
349 str_error = "buffer overflow at sckt_out()";
353 Out( "- now sending the message: %s", buf );
355 if ( send( sd, buf, nch, 0 ) == SOCKET_ERROR )
357 str_error = str_WSAError( "send() failed." );
361 return get_elapsed( &time_last_send );
363 #endif /* CSA_LAN || MNJ_LAN */