145 строки
3.2 KiB
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;
|
|
}
|