emscripten/tests/sdl2_net_client.c

145 строки
3.2 KiB
C

/*
* Copyright 2016 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/
/*
* Compile with:
*
* gcc -Wall `sdl-config --cflags` sdl2_net_client.c -o sdl2_net_client `sdl-config --libs` -lSDL_net
*
* or
*
* emcc -Wall sdl2_net_client.c -s USE_SDL_NET=2 -s USE_SDL=2 -o sdl2_net_client.js
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <assert.h>
#include "SDL_net.h"
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
typedef enum {
MSG_READ,
MSG_WRITE
} msg_state_t;
typedef struct {
TCPsocket sd; /* Socket descriptor */
msg_state_t msg_state;
int msg_i;
} state_t;
state_t state;
void finish(int result) {
if (state.sd) {
SDLNet_TCP_Close(state.sd);
SDLNet_Quit();
}
#ifdef __EMSCRIPTEN__
REPORT_RESULT(result);
emscripten_force_exit(result);
#else
exit(result);
#endif
}
char *msgs[] = {
"testmsg1",
"anothertestmsg",
"exit",
};
void main_loop()
{
char *sendbuf = msgs[state.msg_i];
char recvbuf[256] = {0};
int actual = 0, len = strlen(sendbuf) + 1;
printf("main loop with string %s and len %d\n", sendbuf, len);
if (state.msg_state == MSG_WRITE) {
printf("trying to send %s\n", sendbuf);
if ((actual = SDLNet_TCP_Send(state.sd, (void *)sendbuf, len)) != len)
{
fprintf(stderr, "SDLNet_TCP_Send: count:%d/%d errno:%d msg:%s\n",
actual, len, errno, SDLNet_GetError());
if (errno == EAGAIN) {
if (actual > 0) {
assert(0);
}
return;
}
finish(EXIT_FAILURE);
}
printf("send success\n");
state.msg_state = MSG_READ;
}
if (state.msg_state == MSG_READ) {
printf("trying to receive %s\n", sendbuf);
if ((actual = SDLNet_TCP_Recv(state.sd, (void *)recvbuf, len)) != len)
{
fprintf(stderr, "SDLNet_TCP_Recv: count:%d/%d errno:%d msg:%s\n",
actual, len, errno, SDLNet_GetError());
if (errno == EAGAIN) {
if (actual > 0) {
assert(0);
}
return;
}
finish(EXIT_FAILURE);
}
printf("receive success\n");
assert(strcmp(sendbuf, recvbuf) == 0);
if (!strcmp(recvbuf, "exit")) {
finish(EXIT_SUCCESS);
}
state.msg_i++;
state.msg_state = MSG_WRITE;
}
}
int main(int argc, char **argv)
{
IPaddress ip; /* Server address */
memset(&state, 0, sizeof(state_t));
state.msg_state = MSG_WRITE;
if (SDLNet_Init() < 0)
{
fprintf(stderr, "SDLNet_Init: %s\n", SDLNet_GetError());
finish(EXIT_FAILURE);
}
/* Resolve the host we are connecting to */
if (SDLNet_ResolveHost(&ip, "localhost", SOCKK) < 0)
{
fprintf(stderr, "SDLNet_ResolveHost: %s\n", SDLNet_GetError());
finish(EXIT_FAILURE);
}
/* Open a connection with the IP provided */
if (!(state.sd = SDLNet_TCP_Open(&ip)))
{
fprintf(stderr, "SDLNet_TCP_Open: %s\n", SDLNet_GetError());
finish(EXIT_FAILURE);
}
/* Send messages */
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(main_loop, 60, 0);
#else
while (1) main_loop();
#endif
return EXIT_SUCCESS;
}