Advertisement
Guest User

Untitled

a guest
Oct 19th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.76 KB | None | 0 0
  1. #include <WinSock2.h>
  2. #include <WS2tcpip.h>
  3. #include <stdio.h>
  4.  
  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. SOCKET* psock;
  24. int len=0;
  25.  
  26. void InitWinsock(void)
  27. {
  28.     int iResult;
  29.     WSADATA wsaData;
  30.  
  31.     // Initialize Winsock
  32.     iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
  33.     if (iResult != 0) {
  34.         printf("WSAStartup failed: %d\n", iResult);
  35.         exit(1);
  36.     }
  37. }
  38.  
  39. int main(void)
  40. {
  41.     char c;
  42.     int i = -1;
  43.  
  44.     printf("Enter 1 to connect or 2 to listen: ");
  45.     c = getchar();
  46.     getchar(); // to get the \n after the number
  47.  
  48.     InitWinsock();
  49.  
  50.     switch (c)
  51.     {
  52.     case '1':
  53.         ConnectChat();
  54.         break;
  55.     case '2':
  56.         i++;
  57.         len++;
  58.         ListenChat(i);
  59.         break;
  60.     default:
  61.         printf("Invalid key given! Exiting!");
  62.         return 1;
  63.         break;
  64.     }
  65.     return 0;
  66. }
  67.  
  68. void ListenChat(int i)
  69. {
  70.     SOCKET sock;
  71.  
  72.     struct sockaddr_in sockaddr;
  73.     int res;
  74.  
  75.     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  76.     if (sock == SOCKET_ERROR)
  77.     {
  78.         printf("Error on sock init!");
  79.         exit(2);
  80.     }
  81.  
  82.     sockaddr.sin_family = AF_INET;
  83.     sockaddr.sin_port = htons(7777);
  84.     sockaddr.sin_addr = GetIPFromString("0.0.0.0");
  85.  
  86.     memset(sockaddr.sin_zero, 0, 8);
  87.  
  88.     res = bind(sock, (struct sockaddr*)&sockaddr, sizeof(sockaddr));
  89.     if (res == SOCKET_ERROR)
  90.     {
  91.         printf("Error on sock bind!");
  92.         exit(2);
  93.     }
  94.  
  95.     res = listen(sock, 1);
  96.     if (res == SOCKET_ERROR)
  97.     {
  98.         printf("Error on sock listen!");
  99.         exit(2);
  100.     }
  101.  
  102.     psock[i] = accept(sock, NULL, NULL);
  103.     if (psock[i] == SOCKET_ERROR)
  104.     {
  105.         printf("Error on sock accept! %d", WSAGetLastError());
  106.         exit(2);
  107.     }
  108.  
  109.     res = send(psock[i], "Hello! I am connected!", 23, NULL);
  110.     if (res == SOCKET_ERROR)
  111.     {
  112.         printf("Error on sock send!");
  113.         exit(2);
  114.     }
  115.  
  116.     Chat(psock);
  117. }
  118.  
  119. struct in_addr GetIPFromString(char* str)
  120. {
  121.     struct in_addr in;
  122.  
  123.     InetPton(AF_INET, str, &in.S_un.S_addr);
  124.     return in;
  125. }
  126.  
  127. struct in_addr GetIPFromUser()
  128. {
  129.     char buffer[256];
  130.  
  131.     printf("Insert IP: ");
  132.     scanf("%s", buffer);
  133.  
  134.     return GetIPFromString(buffer[0] == '\0' || buffer[0] == ' ' ? "127.0.0.1" : buffer);
  135. }
  136.  
  137. void ConnectChat(void)
  138. {
  139.     SOCKET* sock;
  140.     struct sockaddr_in sockaddr;
  141.     int res;
  142.  
  143.     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  144.     if (sock == SOCKET_ERROR)
  145.     {
  146.         printf("Error on sock init!");
  147.         exit(2);
  148.     }
  149.  
  150.     sockaddr.sin_family = AF_INET;
  151.     sockaddr.sin_port = htons(7777);
  152.     sockaddr.sin_addr = GetIPFromUser();
  153.  
  154.     memset(sockaddr.sin_zero, 0, 8);
  155.  
  156.     res = connect(sock, (struct sockaddr*)&sockaddr, sizeof(struct sockaddr));
  157.     if (res == SOCKET_ERROR)
  158.     {
  159.         printf("Error on sock connect!");
  160.         exit(2);
  161.     }
  162.  
  163.     res = send(sock, "Hello! I am connected!", 23, NULL);
  164.     if (res == SOCKET_ERROR)
  165.     {
  166.         printf("Error on sock send!");
  167.         exit(2);
  168.     }
  169.     sock[1]=NULL;
  170.  
  171.     Chat(sock);
  172.  
  173. }
  174.  
  175. void Chat(SOCKET* sock)
  176. {
  177.     char buff[2048];
  178.     int res;
  179.     HANDLE thd;
  180.     int i = 0, j;
  181.  
  182.     for(; i<len; i++)
  183.     {
  184.         thd = CreateThread(NULL, NULL, &ChatReceive, (void*)sock[i], NULL, NULL);
  185.  
  186.         while (1)
  187.         {
  188.             fgets(buff, 2048, stdin);
  189.             j=0;
  190.  
  191.             for(; j<len; j++)
  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<len; 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