// minimal client implementation #include #include #include #include #include #include #include "arena.h" #include "common.h" int main(int argc, char **argv) { if (argc < 3) { fprintf(stderr, "usage: send \n"); return 1; } u32 err, serverfd, nsend; serverfd = socket(AF_INET, SOCK_STREAM, 0); assert(serverfd != -1); const struct sockaddr_in address = { AF_INET, htons(PORT), {0}, }; err = connect(serverfd, (struct sockaddr *)&address, sizeof(address)); assert(err == 0); u32 author_len = strlen(argv[1]); // add 1 for null terminator assert(author_len + 1 <= AUTHOR_LEN); // convert text to wide string u32 text_len = strlen(argv[2]) + 1; wchar_t text_wide[text_len]; u32 size = mbstowcs(text_wide, argv[2], text_len - 1); assert(size == text_len - 1); // null terminate text_wide[text_len - 1] = 0; Arena *bufArena = ArenaAlloc(); u8 *buf = ArenaPush(bufArena, (text_len - 1) * sizeof(*text_wide)); Message *mbuf = (Message *)buf; memcpy(mbuf->author, argv[1], author_len); message_timestamp(mbuf->timestamp); mbuf->text_len = text_len; memcpy(&mbuf->text, text_wide, mbuf->text_len * sizeof(wchar_t)); nsend = send(serverfd, buf, MESSAGELENP(mbuf), 0); assert(nsend >= 0); printf("text_len: %d\n", text_len); fprintf(stdout, "Sent %d bytes.\n", nsend); ArenaRelease(bufArena); return 0; }