Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // TCPChatServer.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include "stdio.h"
- #include "conio.h"
- #include "winsock2.h"
- #include "ws2tcpip.h"
- struct packet
- {
- BYTE head;
- WORD length;
- BYTE data[4096];
- };
- struct user
- {
- char nickname[32];
- char password[32];
- bool isOnline;
- };
- struct ClientInfo
- {
- SOCKET c;
- SOCKADDR_IN cAddr;
- char nickname[32];
- char password[32];
- char filename[256];
- bool state = false;
- bool nhanfile = false;
- bool dongynhan = false;
- };
- SOCKET s;
- SOCKADDR_IN sAddr;
- user * users[5];
- ClientInfo * cClient[1024];
- int nClient = 0;
- DWORD WINAPI ClientThread(LPVOID Param) {
- int i = (int)Param, j, k;
- int len;
- char buf[1024], msg[1024], filename[256];
- int filesize, byterecv;
- char ans;
- double current = 0.0;
- FILE* fp = NULL;
- packet pk_recv, pk_send;
- char* error = "[Error]Unknown command!\n";
- char* login = "Server: Login to Server\n";
- pk_send.head = 0;
- pk_send.length = strlen(login);
- memcpy(pk_send.data, login, pk_send.length);
- send(cClient[i]->c, (char*)&pk_send, sizeof(struct packet), 0);
- while (true) {
- len = recv(cClient[i]->c, (char*)&pk_recv, sizeof(struct packet), MSG_WAITALL);
- if (len < pk_recv.length) break;
- if (cClient[i]->dongynhan == true) {
- //cClient[i]->nhanfile = true;
- fp = fopen(filename, "wb");
- byterecv = 0;
- cClient[i]->dongynhan = false;
- }
- if (pk_recv.head == 0) {
- pk_recv.data[pk_recv.length-1] = 0;
- if (strnicmp((char*)pk_recv.data, "login ", 6) == 0) {
- char nickname[32], password[32];
- bool isNoError = false;
- char * pos = NULL;
- pos = strchr((char*)pk_recv.data + 6, ' ');
- if (pos != 0) {
- strncpy(nickname, (char*)pk_recv.data + 6, pos - (char*)pk_recv.data - 6);
- nickname[pos - (char*)pk_recv.data - 6] = 0;
- sprintf(password, pos+1);
- for (j = 0; j < 5; j++) {
- if (strcmp(nickname,users[j]->nickname) == 0
- && strcmp(password, users[j]->password) == 0
- && users[j]->isOnline == false) {
- strcpy(cClient[i]->nickname, nickname);
- strcpy(cClient[i]->password, password);
- cClient[i]->state = true;
- users[j]->isOnline = true;
- sprintf(msg, "[Info] %s logged in!\n", cClient[i]->nickname);
- printf(msg);
- for (k = 0; k < nClient; k++)
- if (cClient[k] != 0 && cClient[k]->state == true) {
- pk_send.head = 0;
- pk_send.length = strlen(msg);
- memcpy(pk_send.data, msg, pk_send.length);
- send(cClient[k]->c, (char*)&pk_send, sizeof(struct packet), 0);
- };
- isNoError = true;
- break;
- }
- }
- if (isNoError == false) {
- sprintf(msg, "[Error] Login error!\n");
- pk_send.head = 0;
- pk_send.length = strlen(msg);
- memcpy(pk_send.data, msg, pk_send.length);
- send(cClient[i]->c, (char*)&pk_send, sizeof(struct packet), 0);
- }
- }
- continue;
- }
- if (strnicmp((char*)pk_recv.data, "list", 4) == 0) {
- if (cClient[i]->state == false) continue;
- sprintf(msg, "----------------------\n[Info] User is online:\n");
- for (j = 0; j < nClient; j++) {
- if (cClient[j]->state == true) sprintf(msg, "%s%s\n", msg, cClient[j]->nickname);
- }
- sprintf(msg, "%s----------------------\n", msg);
- pk_send.head = 0;
- pk_send.length = strlen(msg);
- memcpy(pk_send.data, msg, pk_send.length);
- send(cClient[i]->c, (char*)&pk_send, sizeof(struct packet), 0);
- continue;
- }
- if (strnicmp((char*)pk_recv.data, "chat * ", 7) == 0) {
- if (cClient[i]->state == false) continue;
- sprintf(msg, "[%s] %s\n", cClient[i]->nickname, (char*)pk_recv.data + 7);
- printf(msg);
- for (j = 0; j < nClient;j++)
- if (i != j && cClient[j] != 0 && cClient[j]->state == true) {
- pk_send.head = 0;
- pk_send.length = strlen(msg);
- memcpy(pk_send.data, msg, pk_send.length);
- send(cClient[j]->c, (char*)&pk_send, sizeof(struct packet), 0);
- }
- continue;
- }
- if (strnicmp((char*)pk_recv.data, "chat ", 5) == 0) {
- if (cClient[i]->state == false) continue;
- char nickname[32];
- char* pos = NULL;
- pos = strchr((char*)pk_recv.data + 5, ' ');
- if (pos != 0) {
- strncpy(nickname, (char*)pk_recv.data + 5, pos - (char*)pk_recv.data - 5);
- nickname[pos - (char*)pk_recv.data - 5] = 0;
- sprintf(msg, "[%s] %s\n", cClient[i]->nickname, pos + 1);
- for (j = 0; j < nClient;j++)
- if (j != i
- && cClient[j] != 0
- && cClient[j]->state == true
- && stricmp(nickname, cClient[j]->nickname) == 0) {
- pk_send.head = 0;
- pk_send.length = strlen(msg);
- memcpy(pk_send.data, msg, pk_send.length);
- send(cClient[j]->c, (char*)&pk_send, sizeof(struct packet), 0);
- };
- if (stricmp(nickname, "server") == 0) printf("[%s] %s\n", cClient[i]->nickname, pos + 1);
- }
- continue;
- }
- pk_send.head = 0;
- pk_send.length = strlen(error);
- memcpy(pk_send.data, error, pk_send.length);
- send(cClient[i]->c, (char*)&pk_send, sizeof(struct packet), 0);
- continue;
- }
- if (pk_recv.head == 1) {
- if (cClient[i]->state == false) continue;
- char target[33];
- strncpy(filename, (char*)pk_recv.data, 255);
- filename[255] = 0;
- strncpy(target, (char*)pk_recv.data + 255, 32);
- target[32] = 0;
- memcpy(&filesize, pk_recv.data + 255 + 32, 4);
- if (stricmp(target, "server") == 0) {
- printf("[%s] muon gui toi [%s] file %s, kich thuoc %d byte. Co nhan khong(Y/N)?\n",
- cClient[i]->nickname, target, filename, filesize);
- sprintf(cClient[i]->filename, filename);
- cClient[i]->nhanfile = true;
- }
- else {
- pk_send.head = 5;
- pk_send.length = 255 + 32 + 32 + 4;
- for (j = 0; j < 5; j++)
- if (stricmp(target, users[j]->nickname) == 0 && users[j]->isOnline == true) break;
- send(cClient[j]->c, (char*)&pk_send.head, sizeof(pk_send.head), 0);
- send(cClient[j]->c, (char*)&pk_send.length, sizeof(pk_send.length), 0);
- send(cClient[j]->c, filename, 255, 0);
- send(cClient[j]->c, target, 255, 0);
- send(cClient[j]->c, (char*)&filesize, sizeof(filesize), 0);
- }
- continue;
- }
- if (pk_recv.head == 4) {
- fwrite(pk_recv.data, 1, pk_recv.length, fp);
- //Sleep(1);
- byterecv += pk_recv.length;
- current = (double)byterecv / (double)filesize * 100;
- printf("[%s] %0.2f%%\r", cClient[i]->nickname, current);
- if (byterecv == filesize) {
- printf("Xong!\n");
- fclose(fp);
- }
- continue;
- }
- }
- return 0;
- }
- DWORD WINAPI SenderThread(LPVOID Param) {
- char buf[1024], msg[1024];
- int i;
- packet pk_recv, pk_send;
- while (true) {
- for (i = 0; i < nClient; i++) {
- if (cClient[i]->nhanfile == true) {
- printf("Tra loi nhan file tu [%s]: ", cClient[i]->nickname);
- fflush(stdin);
- fgets(buf, 1024, stdin);
- if (strnicmp(buf, "Y", 1) == 0 && strnicmp(buf, "y", 1) == 0) {
- pk_send.head = 2;
- pk_send.length = 255;
- cClient[i]->nhanfile = false;
- cClient[i]->dongynhan = true;
- }
- else if (strnicmp(buf, "N", 1) == 0 && strnicmp(buf, "n", 1) == 0) {
- pk_send.head = 3;
- pk_send.length = 0;
- cClient[i]->nhanfile = false;
- }
- if (pk_send.head == 2)
- memcpy(pk_send.data, cClient[i]->filename, 255);
- send(cClient[i]->c, (char*)&pk_send, sizeof(struct packet), 0);
- continue;
- }
- }
- fflush(stdin);
- fgets(buf, 1024, stdin);
- sprintf(msg, "[Server] %s\n", buf);
- for (i = 0; i < nClient;i++)
- if (cClient[i] != 0 && cClient[i]->state == true) {
- pk_send.head = 0;
- pk_send.length = strlen(msg);
- memcpy(pk_send.data, msg, pk_send.length);
- send(cClient[i]->c, (char*)&pk_send, sizeof(struct packet), 0);
- }
- }
- return 0;
- }
- int main() {
- for (int j = 0; j < 5; j++) {
- users[j] = 0;
- users[j] = new user;
- }
- strcpy(users[0]->nickname, "123"); strcpy(users[0]->password, "123"); users[0]->isOnline = false;
- strcpy(users[1]->nickname, "456"); strcpy(users[1]->password, "456"); users[1]->isOnline = false;
- strcpy(users[2]->nickname, "789"); strcpy(users[2]->password, "789"); users[2]->isOnline = false;
- strcpy(users[3]->nickname, "abc"); strcpy(users[3]->password, "abc"); users[3]->isOnline = false;
- strcpy(users[4]->nickname, "cde"); strcpy(users[4]->password, "cde"); users[4]->isOnline = false;
- WSADATA wsadata;
- int ret = WSAStartup(MAKEWORD(2, 2), &wsadata);
- s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- sAddr.sin_family = AF_INET;
- sAddr.sin_port = htons(8888);
- sAddr.sin_addr.s_addr = htonl(INADDR_ANY);
- ret = bind(s, (sockaddr*)&sAddr, sizeof(sAddr));
- ret = listen(s, 16);
- int i, cAddrLen = sizeof(SOCKADDR_IN);
- bool datachluong = false;
- for (i = 0; i < 1024; i++) cClient[i] = 0;
- while (true) {
- for (i = 0; i < nClient; i++) if (cClient[i] == 0) break;
- cClient[i] = new ClientInfo;
- cClient[i]->c = accept(s, (sockaddr*)&cClient[i]->cAddr, &cAddrLen);
- CreateThread(0, 0, ClientThread, (LPVOID)i, 0, 0);
- if (datachluong == false) {
- CreateThread(0, 0, SenderThread, 0, 0, 0);
- datachluong = true;
- }
- if (i == nClient) nClient++;
- }
- for (i = 0; i < nClient; i++)
- if (cClient[i] != 0) {
- closesocket(cClient[i]->c);
- delete cClient[i];
- cClient[i] = 0;
- };
- WSACleanup();
- getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement