Czy moglby ktos sprawdzic co jest nie tak z programem. Łączy sie z serwerem, ale jak sie probuje odebrac poczte to sie wiesza. :-)
#include <windows.h>
#include <commctrl.h>
#include <stdlib.h>
#include <winsock2.h>
#include <stdio.h>
#include <direct.h>
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "WindowsApp";
bool button2aktywny=false, polaczenie=false;
HWND label1,label2,label3,edit1,edit2,edit3,status1,log,button1,button2,button3;
HWND obrys1,obrys2,obrys3,oknoWiad,listaWiad;
WNDPROC listaWiadProc;
HINSTANCE instance;
SOCKET gniazdo;
WSAData wsaData;
struct hostent *host; // informacje hosta
struct servent *serw; // informacje serwera
struct sockaddr_in server_socket;
int ilosc,numer;
char serwer[256],login[256],haslo[256],pom[20];
char buforOdp[256], buforDanych[4096], polecenie[256];
char nazwa[15];
int inicjalizuj(){
if (WSAStartup(MAKEWORD(2,0),&wsaData) !=0) return -1;
else return 0;
}
int utworzSocket(){
gniazdo=socket(PF_INET,SOCK_STREAM,0);
return (gniazdo);
}
int podlaczDoSerwera(char x[]){
int a;
host=gethostbyname(x);
serw=getservbyname("pop3","tcp");
if (host==NULL) return -1;
if (!serw) return -2;
server_socket.sin_family=host->h_addrtype;
server_socket.sin_port=serw->s_port;
memcpy((char *) &server_socket.sin_addr,(host->h_addr),host->h_length);
if (a=connect(gniazdo,(struct sockaddr*)&server_socket,sizeof(server_socket)) != 0)
return -3; else return 0;
}
int rozlacz(){
while (shutdown(gniazdo,SD_BOTH) !=0) ;
if (closesocket(gniazdo) !=0) return -1;
else return 0;
}
int posprzataj(){
if (WSACleanup() != 0) return -1;
else return 0;
}
void wyzeruj(char x[]){
for (int i=0;i<sizeof(x);i++) buforOdp[i]=0;
}
int odpowiedz(char x[]){
if (strncmp(x,"+OK",3)!=0) return -1;
else return 0;
}
int odbierzOdpSerwera(){
wyzeruj(buforOdp);
memset(buforOdp,0,sizeof(buforOdp));
if (recv(gniazdo,buforOdp,sizeof(buforOdp),0)!=SOCKET_ERROR)
return odpowiedz(buforOdp); else return -2;
}
void wyslijPolecenie(int kod,int nr){
memset(polecenie,0,sizeof(polecenie));
switch (kod) {
case 1: sprintf(polecenie,"USER %s\n",login);
break;
case 2: sprintf(polecenie,"PASS %s\n",haslo);
break;
case 3: sprintf(polecenie,"STAT\n");
break;
case 4: sprintf(polecenie,"LIST %i\n",nr);
break;
case 5: sprintf(polecenie,"DELE %i\n",nr);
break;
case 6: sprintf(polecenie,"RSET\n");
break;
case 7: sprintf(polecenie,"NOOP\n");
break;
case 8: sprintf(polecenie,"RETR %i\n",nr);
break;
case 9: sprintf(polecenie,"QUIT\n");
break;
}
send(gniazdo,polecenie,strlen(polecenie),0);
}
void pobierz(int nr){
int rozm=0,odeb=0,tmp=0;
HANDLE file;
DWORD zapisano;
sprintf(nazwa,"Wiadomosci/wiad%i.txt",nr);
file=CreateFile(nazwa,GENERIC_WRITE |GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
memset(buforOdp,0,sizeof(buforOdp));
memset(buforDanych,0,sizeof(buforDanych));
recv(gniazdo,buforOdp,sizeof(buforOdp),MSG_PEEK);
sscanf (buforOdp,"+OK %d",&rozm);
while (rozm!=odeb) {
tmp=recv(gniazdo,buforDanych,sizeof(buforDanych),0);
odeb=odeb+tmp;
WriteFile(file,buforDanych,strlen(buforDanych),&zapisano, NULL);
if (tmp<strlen(buforDanych)) break;
}
CloseHandle(file);
}
void button1action(){
if (inicjalizuj()==0) {
SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"<<< NOWE POŁĄCZENIE >>>");
if (utworzSocket()!=INVALID_SOCKET)
if (podlaczDoSerwera(serwer)==0) {
polaczenie=true;
SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Podłączono");
if (odbierzOdpSerwera()==0) {
wyslijPolecenie(1,0);
if (odbierzOdpSerwera()==0) {
wyslijPolecenie(2,0);
if (odbierzOdpSerwera()==0) {
EnableWindow(button1,false);
EnableWindow(button2,true); //uaktywnienie buttona
EnableWindow(button3,true);
button2aktywny=true;
SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Zalogowano");
} else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Podano błędne hasło");
} else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Podano błędny login");
}
} else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Podano błędną nazwę serwera");
else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Błąd tworzenia gniazda");
} else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Błąd inicjalizacji");
}
void button2action(){
LV_ITEM lvi;
wyslijPolecenie(3,0);
if (odbierzOdpSerwera()==0) {
sscanf(buforOdp,"+OK %d",&ilosc);
sprintf(pom,"Pobrano %i wiadomości.",ilosc);
SendMessage(log, LB_ADDSTRING, 0,(LPARAM)pom);
for (int x=1;x<=ilosc;x++){
wyslijPolecenie(4,x);
if (odbierzOdpSerwera()==0) {
wyslijPolecenie(8,x);
pobierz(x);
sprintf(pom,"Wiadomość %i",x);
lvi.iSubItem=0;
lvi.pszText=pom;
SendMessage(listaWiad,LVM_INSERTITEM,0,(LPARAM)&lvi);
SendMessage(listaWiad,LVM_SETITEMTEXT ,0,(LPARAM)&lvi);
sprintf(pom,"%i",x);
lvi.iSubItem=1;
lvi.pszText=pom;
SendMessage(listaWiad,LVM_SETITEMTEXT ,0,(LPARAM)&lvi);
wyslijPolecenie(7,0);
if (odbierzOdpSerwera()==0) {
EnableWindow(button2,false);
} else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"blad noop-a");
} else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"blad list-a");
}
} else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"blad stat-a");
}
void button3action(){
wyslijPolecenie(9,0);
if (odbierzOdpSerwera()==0)
if (rozlacz()==0)
if (posprzataj()==0) {
EnableWindow(button1,true);
EnableWindow(button2,false);
EnableWindow(button3,false);
button2aktywny=false;
polaczenie=false;
SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Rozłączono i zamknięto sesję");
} else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Błąd wsacleanup");
else SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Nie mozna zamknac gniazda");
else {SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"Błąd wylogowania");
SendMessage(log, LB_ADDSTRING, 0,(LPARAM)buforOdp);}
}
int utworz_kat(){
HANDLE plik1;
if( _mkdir( "Wiadomosci" ) == 0 ){
SendMessage(log, LB_ADDSTRING, 0,(LPARAM)"kat utworzony");
plik1=CreateFile("Wiadomosci/config.txt",GENERIC_WRITE |GENERIC_READ,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
CloseHandle(plik1);
}
}
void WczytajZPliku(int nr){
HANDLE file;
DWORD odczytano=0,x=0;
sprintf(pom,"Wiadomosci/wiad%i.txt",nr);
file=CreateFile(pom,GENERIC_WRITE |GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
x=SetFilePointer(file,0,NULL,FILE_END);
char b[x];
SetFilePointer(file,0,NULL,FILE_BEGIN);
ReadFile(file,b,sizeof(b),&odczytano,NULL);
SendMessage(oknoWiad, WM_SETTEXT, 0,(LPARAM)b);
CloseHandle(file);
}
LRESULT CALLBACK WyborWiadomosci (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_LBUTTONDBLCLK :
int i=0,a=0;
char tmp[64];
LV_ITEM lvi;
i=SendMessage(hwnd, LVM_GETNEXTITEM ,(WPARAM) -1,LVNI_FOCUSED);
WczytajZPliku(++i);
break;
}
return CallWindowProc(listaWiadProc, hwnd, message, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
instance = hThisInstance;
HWND hwnd;
MSG messages;
WNDCLASSEX wincl;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl))
return 0;
hwnd = CreateWindowEx (
0,
szClassName,
"Klient POP3 by: Bartosz Jackowski, Dariusz Kamiński",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
800,
600,
HWND_DESKTOP,
NULL,
hThisInstance,
NULL
);
ShowWindow (hwnd, nFunsterStil);
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_CREATE: //Utworzenie okna, pol, batonow i labelow
label1 = CreateWindowEx(0,"STATIC", "Serwer :", WS_CHILD | WS_VISIBLE, 10,10,60,25, hwnd, 0,0, NULL);
label2 = CreateWindowEx(0,"STATIC", "Login :", WS_CHILD | WS_VISIBLE, 10,40,60,25, hwnd, 0,0, NULL);
label3 = CreateWindowEx(0,"STATIC", "Hasło :", WS_CHILD | WS_VISIBLE, 10,70,60,25, hwnd, 0,0, NULL);
edit1 = CreateWindowEx(WS_EX_CLIENTEDGE ,"EDIT", "", WS_CHILD | WS_VISIBLE, 70,10,300,22, hwnd, 0,0, NULL);
edit2 = CreateWindowEx(WS_EX_CLIENTEDGE ,"EDIT", "", WS_CHILD | WS_VISIBLE, 70,40,300,22, hwnd, 0,0, NULL);
edit3 = CreateWindowEx(WS_EX_CLIENTEDGE ,"EDIT", "", ES_PASSWORD |WS_CHILD | WS_VISIBLE, 70,70,300,22, hwnd, 0,0, NULL);
button1 = CreateWindowEx(0,"BUTTON", "Połącz", WS_CHILD | WS_VISIBLE, 390,10,150,25, hwnd, 0,0, NULL);
button2 = CreateWindowEx(0,"BUTTON", "Odbierz pocztę", WS_CHILD | WS_VISIBLE | WS_DISABLED, 390,40,150,25, hwnd, 0,0, NULL);
button3 = CreateWindowEx(0,"BUTTON", "Rozłącz", WS_CHILD | WS_VISIBLE | WS_DISABLED, 390,70,150,25, hwnd, 0,0, NULL);
InitCommonControls();
//listaWiad = CreateWindowEx(WS_EX_CLIENTEDGE ,"EDIT", "", ES_MULTILINE |WS_VSCROLL | WS_HSCROLL |WS_CHILD | WS_VISIBLE, 20,150,260,160, hwnd, 0,0, NULL);
oknoWiad = CreateWindowEx(WS_EX_CLIENTEDGE ,"EDIT", "", ES_MULTILINE |WS_VSCROLL | WS_HSCROLL |WS_CHILD | WS_VISIBLE, 330,150,440,360, hwnd, 0,0, NULL);
log = CreateWindowEx(WS_EX_CLIENTEDGE,"LISTBOX", 0, WS_VSCROLL | WS_HSCROLL | WS_CHILD | WS_VISIBLE, 20,360,260,160, hwnd, 0,0, NULL);
obrys1 = CreateWindowEx(0,"BUTTON", "Lista Wiadomości", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10,130,280,190, hwnd, 0,0, NULL);
obrys2 = CreateWindowEx(0,"BUTTON", "Treść Wiadomości", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 320,130,460,390, hwnd, 0,0, NULL);
obrys3 = CreateWindowEx(0,"BUTTON", "LOG", WS_CHILD | WS_VISIBLE | BS_GROUPBOX , 10,340,280,180, hwnd, 0,0, NULL);
listaWiad= CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW,
NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT,
20,150,260,160, hwnd, NULL, instance, NULL);
listaWiadProc=(WNDPROC) SetWindowLong(listaWiad,GWL_WNDPROC,(DWORD)WyborWiadomosci);
LV_COLUMN lvc;
lvc.mask = LVIF_IMAGE | LVCF_TEXT ;
lvc.fmt = LVCFMT_LEFT;
lvc.cx = 150;
lvc.pszText = "Wiadomosc";
ListView_InsertColumn(listaWiad, 0, &lvc);
lvc.cx = 100;
lvc.pszText = "Numer";
ListView_InsertColumn(listaWiad, 1, &lvc);
utworz_kat();
break;
case WM_SIZE:
MoveWindow(status1,0,HIWORD(lParam)-50,LOWORD(lParam),50,TRUE);
break;
case WM_COMMAND:
if ((HWND)lParam == button1){
// sprawdzenie czy sa podane dane
SendMessage(edit1, WM_GETTEXT, 256,(LPARAM)serwer);
SendMessage(edit2, WM_GETTEXT, 256,(LPARAM)login);
SendMessage(edit3, WM_GETTEXT, 256,(LPARAM)haslo);
if (strcmp(serwer,"")==0){
MessageBox(0,"Wpisz serwer.","Blad",MB_OK);
break;
}
if (strcmp(login,"")==0){
MessageBox(0,"Wpisz login.","Blad",MB_OK);
break;
}
if (strcmp(haslo,"")==0){
MessageBox(0,"Wpisz haslo.","Blad",MB_OK);
break;
}
MessageBox(0,"Trwa logowanie.\nProsze być cierpliwym :P","Uwaga!",MB_OK|MB_ICONINFORMATION);
button1action();
}
if ((HWND)lParam == button2){
MessageBox(0,"Trwa pobieranie wiadomości.\nTrzeba jeszcze więcej cierpliwości :P","Uwaga!",MB_OK|MB_ICONINFORMATION);
button2action();
}
if ((HWND)lParam == button3){
MessageBox(0,"Dziekujemy za skorzystanie\n z naszego programu.","Uwaga!",MB_OK|MB_ICONINFORMATION);
button3action();
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}