PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/jni/dek.c

https://github.com/yasushi-saito/AndroidShogi
C | 314 lines | 268 code | 44 blank | 2 comment | 56 complexity | 548bb6453cf7eb846138a7642b4b7de7 MD5 | raw file
  1. #include <string.h>
  2. #include <stdarg.h>
  3. #include "shogi.h"
  4. #if defined(DEKUNOBOU)
  5. int
  6. dek_start( const char *str_addr, int port_dek, int port_bnz )
  7. {
  8. SOCKADDR_IN service;
  9. WSADATA wsaData;
  10. u_short dek_ns_bnz;
  11. /* initialize winsock */
  12. if ( WSAStartup( MAKEWORD(1,1), &wsaData ) )
  13. {
  14. str_error = "WSAStartup() failed.";
  15. return -2;
  16. }
  17. dek_ul_addr = inet_addr( str_addr );
  18. if ( dek_ul_addr == INADDR_NONE )
  19. {
  20. struct hostent *phe = gethostbyname( str_addr );
  21. if ( ! phe )
  22. {
  23. str_error = str_WSAError( "gethostbyname() faild." );
  24. return -2;
  25. }
  26. dek_ul_addr = *( (u_long *)phe->h_addr_list[0] );
  27. }
  28. dek_ns = htons( (u_short)port_dek );
  29. dek_ns_bnz = htons( (u_short)port_bnz );
  30. dek_socket_in = socket( AF_INET, SOCK_STREAM, 0 );
  31. if ( dek_socket_in == INVALID_SOCKET )
  32. {
  33. str_error = str_WSAError( "socket() failed." );
  34. return -2;
  35. }
  36. service.sin_family = AF_INET;
  37. service.sin_addr.s_addr = dek_ul_addr;
  38. service.sin_port = dek_ns_bnz;
  39. if ( bind( dek_socket_in, (SOCKADDR *)&service, sizeof(service) )
  40. == SOCKET_ERROR )
  41. {
  42. str_error = "bind() failed.";
  43. return -2;
  44. }
  45. if ( listen( dek_socket_in, 1 ) == SOCKET_ERROR )
  46. {
  47. str_error = "listen() failed.";
  48. return -2;
  49. }
  50. dek_s_accept = (SOCKET)SOCKET_ERROR;
  51. return 1;
  52. }
  53. int
  54. dek_next_game( tree_t * restrict ptree )
  55. {
  56. if ( dek_ngame != 1 && dek_turn )
  57. {
  58. Out( "take a nap ..." );
  59. Sleep( 37000 );
  60. Out( " done\n" );
  61. }
  62. if ( ini_game( ptree, &min_posi_no_handicap, flag_history, NULL, NULL ) < 0
  63. || get_elapsed( &time_turn_start ) < 0
  64. || ( dek_turn && com_turn_start( ptree, 0 ) < 0 ) ) { return -1; }
  65. dek_turn ^= 1;
  66. dek_ngame += 1;
  67. return 1;
  68. }
  69. int
  70. dek_check( void )
  71. {
  72. struct timeval tv;
  73. fd_set readfds;
  74. int iret;
  75. char ch;
  76. tv.tv_sec = tv.tv_usec = 0;
  77. if ( dek_s_accept == SOCKET_ERROR )
  78. {
  79. FD_ZERO( &readfds );
  80. #if defined(_MSC_VER)
  81. # pragma warning(disable:4127)
  82. #endif
  83. FD_SET( dek_socket_in, &readfds );
  84. #if defined(_MSC_VER)
  85. # pragma warning(default:4127)
  86. #endif
  87. iret = select( 1, &readfds, NULL, NULL, &tv );
  88. if ( iret == SOCKET_ERROR )
  89. {
  90. snprintf( str_message, SIZE_MESSAGE,
  91. "select() with a socket listening failed:%d",
  92. WSAGetLastError() );
  93. str_error = str_message;
  94. return -1;
  95. }
  96. if ( ! iret ) { return 0; } /* no connection is pending. */
  97. dek_s_accept = accept( dek_socket_in, NULL, NULL );
  98. if ( dek_s_accept == SOCKET_ERROR )
  99. {
  100. snprintf( str_message, SIZE_MESSAGE,
  101. "accept() following select() failed:%d",
  102. WSAGetLastError() );
  103. str_error = str_message;
  104. return -1;
  105. }
  106. }
  107. FD_ZERO( &readfds );
  108. #if defined(_MSC_VER)
  109. # pragma warning(disable:4127)
  110. #endif
  111. FD_SET( dek_s_accept, &readfds );
  112. #if defined(_MSC_VER)
  113. # pragma warning(default:4127)
  114. #endif
  115. iret = select( 0, &readfds, NULL, NULL, &tv );
  116. if ( iret == SOCKET_ERROR )
  117. {
  118. snprintf( str_message, SIZE_MESSAGE,
  119. "select() with a socket accepted failed:%d",
  120. WSAGetLastError() );
  121. str_error = str_message;
  122. return -1;
  123. }
  124. if ( ! iret ) { return 0; } /* the connection isn't closed,
  125. nor has available data. */
  126. iret = recv( dek_s_accept, &ch, 1, MSG_PEEK );
  127. if ( iret == SOCKET_ERROR )
  128. {
  129. closesocket( dek_s_accept );
  130. dek_s_accept = (SOCKET)SOCKET_ERROR;
  131. snprintf( str_message, SIZE_MESSAGE,
  132. "recv() with flag MSG_PEEK failed:%d",
  133. WSAGetLastError() );
  134. str_error = str_message;
  135. return -1;
  136. }
  137. if ( ! iret )
  138. {
  139. if ( closesocket( dek_s_accept ) )
  140. {
  141. dek_s_accept = (SOCKET)SOCKET_ERROR;
  142. snprintf( str_message, SIZE_MESSAGE,
  143. "closesocket() failed:%d", WSAGetLastError() );
  144. str_error = str_message;
  145. return -1;
  146. }
  147. dek_s_accept = (SOCKET)SOCKET_ERROR;
  148. return 0; /* the connection has been closed. */
  149. }
  150. return 1; /* data is available for reading. */
  151. }
  152. int
  153. dek_in( char *str, int n )
  154. {
  155. #if defined(_MSC_VER)
  156. # pragma warning(disable:4127)
  157. #endif
  158. int count_byte;
  159. for (;;) {
  160. if ( dek_s_accept == SOCKET_ERROR )
  161. {
  162. Out( "\nwait for new connection...\n" );
  163. dek_s_accept = accept( dek_socket_in, NULL, NULL );
  164. if ( dek_s_accept == SOCKET_ERROR )
  165. {
  166. str_error = str_WSAError( "accept() failed." );
  167. return -1;
  168. }
  169. }
  170. count_byte = recv( dek_s_accept, str, n, 0 );
  171. if ( count_byte == SOCKET_ERROR )
  172. {
  173. closesocket( dek_s_accept );
  174. dek_s_accept = (SOCKET)SOCKET_ERROR;
  175. str_error = str_WSAError( "recv() failed." );
  176. return -1;
  177. }
  178. if ( count_byte ) { break; }
  179. if ( closesocket( dek_s_accept ) )
  180. {
  181. dek_s_accept = (SOCKET)SOCKET_ERROR;
  182. str_error = str_WSAError( "closesocket() failed." );
  183. return -1;
  184. }
  185. dek_s_accept = (SOCKET)SOCKET_ERROR;
  186. }
  187. *( str + count_byte ) = '\0';
  188. Out( "recieved %s", str );
  189. return count_byte;
  190. #if defined(_MSC_VER)
  191. # pragma warning(default:4127)
  192. #endif
  193. }
  194. int
  195. dek_out( const char *format, ... )
  196. {
  197. SOCKADDR_IN service;
  198. SOCKET socket_out;
  199. int nch, iret;
  200. char buf[256];
  201. va_list arg;
  202. va_start( arg, format );
  203. nch = vsnprintf( buf, 256, format, arg );
  204. va_end( arg );
  205. Out( "send %s", buf );
  206. socket_out = socket( AF_INET, SOCK_STREAM, 0 );
  207. if ( socket_out == INVALID_SOCKET )
  208. {
  209. snprintf( str_message, SIZE_MESSAGE,
  210. "socket() failed:%d", WSAGetLastError() );
  211. str_error = str_message;
  212. return -2;
  213. }
  214. service.sin_family = AF_INET;
  215. service.sin_addr.s_addr = dek_ul_addr;
  216. service.sin_port = dek_ns;
  217. if ( connect( socket_out, (SOCKADDR *)&service, sizeof(service) )
  218. == SOCKET_ERROR )
  219. {
  220. snprintf( str_message, SIZE_MESSAGE,
  221. "connect() failed:%d", WSAGetLastError() );
  222. str_error = str_message;
  223. return -2;
  224. }
  225. iret = send( socket_out, buf, nch, 0 );
  226. if ( iret == SOCKET_ERROR )
  227. {
  228. closesocket( socket_out );
  229. snprintf( str_message, SIZE_MESSAGE,
  230. "send() failed:%d", WSAGetLastError() );
  231. str_error = str_message;
  232. return -2;
  233. }
  234. if ( iret != nch )
  235. {
  236. closesocket( socket_out );
  237. str_error = "send() wrote partial number of bytes.";
  238. return -2;
  239. }
  240. if ( closesocket( socket_out ) )
  241. {
  242. snprintf( str_message, SIZE_MESSAGE,
  243. "closesocket() failed:%d", WSAGetLastError() );
  244. str_error = str_message;
  245. return -2;
  246. }
  247. return 1;
  248. }
  249. int
  250. dek_parse( char *str, int len )
  251. {
  252. if ( *str == '+' || *str == '-' )
  253. {
  254. memmove( str, str+1, 6 );
  255. str[6] = '\0';
  256. }
  257. else if ( ! strcmp( str, str_resign ) )
  258. {
  259. strncpy( str, "resign", len-1 );
  260. str[len-1] = '\0';
  261. dek_win += 1;
  262. Out( "Bonanza won against Dekunobou\n" );
  263. }
  264. else {
  265. str_error = "unknown command is recieved from Deknobou.";
  266. return -2;
  267. }
  268. return 1;
  269. }
  270. # endif /* DEKUNOBOU */