#include #include #include #include #include #include #include #include #include "scufeng/log.h" #include "MultiPlayer.h" MultiPlayer MultiPlayer_alloc( const char *server_host, const uint16_t server_port ) { MultiPlayer mp; struct protoent *proto = getprotobyname("tcp"); mp.sock = socket(AF_INET, SOCK_STREAM, proto->p_proto); if (mp.sock == -1) { LOG_FATALF("socket failed: %d %s", errno, strerror(errno)); } struct in_addr server_addr; int res = inet_aton(server_host, &server_addr); if (res == 0) { LOG_FATAL("inet_aton failed"); } struct sockaddr_in server_sockaddr = { .sin_family = AF_INET, .sin_addr = server_addr, .sin_port = htons(server_port) }; res = connect( mp.sock, (struct sockaddr *) &server_sockaddr, sizeof(server_sockaddr) ); if (res == -1) { LOG_FATALF("connect failed: %d %s", errno, strerror(errno)); } mp.conn_s = fdopen(mp.sock, "r+"); if (mp.conn_s == nullptr) { LOG_FATALF("fdopen failed: (%d) %s", errno, strerror(errno)); } return mp; } void MultiPlayer_free(MultiPlayer *const mp) { fclose(mp->conn_s); mp->conn_s = nullptr; close(mp->conn); mp->conn = 0; close(mp->sock); mp->sock = 0; } void MultiPlayer_tick(MultiPlayer *const mp) { char buf[1024] = { 0 }; const size_t buf_size = sizeof(buf) / sizeof(buf[0]); printf("Write msg: "); fgets(buf, buf_size, stdin); const size_t msg_len = strlen(buf) - 1; size_t items_written = fwrite(&msg_len, sizeof(msg_len), 1, mp->conn_s); if (items_written < 1) { LOG_FATALF("fwrite failed to write msg_len %zu", items_written); } if (fflush(mp->conn_s) == EOF) { LOG_FATAL("fflush failed at msg_len"); } printf("Sent %zu items\n", items_written); items_written = fwrite(buf, msg_len, 1, mp->conn_s); if (items_written < 1) { LOG_FATALF("fwrite failed to write msg %zu", items_written); } if (fflush(mp->conn_s) == EOF) { LOG_FATAL("fflush failed at msg"); } printf("Sent %zu items\n", items_written); // ssize_t res = send(mp->sock, buf, strlen(buf) - 1, 0); // if (res == -1) { // LOG_ERRORF("send failed: %d %s", errno, strerror(errno)); // return; // } // printf("Sent %zu bytes\n", res); }