#include #include #include #include #include #define PORT 12345 #define BUFFER_SIZE 1024 #define MAX_CLIENTS 5 // Structure to hold client information struct ClientInfo { SOCKET socket; struct sockaddr_in address; }; // Function to handle each client DWORD WINAPI handleClient(LPVOID lpParam) { struct ClientInfo *clientInfo = (struct ClientInfo *)lpParam; SOCKET clientSocket = clientInfo->socket; // Open and send file FILE *fileToSend = fopen("file_to_send.txt", "rb"); if (!fileToSend) { printf("Error opening file\n"); closesocket(clientSocket); free(clientInfo); return 1; } char buffer[BUFFER_SIZE]; while (1) { int bytesRead = fread(buffer, 1, sizeof(buffer), fileToSend); if (bytesRead <= 0) { break; // End of file or error } send(clientSocket, buffer, bytesRead, 0); } printf("File sent to %s:%d\n", inet_ntoa(clientInfo->address.sin_addr), ntohs(clientInfo->address.sin_port)); // Close the socket and file fclose(fileToSend); closesocket(clientSocket); free(clientInfo); return 0; } int main() { WSADATA wsaData; SOCKET serverSocket, clientSocket; struct sockaddr_in serverAddr, clientAddr; int addrSize = sizeof(struct sockaddr_in); // Initialize Winsock if (WSAStartup(MAKEWORD(2, 2), &wsaData;) != 0) { printf("WSAStartup failed\n"); return 1; } // Create socket if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { printf("Error creating socket: %d\n", WSAGetLastError()); WSACleanup(); return 1; } // Configure server address memset(&serverAddr;, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = INADDR_ANY; // Bind the socket if (bind(serverSocket, (struct sockaddr *)&serverAddr;, sizeof(serverAddr)) == SOCKET_ERROR) { printf("Error binding socket: %d\n", WSAGetLastError()); closesocket(serverSocket); WSACleanup(); return 1; } // Listen for incoming connections if (listen(serverSocket, MAX_CLIENTS) == SOCKET_ERROR) { printf("Error listening for connections: %d\n", WSAGetLastError()); closesocket(serverSocket); WSACleanup(); return 1; } printf("Server listening on port %d...\n", PORT); while (1) { // Accept a connection if ((clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr;, &addrSize;)) == INVALID_SOCKET) { printf("Error accepting connection: %d\n", WSAGetLastError()); closesocket(serverSocket); WSACleanup(); return 1; } // Create a new thread to handle the client struct ClientInfo *clientInfo = (struct ClientInfo *)malloc(sizeof(struct ClientInfo)); clientInfo->socket = clientSocket; clientInfo->address = clientAddr; HANDLE hThread = CreateThread(NULL, 0, handleClient, (LPVOID)clientInfo, 0, NULL); if (hThread == NULL) { printf("Error creating thread\n"); closesocket(clientSocket); free(clientInfo); } else { CloseHandle(hThread); } } // Close the server socket closesocket(serverSocket); WSACleanup(); return 0; }