Question: I am making chat program using windows 10 and C (Visual Studio 2015). I have wanted to check how does it works so I copied
I am making chat program using windows 10 and C (Visual Studio 2015).
I have wanted to check how does it works so I copied and pasted server and client code and then I have run this code but I have failed to run even a server code.
I made 2 projects and one project has server code and the other has client code.
Everytime I run this code clicking exe file in debug folder, cmd window appears and disappears very quickly.
and Everytime I run this code using ctrl + f5 on visual studio 2015, cmd window appears and show me "Usage: C:\Users\~~~~~~.exe . ~~ enter any keys" and does nothing.
I think cmd window must not be disappeared until it connects with client or I enter some port number.
I think code is not wrong..
Please help me. here are server code and client code.
-----------------------------------------------------------------------------------------------
1. Server
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include
#include
#include
#include
#include
#define BUFFER_SIZE 100
#define MAXIMUM_CLIENT_NUMBER 100
unsigned WINAPI Handle_Client(void *arg);
void sending_messages(char *messages, int length);
void error_handling(char *messages);
int client_number = 0;
SOCKET client[MAXIMUM_CLIENT_NUMBER];
HANDLE hMutex;
int main(int argc, char *argv[]) {
WSADATA wsaData;
SOCKET server_socket, client_socket;
SOCKADDR_IN server_address, client_address;
int client_address_size;
HANDLE hThread;
if (argc != 2) {
printf("Usage: %s ", argv[0]);
exit(1);
}
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
error_handling("WSAStartup() error!");
}
hMutex = CreateMutex(NULL, FALSE, NULL);
server_socket = socket(PF_INET, SOCK_STREAM, 0);
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(atoi(argv[1]));
if (bind(server_socket, (SOCKADDR*)&server_address, sizeof(server_address)) == SOCKET_ERROR) {
error_handling("bind() error");
}
if (listen(server_socket, 5) == SOCKET_ERROR) {
error_handling("listen() error");
}
while (1) {
client_address_size = sizeof(client_address);
client_socket = accept(server_socket, (SOCKADDR*)&client_address, &client_address_size);
WaitForSingleObject(hMutex, INFINITE);
client[client_number++] = client_socket;
ReleaseMutex(hMutex);
hThread = (HANDLE)_beginthreadex(NULL, 0, Handle_Client, (void*)&client_socket, 0, NULL);
printf("Connected client IP: %s ", inet_ntoa(client_address.sin_addr));
}
closesocket(server_socket);
WSACleanup();
return 0;
}
unsigned WINAPI Handle_Client(void *arg) {
SOCKET client_socket = *((SOCKET*)arg);
int string_length = 0, i;
char messages[BUFFER_SIZE];
while ((string_length = recv(client_socket, messages, sizeof(messages), 0)) != 0) {
sending_messages(messages, string_length);
}
WaitForSingleObject(hMutex, INFINITE);
for (i = 0; i < client_number; i++) {
if (client_socket == client[i]) {
while (i++ < client_number - 1) {
client[i] = client[i + 1];
break;
}
}
}
client_number--;
ReleaseMutex(hMutex);
closesocket(client_socket);
return 0;
}
void sending_messages(char *messages, int length) {
int i;
WaitForSingleObject(hMutex, INFINITE);
for (i = 0; i < client_number; i++) {
send(client[i], messages, length, 0);
}
ReleaseMutex(hMutex);
}
void error_handling(char *messages) {
fputs(messages, stderr);
fputc(' ', stderr);
exit(1);
}
-------------------------------------------------------------------------------------------------
2. Client
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include
#include
#include
#include
#include
#define BUFFER_SIZE 100
#define NAME_SIZE 20
unsigned WINAPI sending_messages(void *arg);
unsigned WINAPI receiving_messages(void *arg);
void error_handling(char *messages);
char name[NAME_SIZE] = "[DEFAULT]";
char messages[BUFFER_SIZE];
int main(int argc, char *argv[]) {
WSADATA wsaData;
SOCKET hSock;
SOCKADDR_IN server_address;
HANDLE sending_thread, receiving_thread;
if (argc != 4) {
printf("Usage: %s ", argv[0]);
exit(1);
}
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
error_handling("WSAStartup() error!");
}
sprintf(name, "[%s]", argv[3]);
hSock = socket(PF_INET, SOCK_STREAM, 0);
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(atoi(argv[1]));
if (connect(hSock, (SOCKADDR*)&server_address, sizeof(server_address)) == SOCKET_ERROR) {
error_handling("connect() error");
}
sending_thread = (HANDLE)_beginthreadex(NULL, 0, sending_messages, (void*)&hSock, 0, NULL);
receiving_thread = (HANDLE)_beginthreadex(NULL, 0, receiving_messages, (void*)&hSock, 0, NULL);
WaitForSingleObject(sending_thread, INFINITE);
WaitForSingleObject(receiving_thread, INFINITE);
closesocket(hSock);
WSACleanup();
return 0;
}
unsigned WINAPI sending_messages(void *arg) {
SOCKET hSock = *((SOCKET*)arg);
char name_messages[NAME_SIZE + BUFFER_SIZE];
while (1) {
fgets(messages, BUFFER_SIZE, stdin);
if (!strcmp(messages, "q ") || strcmp(messages, "Q ")) {
closesocket(hSock);
exit(0);
}
sprintf(name_messages, "%s %s", name, messages);
send(hSock, name_messages, strlen(name_messages), 0);
}
return 0;
}
unsigned WINAPI receiving_messages(void *arg) {
int hSock = *((SOCKET*)arg);
char name_messages[NAME_SIZE + BUFFER_SIZE];
int string_length;
while (1) {
string_length = recv(hSock, name_messages, NAME_SIZE + BUFFER_SIZE - 1, 0);
if (string_length == -1) {
return -1;
}
name_messages[string_length] = 0;
fputs(name_messages, stdout);
}
return 0;
}
void error_handling(char *messages) {
fputs(messages, stderr);
fputc(' ', stderr);
exit(1);
}
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
