diff options
author | Raymaekers Luca <raymaekers.luca@gmail.com> | 2024-10-31 00:32:07 +0100 |
---|---|---|
committer | Raymaekers Luca <raymaekers.luca@gmail.com> | 2024-11-03 00:58:07 +0100 |
commit | b9aeccef208d6d5b7d40b71886981723f1e14b95 (patch) | |
tree | 0312eeeb23f17bd6ba7861c112a382a10207eda9 /send.c | |
parent | 48733b6acfa27af8e030d9b7abfb9109b1ce89e0 (diff) |
Added ID system with 1 and 2-way communication
Each client now has an ID that is permanently stored to ID_FILE
location. To implement this each client now uses two connections to the
server, one for bidirectional communication and one for unidirectional
communication. This makes it easier to not receive unexpected message.
Also each client and server now has a Client struct that represents a
client and a clientsArena associated with it.
Minor changes:
- Added logging to LOGFILE, that can be turned with LOGGING macro.
- Added more error types
- Added error handling on server
- Added error messages
- Added convenience functions
- Added disconnectAndNotify() function for convenience
- Use recvTextMessageResult as multiple-value-return-type instead of **
- Separated protocol stuff into protocol.h
- Added Result types when wanting to return multiple values
- Do not allocate arena's with malloc
- Added recvAnyMessageType for receiving messages that do not need to
be stored
- Add UNIFD and BIFD file descriptors for separating requests
chatty.c:
- Convert ID to string in screen_home()
- Removed the fds global variable
- Pass fds to threadReconnect
- Implement faster sleep with nanosleep(2)
- Close file descriptors when failed so we do not have too many file
descriptors open
server.c:
- Send presence messages on disconnect & connect
- renamed i to conn
Diffstat (limited to 'send.c')
-rw-r--r-- | send.c | 78 |
1 files changed, 44 insertions, 34 deletions
@@ -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; } |