| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #include <stdio.h>
- #include <sys/socket.h>
- #include <netdb.h>
- #include <errno.h>
- #include <string.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #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);
- }
|