Advertisement
Guest User

Untitled

a guest
Oct 17th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.82 KB | None | 0 0
  1. #include <WinSock2.h>
  2. #include <WS2tcpip.h>
  3. #include <stdio.h>
  4. #define _CRT_SECURE_NO_WARNINGS
  5. #include <stdlib.h>
  6. #include <Windows.h>
  7. #include <string.h>
  8.  
  9.  
  10. // enum, typedef, union, endianess, memset
  11.  
  12. void Chat(SOCKET* sock);
  13. DWORD WINAPI ChatReceive(void* param);
  14.  
  15. void ListenChat(void);
  16.  
  17. void ConnectChat(void);
  18.  
  19. struct in_addr GetIPFromString(char* str);
  20.  
  21. struct in_addr GetIPFromUser();
  22.  
  23. void InitWinsock(void)
  24. {
  25.     int iResult;
  26.     WSADATA wsaData;
  27.  
  28.     // Initialize Winsock
  29.     iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
  30.     if (iResult != 0) {
  31.         printf("WSAStartup failed: %d\n", iResult);
  32.         exit(1);
  33.     }
  34. }
  35.  
  36. int main(void)
  37. {
  38.     char c;
  39.     int i = -1;
  40.  
  41.     printf("Enter 1 to connect or 2 to listen: ");
  42.     c = getchar();
  43.     getchar(); // to get the \n after the number
  44.  
  45.     InitWinsock();
  46.  
  47.     switch (c)
  48.     {
  49.     case '1':
  50.         ConnectChat();
  51.         break;
  52.     case '2':
  53.         i++;
  54.         ListenChat(i);
  55.         break;
  56.     default:
  57.         printf("Invalid key given! Exiting!");
  58.         return 1;
  59.         break;
  60.     }
  61.     return 0;
  62. }
  63.  
  64. void ListenChat(int i)
  65. {
  66.     SOCKET sock;
  67.  
  68.     struct sockaddr_in sockaddr;
  69.     int res;
  70.     int len;
  71.     SOCKET* psock=NULL;
  72.  
  73.     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  74.     if (sock == SOCKET_ERROR)
  75.     {
  76.         printf("Error on sock init!");
  77.         exit(2);
  78.     }
  79.  
  80.     sockaddr.sin_family = AF_INET;
  81.     sockaddr.sin_port = htons(7777);
  82.     sockaddr.sin_addr = GetIPFromString("0.0.0.0");
  83.  
  84.     memset(sockaddr.sin_zero, 0, 8);
  85.  
  86.     res = bind(sock, (struct sockaddr*)&sockaddr, sizeof(sockaddr));
  87.     if (res == SOCKET_ERROR)
  88.     {
  89.         printf("Error on sock bind!");
  90.         exit(2);
  91.     }
  92.  
  93.     res = listen(sock, 1);
  94.     if (res == SOCKET_ERROR)
  95.     {
  96.         printf("Error on sock listen!");
  97.         exit(2);
  98.     }
  99.  
  100.     psock[i] = accept(sock, NULL, NULL);
  101.     psock[i + 1] = NULL;
  102.     if (psock[i] == SOCKET_ERROR)
  103.     {
  104.         printf("Error on sock accept! %d", WSAGetLastError());
  105.         exit(2);
  106.     }
  107.  
  108.     res = send(psock[i], "Hello! I am connected!", 23, NULL);
  109.     if (res == SOCKET_ERROR)
  110.     {
  111.         printf("Error on sock send!");
  112.         exit(2);
  113.     }
  114.  
  115.     Chat(psock);
  116. }
  117.  
  118. struct in_addr GetIPFromString(char* str)
  119. {
  120.     struct in_addr in;
  121.  
  122.     InetPton(AF_INET, str, &in.S_un.S_addr);
  123.     return in;
  124. }
  125.  
  126. struct in_addr GetIPFromUser()
  127. {
  128.     char buffer[256];
  129.  
  130.     printf("Insert IP: ");
  131.     scanf("%s", buffer);
  132.  
  133.     return GetIPFromString(buffer[0] == '\0' || buffer[0] == ' ' ? "127.0.0.1" : buffer);
  134. }
  135.  
  136. void ConnectChat(void)
  137. {
  138.     SOCKET* sock;
  139.     struct sockaddr_in sockaddr;
  140.     int res;
  141.  
  142.     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  143.     if (sock == SOCKET_ERROR)
  144.     {
  145.         printf("Error on sock init!");
  146.         exit(2);
  147.     }
  148.  
  149.     sockaddr.sin_family = AF_INET;
  150.     sockaddr.sin_port = htons(7777);
  151.     sockaddr.sin_addr = GetIPFromUser();
  152.  
  153.     memset(sockaddr.sin_zero, 0, 8);
  154.  
  155.     res = connect(sock, (struct sockaddr*)&sockaddr, sizeof(struct sockaddr));
  156.     if (res == SOCKET_ERROR)
  157.     {
  158.         printf("Error on sock connect!");
  159.         exit(2);
  160.     }
  161.  
  162.     res = send(sock, "Hello! I am connected!", 23, NULL);
  163.     if (res == SOCKET_ERROR)
  164.     {
  165.         printf("Error on sock send!");
  166.         exit(2);
  167.     }
  168.  
  169.     Chat(sock);
  170.  
  171. }
  172.  
  173. void Chat(SOCKET* sock)
  174. {
  175.     char buff[2048];
  176.     int res;
  177.     HANDLE thd;
  178.     int i = 0, j;
  179.  
  180.     while (!(sock[i] == NULL))
  181.     {
  182.         thd = CreateThread(NULL, NULL, &ChatReceive, (void*)sock[i], NULL, NULL);
  183.         i++;
  184.  
  185.  
  186.         while (1)
  187.         {
  188.             fgets(buff, 2048, stdin);
  189.             j = 0;
  190.  
  191.             while (!(sock[j] == NULL))
  192.             {
  193.                 res = send(sock[j], buff, strlen(buff) + 1, NULL);
  194.                 j++;
  195.  
  196.                 if (res == SOCKET_ERROR)
  197.                 {
  198.                     printf("send stopped.");
  199.                     break;
  200.                 }
  201.             }
  202.         }
  203.  
  204.         WaitForSingleObject(thd, INFINITE);
  205.     }
  206.  
  207.     for (j = 0; j<i - 1; j++)
  208.         closesocket(sock[j]);
  209. }
  210.  
  211. DWORD WINAPI ChatReceive(void* param)
  212. {
  213.     char buff[2048];
  214.     int res;
  215.     SOCKET sock = (SOCKET)param;
  216.  
  217.     while (1)
  218.     {
  219.         res = recv(sock, buff, 2048, NULL);
  220.         if (res == SOCKET_ERROR)
  221.         {
  222.             printf("recv stopped.");
  223.             break;
  224.         }
  225.         printf("Other: %s\n", buff);
  226.     }
  227.  
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement