aboutsummaryrefslogtreecommitdiff
path: root/send.c
diff options
context:
space:
mode:
Diffstat (limited to 'send.c')
-rw-r--r--send.c78
1 files changed, 44 insertions, 34 deletions
diff --git a/send.c b/send.c
index 585c925..689c6dc 100644
--- a/send.c
+++ b/send.c
@@ -8,6 +8,7 @@
#include <unistd.h>
#include "chatty.h"
+#include "protocol.h"
int
main(int argc, char** argv)
@@ -17,61 +18,70 @@ main(int argc, char** argv)
return 1;
}
- s32 err, serverfd, nsend;
+ s32 err, serverfd, nsend, nrecv;
serverfd = socket(AF_INET, SOCK_STREAM, 0);
assert(serverfd != -1);
- const struct sockaddr_in address = {
- AF_INET,
- htons(PORT),
- {0},
- };
+ const struct sockaddr_in address = {AF_INET, htons(PORT), {0}, {0}};
err = connect(serverfd, (struct sockaddr*)&address, sizeof(address));
assert(err == 0);
- // convert text to wide string
- u32 text_len = strlen(argv[2]) + 1;
- u32 text_wide[text_len];
- u32 size = mbstowcs((wchar_t*)text_wide, argv[2], text_len - 1);
- assert(size == text_len - 1);
- text_wide[text_len - 1] = 0;
- u32 author_len = strlen(argv[1]);
- assert(author_len + 1 <= AUTHOR_LEN); // add 1 for null terminator
-
- // Introduce ourselves
+ // Get our ID
+ ID id = 0;
{
- HeaderMessage header = HEADER_PRESENCEMESSAGE;
- PresenceMessage message;
+ // get author len
+ u32 author_len = strlen(argv[1]);
+ assert(author_len + 1 <= AUTHOR_LEN); // add 1 for null terminator
+
+ // Introduce ourselves
+ HeaderMessage header = HEADER_INIT(HEADER_TYPE_INTRODUCTION);
+ IntroductionMessage message;
memcpy(message.author, argv[1], author_len);
nsend = send(serverfd, &header, sizeof(header), 0);
assert(nsend != -1);
nsend = send(serverfd, &message, sizeof(message), 0);
assert(nsend != -1);
- }
- HeaderMessage header = HEADER_TEXTMESSAGE;
- TextMessage* message;
+ // Get id
+ nrecv = recv(serverfd, &header, sizeof(header), 0);
+ assert(nrecv != -1);
+ if (header.type == HEADER_TYPE_ERROR) {
+ ErrorMessage message;
+ nrecv = recv(serverfd, &message, sizeof(message), 0);
+ fprintf(stderr, "Got '%s' error.\n'", errorTypeString(message.type));
+ close(serverfd);
+ return 1;
+ }
+ assert(header.type == HEADER_TYPE_ID);
+ IDMessage idmessage;
+ nrecv = recv(serverfd, &idmessage, sizeof(idmessage), 0);
+ assert(nrecv != -1);
+ fprintf(stderr, "Got id: %lu\n", idmessage.id);
+ }
- u8 buf[text_len * sizeof(*text_wide) + TEXTMESSAGE_SIZE];
- bzero(buf, sizeof(buf));
- message = (TextMessage*)buf;
+ // convert text to wide string
+ u32 text_len = strlen(argv[2]) + 1;
+ u32 text_wide[text_len];
+ u32 size = mbstowcs((wchar_t*)text_wide, argv[2], text_len - 1);
+ assert(size == text_len - 1);
+ text_wide[text_len - 1] = 0;
- memcpy(message->author, argv[1], author_len);
- message->timestamp = time(NULL);
- message->len = text_len;
- memcpy(&message->text, text_wide, text_len * sizeof(*message->text));
+ HeaderMessage header = HEADER_INIT(HEADER_TYPE_TEXT);
+ TextMessage message;
+ bzero(&message, TEXTMESSAGE_SIZE);
+ message = (TextMessage){.id = id, .timestamp = time(NULL), .len = text_len};
nsend = send(serverfd, &header, sizeof(header), 0);
assert(nsend != -1);
- printf("header bytes sent: %d\n", nsend);
- nsend = send(serverfd, buf, sizeof(buf), 0);
+ fprintf(stderr, "header bytes sent: %d\n", nsend);
+ nsend = send(serverfd, &message, TEXTMESSAGE_SIZE, 0);
assert(nsend != -1);
+ fprintf(stderr, "message bytes sent: %d\n", nsend);
- printf("text length: %d\n", text_len);
- printf("buf size: %lu\n", sizeof(buf));
- printf("text size: %lu\n", sizeof(*text_wide) * text_len);
- printf("message bytes sent: %d\n", nsend);
+ u32 text_size = message.len * sizeof(*message.text);
+ nsend = send(serverfd, text_wide, text_size, 0);
+ fprintf(stderr, "text bytes sent: %d\n", nsend);
return 0;
}