#include #include #include #include #include #include "chatlib.h" int read_message(int skt, char* buffer, size_t buflen){ ssize_t readlen = read(skt, buffer, 1); if(readlen != 1) return 1; switch(buffer[0]){ case USER: case LEFT: readlen = recv(skt, buffer+1, 32, MSG_WAITALL); if(readlen != 32) return 1; break; case TEXT: if(recv(skt, buffer+1, 32, MSG_WAITALL) != 32) return 1; readlen = recv(skt, buffer+33, 2, MSG_WAITALL); if(readlen != 2) return 1; uint16_t* msglen = (uint16_t*)(buffer+33); readlen = (*msglen > buflen-3)? buflen - 3:*msglen; readlen = recv(skt, buffer+35, readlen, MSG_WAITALL); buffer[35+readlen] = 0; break; case NAMETAKEN: break; case PM: if(recv(skt, buffer+1, 66, MSG_WAITALL) != 66) return 1; readlen = recv(skt, buffer+67, *(uint16_t*)(buffer+1), MSG_WAITALL); buffer[67+readlen] = 0; break; default: printf("Unknown message type %d\n", buffer[0]); return 1; } return 0; } int send_message(int skt, char* sender, char* message){ uint16_t mlen = strlen(message); const char mtype = TEXT; if(write(skt, &mtype, 1) != 1) return 1; if(write(skt, sender, 32) != 32) return 1; if(write(skt, &mlen, 2) != 2) return 1; if(write(skt, message, mlen) != mlen) return 1; return 0; }