Advertisement
Guest User

Untitled

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