Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.19 KB | None | 0 0
  1. #include <winsock2.h>
  2. #include <ws2tcpip.h>
  3. #include <iphlpapi.h>
  4. #include <stdio.h>
  5. #include <iostream>
  6. #include <stdlib.h>
  7. #include <conio.h>
  8. #include <errno.h>
  9.  
  10. #pragma comment(lib, "Ws2_32.lib")
  11.  
  12. using namespace std;
  13.  
  14. void wyswietlanie_linii(char *wskaz, int i);
  15.  
  16.  
  17. int main() {
  18.  
  19. printf("Program czyta naglowek komunikatu e-mail i usuwa wszystkie wiersze,\n ktore nie zaczynaja sie slowami: FROM, TO, SUBJECT, CC\n");
  20. //instalacja winsocka
  21. WSADATA wsaData;
  22.  
  23. int iResult;  // przechowywać będzie dane na temat powodzenia lub porażki.
  24.  
  25. // Inicjalizacja Winsock. MAKEWORD służy do sprawdzenia wersji winsocka. Jeżeli rezultat
  26. //będzie posiadał inną wartość niż 0 będzie to oznaczało błąd przy inicjalizacji WSA.
  27. iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  28. if (iResult != 0) {
  29.    printf("Nie powiodlo sie %d\n", iResult);
  30.    return 1;
  31. }
  32.  
  33. struct addrinfo *result = NULL,   // Struktura, która przechowywać będzie informacje
  34.                *ptr = NULL,   //  potrzebne do połaczenia się z siecią
  35.                hints;
  36.  
  37. ZeroMemory( &hints, sizeof(hints) ); // Wypełnia nam zerami hints
  38. hints.ai_family = AF_UNSPEC;         // Stała AF_UNSPEC oznacza, że kożystamy z TCP/IP
  39. hints.ai_socktype = SOCK_STREAM; // ustalenie typu protokołu na strumieniowy
  40. hints.ai_protocol = IPPROTO_TCP; // protokół TCP
  41.  
  42. #define DEFAULT_PORT "110"   // Ustawienie portu
  43.  
  44. //pobranie adresu poczty.  Jeżeli rezultat
  45. //będzie posiadał inną wartość niż 0 to socket nie połączy się z pocztą.
  46. iResult = getaddrinfo("poczta.o2.pl",DEFAULT_PORT,&hints,&result);
  47. if (iResult != 0) {
  48.    printf("socket nie polaczyl sie z  poczta %d\n", iResult);
  49.    WSACleanup();
  50.    return 1;
  51. }
  52.  
  53. //tworzymy socketa odbierajacego i wysylajacego dane
  54. SOCKET ConnectSocket = INVALID_SOCKET;
  55. ptr=result;             // Sprawdzanie czy socket działa
  56. ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, // poprawnie, by móc spokojnie
  57.    ptr->ai_protocol);          // połączyć się z pocztą
  58. if (ConnectSocket == INVALID_SOCKET) {
  59.    printf("socket odbierajacy cos z poczty nie dziala: %ld\n", WSAGetLastError());
  60.    freeaddrinfo(result);
  61.    WSACleanup();
  62.    return 1;
  63. }
  64.  
  65. //laczenie sie z serwerem. Iresult przyjmuje wartość połączenia się z pocztą
  66. // W razie nie powodzenia przyjmuje wartość SOCKET_ERROR i socket zostaje zamknięty.
  67. // ConnectSocket przyjmuje wartość INVALID_SOCKET.
  68.  
  69. iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
  70. if (iResult == SOCKET_ERROR) {
  71.    closesocket(ConnectSocket);
  72.    ConnectSocket = INVALID_SOCKET;
  73. }
  74.  
  75. //Sprawdzanie wartości w strukturze, ale także czy ConnectSocket równa się INVALID_SOCKET
  76. // jeśli tak to nie połaczono się z pocztą.
  77.  
  78. freeaddrinfo(result);
  79. //spr czy sie polaczyl
  80. if (ConnectSocket == INVALID_SOCKET) {
  81.    printf(" Nie polaczylo sie z poczta\n");
  82.    WSACleanup();
  83.    return 1;
  84. }
  85.  
  86. char recvbuf[2020] ={0};        // tablica wyzerowana przechowująca, które w późniejszym  
  87.        // toku programu zostaną wprowadzone.
  88.  
  89.    
  90. iResult=recv(ConnectSocket, recvbuf, sizeof(recvbuf),0); // uzyskanie odpowiedzi od serwera
  91. recvbuf[iResult]=0;
  92.  
  93.  
  94. //logowanie do poczty. Wysłanie loginu i otrzymanie odpowiedzi "+" gdy login będzie poprawny.
  95.  
  96.    iResult = send(ConnectSocket,"USER poczta_sieci\r\n", (int)strlen("USER poczta_sieci\r\n"), 0);
  97.    iResult = recv(ConnectSocket, recvbuf, sizeof(recvbuf), 0);    
  98.    printf("%s\n", recvbuf);
  99. if(recvbuf[0]='+')
  100.  printf("Poprawnie zweryfikowano login\n");
  101.  
  102.  
  103.  
  104. //wyslanie hasla. Tak samo jak w przypadku loginu.
  105.  
  106.    iResult = send(ConnectSocket,"PASS pocztasieci\r\n", (int)strlen("PASS pocztasieci\r\n"), 0);
  107.    iResult = recv(ConnectSocket, recvbuf, sizeof(recvbuf), 0);
  108. printf("%s\n", recvbuf);
  109. if(recvbuf[0]='+')
  110.  printf("Poprawnie zweryfikowano haslo\n");
  111.  
  112.  
  113. //STAT sprawdza ile masz wiadomosci.
  114.    iResult = send(ConnectSocket, "STAT\r\n", (int)strlen("STAT\r\n"), 0);
  115.    iResult = recv(ConnectSocket, recvbuf, sizeof(recvbuf), 0);
  116.    printf("%s\n", recvbuf);
  117.  
  118.  
  119. int ile_maili=1;        // ilość wiadomości, dla których chcemy wykonać późniejsze operacje
  120. int a=1;                // zmienna pomocnicza
  121. char tablica[40];       // tablica przechowująca informacje o numerze wiadomości
  122.  
  123. while(a<=ile_maili){   
  124. //RETR ściąga wiadomość o podanym numerze
  125. sprintf(tablica,"RETR %d\r\n",a); // scalenie polecenia z numerem wiadomości
  126.  
  127. iResult = send(ConnectSocket, tablica, (int)strlen(tablica),0);
  128. iResult = recv(ConnectSocket, recvbuf, sizeof(recvbuf), 0);
  129.  
  130. //Top Wyświetla nagłówek wiadnomości o podanym numerze
  131. sprintf(tablica,"TOP %d\r\n",a); // scalenie polecenia z numerem wiadomości
  132.  
  133.  
  134. iResult=send(ConnectSocket, tablica,(int)strlen(tablica),0);
  135. iResult=recv(ConnectSocket, recvbuf, sizeof(recvbuf),0);
  136.  
  137. // Funkcje, które pokazują określone linie
  138. wyswietlanie_linii(recvbuf, 1);
  139. wyswietlanie_linii(recvbuf, 2);
  140. wyswietlanie_linii(recvbuf, 3);
  141. wyswietlanie_linii(recvbuf, 4);
  142.  
  143. a++;
  144. }
  145. closesocket(ConnectSocket);
  146. WSACleanup;
  147. system("pause");
  148.  
  149. }
  150.  
  151.  
  152. void wyswietlanie_linii(char *wskaz, int i)
  153. {
  154.  
  155. char *poczatkowy;       // Wskaźnik na pierwszy znak danej linii
  156. char nowy[70];          // Do tej tablicy będą przypisywane dane linie wiadomości
  157. char *nowy_ciag;        // wskaźnik na tablicę nowy
  158. int koniec;             // koniec linii
  159.  
  160. // Kolejno linie, które zostaną umieszczone na ekranie
  161. if(i==1)
  162. poczatkowy=strstr(wskaz,"From");
  163. else if (i==2)
  164. poczatkowy=strstr(wskaz,"To");
  165. else if (i==3)
  166. poczatkowy=strstr(wskaz,"Subject");
  167. else if (i==4)
  168. poczatkowy=strstr(wskaz,"CC");
  169.  
  170. //Wskaźnik nowy_ciag wskazuję na peirwszy element tablicy nowy tylko jeśli
  171. // wskaźnik poczatkowy nie jest pusty
  172. if(poczatkowy!=NULL){
  173. nowy_ciag=nowy;
  174.  
  175.  
  176. int literki;  //zmienna ukrucająca zapis
  177. literki = strlen(wskaz);    //zlicza pojemność tablicy, którą wskazuje wskaźnik wskaz
  178.  
  179. //Zliczenie ilości znaków do końca linii, a potem przypisanie tej wartości
  180. // zmiennej koniec
  181. for(koniec=0;koniec<literki;koniec++){
  182. if(poczatkowy[koniec]== '\n')
  183. break;
  184. }
  185.  
  186. //wpisanie wierwsza do tablicy nowy
  187. strncpy(nowy_ciag,poczatkowy,koniec);
  188.  
  189. //wypisanie na ekran linii wiadomości
  190. for(int j=0;j<koniec;j++){
  191. printf("%c",nowy_ciag[j]);
  192. }
  193.  
  194. printf("\n");
  195. }
  196.  
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement