PDA

View Full Version : connessioni client/server [c++]


illy
05-10-2005, 11:50
sto cercanto di creare 2 programmi(un cliente e un server) in grado di collegarsi tra loro e scambiarsi informazioni ma sono rimasta un pò bloccata:

codice server:

#include <stdio.h>
#include <stdlib.h>
#include <afxsock.h>


void main ()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
// Tell the user that we could not find a usable
// WinSock DLL.
return;
}

SOCKET srvsock = socket (AF_INET, SOCK_STREAM, 0);
sockaddr_in SrvSAddr, ConnectAddr;
SrvSAddr.sin_family = AF_INET;
SrvSAddr.sin_addr.s_addr = htonl (INADDR_ANY);
SrvSAddr.sin_port = htons (7000);
bind (srvsock, (sockaddr*)&SrvSAddr, sizeof (SrvSAddr));
listen(srvsock,5);


//ciclo di attesa per ricevere una connesione(aspetta in eterno)
while (1)
{
int Addrlen = sizeof(ConnectAddr);
SOCKET newsock = accept (srvsock, (sockaddr*)& ConnectAddr, &Addrlen); //riceve la connesione

HANDLE connesso;
CreateThread(NULL,NULL,connesso,&newsock,0,0); // connesso = nuovo Thread

recv(socket,char *buff,50,0); // Và nel thread e riceve i dati dal "Client"

}
closesocket(srvsock);


}






questo invece è il codice a cui per ora sono arrivata del client(questo è proprio trascurato):

#include <stdio.h>
#include <stdlib.h>
#include <afxsock.h>


void main ()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
// Tell the user that we could not find a usable
// WinSock DLL.
return;
}

SOCKET Socket = socket(AF_INET, SOCK_STREAM,0);
sockaddr_in ClientSocket;
ClientSocket.sin_addr.s_addr = inet_addr ("192.168.255.11");
ClientSocket.sin_port = htons (7000);
connect(Socket, (sockaddr*)& Socket, sizeof(Socket) );

printf("Connessione stabilita");
closesocket(Socket);


}

cionci
05-10-2005, 12:33
Per provare se il server funziona connettiti con telnet all'indirizzo (tutti i locali a quanto sembra) e alla porta che usi nel codice...

cionci
05-10-2005, 12:34
recv(socket,char *buff,50,0); // Và nel thread e riceve i dati dal "Client"

Questa istruzione non è corretta... buff va anche allocato...

illy
06-10-2005, 07:54
ok grazie, :) questo è il codice del server modificato:

#include <stdio.h>
#include <afx.h>
#include <winbase.h>
#include <winsock.h>
#include <afxsock.h>

char buff[512];

DWORD WINAPI connect(LPVOID newsock)
{
SOCKET *newsock2 = (SOCKET*)newsock;
recv(*newsock2,buff,sizeof(buff),0); // Và nel thread e riceve i dati dal "Client"
printf("%s",buff);
return 0;
}

void main ()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
// Tell the user that we could not find a usable
// WinSock DLL.
return;
}

SOCKET srvsock = socket (AF_INET, SOCK_STREAM, 0);
sockaddr_in SrvSAddr, ConnectAddr;
SrvSAddr.sin_family = AF_INET;
SrvSAddr.sin_addr.s_addr = htonl (INADDR_ANY);
SrvSAddr.sin_port = htons (7000);
bind (srvsock, (sockaddr*)&SrvSAddr, sizeof (SrvSAddr));
listen(srvsock,5);

HANDLE connesso;

//ciclo di attesa per ricevere una connesione(aspetta in eterno)
while (1)
{
int Addrlen = sizeof(ConnectAddr);
SOCKET newsock = accept (srvsock, (sockaddr*)& ConnectAddr, &Addrlen); //riceve la connesione

connesso = CreateThread(NULL,NULL,connect,&newsock,0,0); // connesso = nuovo Thread



}
closesocket(srvsock);


}




e ora? :rolleyes:

cionci
06-10-2005, 09:02
Hai provato con il telent per vedere se funziona ? Puoi benissimo usare un debugger per vedere cosa avviene passo passo nel codice... Da una parte il debugger ti si ferma sulla accept...eppena avvii una connessione con telnet in questo modo:

telnet 127.0.0.1 7000

A questo punto il debugger va oltre la accept e vedi eventualmente dove sta il problema...

illy
12-10-2005, 11:12
è che mancano proprio delle parti sulla comunicazine, manca il therad e non so come farlo(utilizarlo) proprio a livello di codice

illy
20-10-2005, 07:20
//Server

#include <stdio.h>
#include <afx.h>
#include <winbase.h>
#include <winsock.h>
#include <afxsock.h>

char buffD[512]= "Disconnesso";
char buffC[512]= "Connesso";

DWORD WINAPI connect(LPVOID newsock)
{
char buffer[512];
int i, ch;

SOCKET *NewSock=(SOCKET*)newsock;
while(strcmp(buffer,"Esc")!=0)
{
recv(*NewSock,buffC,512,0);
if(strcmp(buffC,"Esc")==0)
{
printf("Disconnessione avvvenuta\n");
system("cls");
return 0;
}
printf( "Client:\n%s\n",buffC );
for( i = 0; (i < 80) && ((ch = getchar()) != EOF) && (ch != '\n');i++ )
buffer[i] = (char)ch;
buffer[i] = '\0';
send(*NewSock,buffer,sizeof(buffer),0);
}
printf("Disconnessione avvvenuta\n");
return 0;
}





void main ()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
// Tell the user that we could not find a usable
// WinSock DLL.
return;
}

SOCKET srvsock = socket (AF_INET, SOCK_STREAM, 0);
sockaddr_in SrvSAddr, ConnectAddr;
SrvSAddr.sin_family = AF_INET;
SrvSAddr.sin_addr.s_addr = htonl (INADDR_ANY);
SrvSAddr.sin_port = htons (7000);

if(bind (srvsock, (sockaddr*)&SrvSAddr, sizeof (SrvSAddr))== SOCKET_ERROR)
printf("\nbind fallito");

if(listen(srvsock,5) == SOCKET_ERROR)
printf("\nlisten falito");

int Addrlen = sizeof(ConnectAddr);

HANDLE connesso;

//ciclo di attesa per ricevere una connesione(aspetta in eterno)
while (1)
{

SOCKET newsock = accept (srvsock, (struct sockaddr*)& ConnectAddr, &Addrlen); //riceve la connesione

send(newsock,buffC,sizeof(buffC),0);

connesso = CreateThread(NULL,NULL,connect,&newsock,0,0); // connesso = nuovo Thread

CloseHandle(connesso);

}
closesocket(srvsock);
}



:( Qualche altro suggerimento o un aiuto nel commento? :read:

cionci
20-10-2005, 09:52
Ma ora il problema dove sta ?