Forum: Server/klient ihopkoppling via winsock

Forum huvudsida -> Programmering -> Server/klient ihopkoppling via winsock

Sidor: 1

Till botten

2ndchallenge 14:07 - 30:e Januari 2007 | Post #1
Medlem
Inlägg: 4


Skicka PM
Hej jag min polare har precis fått en uppgift att med hjälp av två nästan fullständiga program få det ena som är en klient att ansluta till det andra som agerar server. Skulle någon kanske kunna kolla igenom dessa program och ge oss synpunkter då vi helt kört fast.

Klienten:


#define WIN32_LEAN_AND_MEAN
#pragma comment(lib, "wsock32.lib") // eller obs komm ihåg att länka wsock32.lib
#include <windows.h>
#include <winsock2.h>
#include <iostream>
using namespace std;

int main()
{
char szSmtpServerName[64] = "";
char szToAddr[64] = "";
char szFromAddr[64] = "";
char TextIn[4096] = "";
char szLine[255] = "";
char TextOut[255] = "";
SOCKET hServer;
WSADATA WSData;
LPHOSTENT lpHostEntry;
SOCKADDR_IN SockAddr;


cout << "Server namn :" ;
cin >> TextIn;
strcpy (szSmtpServerName,TextIn);
int port;
cout << "Port :" ;
cin >> port;



// Initiera WinSock (1.1 eller senare)
if(WSAStartup(MAKEWORD(1, 1), &WSData))
{
cout << "Kan inte hitta v" << 1 << "." << 1 << " eller senare!" << endl;
return 1;
}

    //hämta eget namn
    char namn[25];
    gethostname(namn, sizeof(namn));
    cout << namn;

    // visa egen IP adress
PHOSTENT hostinfo;
    hostinfo = gethostbyname(namn);
    cout << endl << inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list) << endl;



// hämta serverns IP adress.
lpHostEntry = gethostbyname(szSmtpServerName);
if(!lpHostEntry)
{
cout << "Kan inte hitta servern : " << szSmtpServerName << endl;
return 1;
}

// Skapa TCP/IP sockeln
hServer = socket(PF_INET, SOCK_STREAM, 0);
if(hServer == INVALID_SOCKET)
{
cout << "Kan inte öppna mail server sockeln" << endl;
return 1;
}

// Skapa Sockel Adress struktur
SockAddr.sin_family = AF_INET;
SockAddr.sin_port = htons(port);
SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);

// Ansluta till sockeln
if(connect(hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
{
cout << "Fel med anslutning till Server sockeln" << endl;
return 1;
}


char Text[255];
while (1)
{
    recv(hServer, TextIn, sizeof(TextIn), 0);
    cout << endl << TextIn << endl;
    cout << endl << "Skicka : ";
    cin >> Text;
    send(hServer, Text, strlen(Text), 0);
    strcpy(Text," ");
    strcpy(TextIn," ");
}
closesocket(hServer);

WSACleanup();
system ("pause");
return 0;
} [SOURCE=cpp][/SOURCE][B][/B]


Servern:


#define WIN32_LEAN_AND_MEAN // obs komm ihåg att länka wsock32.lib

#include <windows.h>
#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "wsock32.lib")
using namespace std;

int MAX_CONNECTS=5, PORT=1234,SO_MAXCONN=5, ClientID;
bool ThreadInit = false;
struct CLIENTS {
bool InUse;
SOCKET ClientSocket;
sockaddr_in ClientAddress;
DWORD* dwThreadID;
HANDLE hThreadID;
};
SOCKET SinkSocket;
sockaddr_in SinkSockAddr;
CLIENTS Clients[ 5 ];
SOCKET ListeningSocket;
sockaddr_in Address;

HRESULT InitWinSock( );
HRESULT StartClientThread( );
DWORD WINAPI ClientThreadEntry( LPVOID Arg1 );
main()
{
    InitWinSock();
    ListeningSocket = socket( AF_INET, SOCK_STREAM, 0 );

    Address.sin_family = AF_INET;
    Address.sin_port = htons( PORT );
    Address.sin_addr.s_addr = htonl( INADDR_ANY );

    bind( ListeningSocket, (LPSOCKADDR)&Address, sizeof(Address));

    listen( ListeningSocket, SO_MAXCONN );

StartClientThread( );
Clients[ClientID].hThreadID = CreateThread( NULL, 0, &ClientThreadEntry, 0, 0, Clients[ClientID].dwThreadID );


return 0;
}


HRESULT InitWinSock( )
{
     WSADATA wsad;

     for( int i = 0; i < MAX_CONNECTS; i++ )
     {
        Clients[i].InUse = false;
     }

     WSAStartup( MAKEWORD( 2, 2 ), &wsad );

     return S_OK;
}
HRESULT StartClientThread( ){
// NO ONE ELSE CAN CONNECT UNTIL THIS THREAD IS READY
ThreadInit = true;

for( int i = 0; i < 5; i++ ){
if( Clients[i].InUse == true ){
ClientID = i;
break;
    }
}
return 0;
}

DWORD WINAPI ClientThreadEntry( LPVOID Arg1 ){
int ClientNo = ClientID;
CLIENTS *Client = &Clients[ ClientID ];


Client->InUse = true;

// MOVE THE SOCKET INFORMATION FROM SOCK A TO SOCKET B
memcpy( &Client->ClientSocket, &SinkSocket, sizeof( SinkSocket ));
memcpy( &Client->ClientAddress, &SinkSockAddr, sizeof( SinkSockAddr ));

// DONE .. CONTINUE NORMAL EXECUTION IN THE PARENT THREAD
ThreadInit = false;
        

return 0;
}

//Vi har fått klienten att fungera i sig men inte att få den att ansluta tillservern. Väldigt tacksam för svar

// Jonas

-------------------------
Ingen signatur!



Nissebosselasse 14:32 - 30:e Januari 2007 | Post #2
Medlem
Inlägg: 490


Skicka PM
Du kommer nog inte få snabbare svar för att du postar samma fråga med olika ämnesrader flera gånger....

-------------------------
http://pushingcows.se
Gula Nallen



2ndchallenge 15:15 - 30:e Januari 2007 | Post #3
Medlem
Inlägg: 4


Skicka PM
sorry.. fick felmeddelande när jag skulle posta så jag trodde att de inte fungerade

-------------------------
Ingen signatur!



Slash 18:40 - 30:e Januari 2007 | Post #4
Medlem
Inlägg: 141


Skicka PM
Hej,
först, ett tips, för att någon ska hjälpa dig måste du först hjälpa dem. Det kan innebära att du postar indenterad kod (med hjälp av lämplig tag) och dessutom förklarar vad programmet ska göra och vad det istället gör. På detta vis kan du öka dina chanser att någon kan hjälpa dig.

Så om du kan göra det så lovar jag att kolla på ditt program. Tack!

-------------------------
Ingen sigantur!



Sidor: 1

Forum huvudsida -> Programmering -> Server/klient ihopkoppling via winsock
Atom feed

Du får inte posta i den här tråden | Till toppen