Advertisement
Guest User

Untitled

a guest
Dec 5th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // UDP server that use blocking sockets
  2. #define _WINSOCK_DEPRECATED_NO_WARNINGS
  3.  
  4. #define WIN32_LEAN_AND_MEAN
  5.  
  6. #include <windows.h>
  7. #include <winsock2.h>
  8. #include <ws2tcpip.h>
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include "conio.h"
  12.  
  13. #pragma comment (lib, "Ws2_32.lib")
  14. #pragma comment (lib, "Mswsock.lib")
  15. #pragma comment (lib, "AdvApi32.lib")
  16.  
  17. #define SERVER_PORT 15000   // Port number of server that will be used for communication with clients
  18. #define BUFFER_SIZE 512     // Size of buffer that will be used for sending and receiving messages to clients
  19.  
  20. struct Client
  21. {
  22.     char nadimak[32];
  23.     char IP[16];
  24.     int port;
  25. };
  26.  
  27. void mySend(SOCKET soket, char* msg, sockaddr_in dest)
  28. {
  29.     int result = sendto(soket, msg, strlen(msg), 0, (sockaddr*)&dest, sizeof(dest));
  30.     if (result == SOCKET_ERROR)
  31.     {
  32.         printf("Sendto failed with code %d!\n", WSAGetLastError());
  33.         closesocket(soket);
  34.         WSACleanup();
  35.         exit(1);
  36.     }
  37. }
  38.  
  39. Client makeClient(sockaddr_in client, char* name)
  40. {
  41.     Client c;
  42.     strcpy_s(c.IP, inet_ntoa(client.sin_addr));
  43.     strcpy_s(c.nadimak, name);
  44.     c.port = htons(client.sin_port);
  45.     return c;
  46. }
  47.  
  48. void initWSA(WSADATA* data)
  49. {
  50.     if (WSAStartup(MAKEWORD(2, 2), data) != 0)
  51.     {
  52.         printf("WSAStartup failed with error: %d\n", WSAGetLastError());
  53.         exit(1);
  54.     }
  55.  
  56. }
  57.  
  58. int main()
  59. {
  60.     WSADATA data;
  61.     initWSA(&data);
  62.  
  63.     sockaddr_in serverAddress;
  64.     memset((char*)&serverAddress, 0, sizeof(serverAddress));
  65.     serverAddress.sin_family = AF_INET;             // set server address protocol family
  66.     serverAddress.sin_addr.s_addr = INADDR_ANY;     // use all available addresses of server
  67.     serverAddress.sin_port = htons(SERVER_PORT);
  68.  
  69.     SOCKET serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  70.     if (serverSocket == INVALID_SOCKET)
  71.     {
  72.         printf("Creating socket failed with error: %d\n", WSAGetLastError());
  73.         WSACleanup();
  74.         return 1;
  75.     }
  76.  
  77.     int iResult = bind(serverSocket, (SOCKADDR *)&serverAddress, sizeof(serverAddress));
  78.     if (iResult == SOCKET_ERROR)
  79.     {
  80.         printf("Socket bind failed with error: %d\n", WSAGetLastError());
  81.         closesocket(serverSocket);
  82.         WSACleanup();
  83.         return 1;
  84.     }
  85.  
  86.  
  87.     while (true)
  88.     {
  89.  
  90.  
  91.         printf("Server ceka vase nadimke...\n");
  92.         sockaddr_in client1, client2;
  93.         int client1Len = sizeof(client1), client2Len = sizeof(client2);
  94.         char nadimak1[32] = { 0 }, nadimak2[32] = { 0 };
  95.  
  96.         memset(&client1, 0, sizeof(client1));
  97.         memset(&client2, 0, sizeof(client2));
  98.  
  99.         char pozdrav[50] = { 0 };
  100.         int result;
  101.  
  102.         result = recvfrom(serverSocket, nadimak1, 32, 0, (sockaddr*)&client1, &client1Len);
  103.         //nadimak1[result] = '\0';
  104.         sprintf_s(pozdrav, "Welcome, %s!\n", nadimak1);
  105.         mySend(serverSocket, pozdrav, client1);
  106.  
  107.  
  108.         result = recvfrom(serverSocket, nadimak2, 32, 0, (sockaddr*)&client2, &client2Len);
  109.         //nadimak2[result] = '\0';
  110.         sprintf_s(pozdrav, "Welcome, %s!\n", nadimak2);
  111.         mySend(serverSocket, pozdrav, client2);
  112.  
  113.  
  114.         Client k1 = makeClient(client1, nadimak1);
  115.         Client k2 = makeClient(client2, nadimak2);
  116.  
  117.  
  118.         printf("%s - %s : %d\n", k1.nadimak, k1.IP, k1.port);
  119.         printf("%s - %s : %d\n", k2.nadimak, k2.IP, k2.port);
  120.  
  121.         printf("---------------------------------------------------------\n");
  122.         printf("-------------------Pocetak dopisivanja-------------------\n");
  123.         printf("---------------------------------------------------------\n");
  124.  
  125.  
  126.         // Main server loop
  127.         char dataBuffer[BUFFER_SIZE];
  128.         while (1)
  129.         {
  130.             memset(dataBuffer, 0, BUFFER_SIZE);
  131.  
  132.             sockaddr_in clientAddress;
  133.             memset(&clientAddress, 0, sizeof(clientAddress));
  134.             int sockAddrLen = sizeof(clientAddress);
  135.  
  136.             iResult = recvfrom(serverSocket, dataBuffer, BUFFER_SIZE, 0, (SOCKADDR *)&clientAddress, &sockAddrLen);
  137.             dataBuffer[iResult] = '\0';
  138.  
  139.             int port = htons(clientAddress.sin_port);
  140.             if (port == k1.port)
  141.             {
  142.                 // Prvi je
  143.                 mySend(serverSocket, dataBuffer, client2);
  144.  
  145.                 printf("%s - %s\n", nadimak1, dataBuffer);
  146.                 if (!strcmp(dataBuffer, "Goodbye"))
  147.                     break;
  148.             }
  149.             else if (port == k2.port)
  150.             {
  151.                 //Drugi je
  152.                 mySend(serverSocket, dataBuffer, client1);
  153.  
  154.                 printf("%s - %s\n", nadimak2, dataBuffer);
  155.                 if (!strcmp(dataBuffer, "Goodbye"))
  156.                     break;
  157.             }
  158.  
  159.         }
  160.  
  161.         printf("---------------------------------------------------------\n");
  162.         printf("----------------------Kraj dopisivanja-------------------\n");
  163.         printf("---------------------------------------------------------\n");
  164.     }
  165.  
  166.  
  167.     iResult = closesocket(serverSocket);
  168.     if (iResult == SOCKET_ERROR)
  169.     {
  170.         printf("closesocket failed with error: %ld\n", WSAGetLastError());
  171.         WSACleanup();
  172.         return 1;
  173.     }
  174.     printf("Server successfully shut down.\n");
  175.     WSACleanup();
  176.     return 0;
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement