8 dek_start( const char *str_addr, int port_dek, int port_bnz )
14 /* initialize winsock */
15 if ( WSAStartup( MAKEWORD(1,1), &wsaData ) )
17 str_error = "WSAStartup() failed.";
21 dek_ul_addr = inet_addr( str_addr );
22 if ( dek_ul_addr == INADDR_NONE )
24 struct hostent *phe = gethostbyname( str_addr );
27 str_error = str_WSAError( "gethostbyname() faild." );
30 dek_ul_addr = *( (u_long *)phe->h_addr_list[0] );
33 dek_ns = htons( (u_short)port_dek );
34 dek_ns_bnz = htons( (u_short)port_bnz );
36 dek_socket_in = socket( AF_INET, SOCK_STREAM, 0 );
37 if ( dek_socket_in == INVALID_SOCKET )
39 str_error = str_WSAError( "socket() failed." );
43 service.sin_family = AF_INET;
44 service.sin_addr.s_addr = dek_ul_addr;
45 service.sin_port = dek_ns_bnz;
46 if ( bind( dek_socket_in, (SOCKADDR *)&service, sizeof(service) )
49 str_error = "bind() failed.";
53 if ( listen( dek_socket_in, 1 ) == SOCKET_ERROR )
55 str_error = "listen() failed.";
59 dek_s_accept = (SOCKET)SOCKET_ERROR;
66 dek_next_game( tree_t * restrict ptree )
68 if ( dek_ngame != 1 && dek_turn )
70 Out( "take a nap ..." );
75 if ( ini_game( ptree, &min_posi_no_handicap, flag_history, NULL, NULL ) < 0
76 || get_elapsed( &time_turn_start ) < 0
77 || ( dek_turn && com_turn_start( ptree, 0 ) < 0 ) ) { return -1; }
94 tv.tv_sec = tv.tv_usec = 0;
96 if ( dek_s_accept == SOCKET_ERROR )
100 # pragma warning(disable:4127)
102 FD_SET( dek_socket_in, &readfds );
103 #if defined(_MSC_VER)
104 # pragma warning(default:4127)
106 iret = select( 1, &readfds, NULL, NULL, &tv );
107 if ( iret == SOCKET_ERROR )
109 snprintf( str_message, SIZE_MESSAGE,
110 "select() with a socket listening failed:%d",
112 str_error = str_message;
116 if ( ! iret ) { return 0; } /* no connection is pending. */
118 dek_s_accept = accept( dek_socket_in, NULL, NULL );
119 if ( dek_s_accept == SOCKET_ERROR )
121 snprintf( str_message, SIZE_MESSAGE,
122 "accept() following select() failed:%d",
124 str_error = str_message;
130 #if defined(_MSC_VER)
131 # pragma warning(disable:4127)
133 FD_SET( dek_s_accept, &readfds );
134 #if defined(_MSC_VER)
135 # pragma warning(default:4127)
138 iret = select( 0, &readfds, NULL, NULL, &tv );
139 if ( iret == SOCKET_ERROR )
141 snprintf( str_message, SIZE_MESSAGE,
142 "select() with a socket accepted failed:%d",
144 str_error = str_message;
147 if ( ! iret ) { return 0; } /* the connection isn't closed,
148 nor has available data. */
150 iret = recv( dek_s_accept, &ch, 1, MSG_PEEK );
151 if ( iret == SOCKET_ERROR )
153 closesocket( dek_s_accept );
154 dek_s_accept = (SOCKET)SOCKET_ERROR;
155 snprintf( str_message, SIZE_MESSAGE,
156 "recv() with flag MSG_PEEK failed:%d",
158 str_error = str_message;
163 if ( closesocket( dek_s_accept ) )
165 dek_s_accept = (SOCKET)SOCKET_ERROR;
166 snprintf( str_message, SIZE_MESSAGE,
167 "closesocket() failed:%d", WSAGetLastError() );
168 str_error = str_message;
171 dek_s_accept = (SOCKET)SOCKET_ERROR;
172 return 0; /* the connection has been closed. */
175 return 1; /* data is available for reading. */
180 dek_in( char *str, int n )
182 #if defined(_MSC_VER)
183 # pragma warning(disable:4127)
188 if ( dek_s_accept == SOCKET_ERROR )
190 Out( "\nwait for new connection...\n" );
191 dek_s_accept = accept( dek_socket_in, NULL, NULL );
192 if ( dek_s_accept == SOCKET_ERROR )
194 str_error = str_WSAError( "accept() failed." );
199 count_byte = recv( dek_s_accept, str, n, 0 );
200 if ( count_byte == SOCKET_ERROR )
202 closesocket( dek_s_accept );
203 dek_s_accept = (SOCKET)SOCKET_ERROR;
204 str_error = str_WSAError( "recv() failed." );
207 if ( count_byte ) { break; }
209 if ( closesocket( dek_s_accept ) )
211 dek_s_accept = (SOCKET)SOCKET_ERROR;
212 str_error = str_WSAError( "closesocket() failed." );
215 dek_s_accept = (SOCKET)SOCKET_ERROR;
218 *( str + count_byte ) = '\0';
219 Out( "recieved %s", str );
222 #if defined(_MSC_VER)
223 # pragma warning(default:4127)
229 dek_out( const char *format, ... )
237 va_start( arg, format );
238 nch = vsnprintf( buf, 256, format, arg );
241 Out( "send %s", buf );
243 socket_out = socket( AF_INET, SOCK_STREAM, 0 );
244 if ( socket_out == INVALID_SOCKET )
246 snprintf( str_message, SIZE_MESSAGE,
247 "socket() failed:%d", WSAGetLastError() );
248 str_error = str_message;
252 service.sin_family = AF_INET;
253 service.sin_addr.s_addr = dek_ul_addr;
254 service.sin_port = dek_ns;
255 if ( connect( socket_out, (SOCKADDR *)&service, sizeof(service) )
258 snprintf( str_message, SIZE_MESSAGE,
259 "connect() failed:%d", WSAGetLastError() );
260 str_error = str_message;
264 iret = send( socket_out, buf, nch, 0 );
265 if ( iret == SOCKET_ERROR )
267 closesocket( socket_out );
268 snprintf( str_message, SIZE_MESSAGE,
269 "send() failed:%d", WSAGetLastError() );
270 str_error = str_message;
275 closesocket( socket_out );
276 str_error = "send() wrote partial number of bytes.";
280 if ( closesocket( socket_out ) )
282 snprintf( str_message, SIZE_MESSAGE,
283 "closesocket() failed:%d", WSAGetLastError() );
284 str_error = str_message;
292 dek_parse( char *str, int len )
294 if ( *str == '+' || *str == '-' )
296 memmove( str, str+1, 6 );
299 else if ( ! strcmp( str, str_resign ) )
301 strncpy( str, "resign", len-1 );
304 Out( "Bonanza won against Dekunobou\n" );
307 str_error = "unknown command is recieved from Deknobou.";
314 # endif /* DEKUNOBOU */