program "chat" w lanie

0

Witam. Jak można napisać taki program typu chat?? Chciałbym coś takiego napisać w C++. Mogło by to działać tylko na 2 PC w sieci LAN. Możecie mi coś podpowiedzieć jak to zrobić?? jest to trudne?(mam nawet duże pojęcie o c++ winapi).pozdrawiam.

0

słowo klucz: sockety

0

Jeśli to ma być prosta wymiana komunikatów to jest to raczej proste. Wystarczy że opanujesz
socket(), bind(), sendto() / send(), recvfrom() / recv() (+ ewentualnie listen(), connect(), accept() w zależności od tego czy chcesz mieć tryb bezpołączeniowy czy połączeniowy).

0

Chciałbym Aby to było w jak najprostszej postaci w sieci przewodowej. Pozdrawiam.

0

Rozumiem że liczysz na przykładowe kody? ;]
http://student.agh.edu.pl/~pstanisl/sockety.TXT
tu masz referat na temat socketów (mam nadzieję ze autor sie nie obrazi :) ) wraz z przykładowymi kodami do niego.

0

A mogę pisać to w kompilatorze Dev c++ czy potrzeba jakiś inny??

0

Teoretycznie możesz, ale polecam użyc czegoś nowszego. Poza tym link który podałem mówi o socketach pod unixy (chociaż różnice są niewielkie).

0

Mam nadizeję zę pod windows będzie działać bez zmian w kodzie. pozdrawiam.

0
:: napisał(a)

Mam nadizeję zę pod windows będzie działać bez zmian w kodzie. pozdrawiam.

Nie, nie bedzie dzialac bez zmian w kodzie. Trzeba sie troche wysilic i poszukac roznic, a jak bedzie problem zglosic sie na forum.
Mniej wiecej takie cos dochodzi i inkludy sa inne:

#include <winsock2.h>
#include <windows.h>

int main(void)
{
   WSADATA wsaData;
   SOCKET sock;
 
   if(!WSAStartup(MAKEWORD(2,0), &wsadata)) { printf("error\n"); }

  
   return 0;
}

Po tym mozesz sobie uzywac juz tych funkcji uniksowych oraz nalezy pamietac o podlinkowaniu ws2_32.lib

0

mała uwaga Dev C++ to nie kompilator

A mogę pisać to w kompilatorze Dev c++ czy potrzeba jakiś inny??
tylko IDE

0

Mam taki programik

Main.cpp
#include <iostream>
#include "Socket.h"

using namespace std;

int main()
{
    int choice;
    int port = 666;
    //char *ipAddress = "127.0.0.1";
    string ipAddress;
    bool done = false;
    char recMessage[STRLEN];
    char sendMessage[STRLEN];
    cout<<"\t\t1)  server"<<endl;
    cout<<"\t\t2) dolocz"<<endl;
    cout<<"\t\t3) spier"<<endl;
    cin>>choice;
    if ( choice == 3 )
        exit(0);
    else if ( choice == 2 )
    {
        //Client
        cout<<"wpiszIP adres, 127.0.0.1"<<endl;
        cin>>ipAddress;
        ClientSocket sockClient;
        cout<<"loczenie.."<<endl;
        sockClient.ConnectToServer( ipAddress.c_str(), port );
        //Connected
        while ( !done )
        {     
            sockClient.GetAndSendMessage();
            cout<<"\t--czekaj--"<<endl;
            sockClient.RecvData( recMessage, STRLEN );
            cout<<"ja > "<<recMessage<<endl;
            if ( strcmp( recMessage, "end" ) == 0 ||
                        strcmp( sendMessage, "end" ) == 0 )
            {
                done = true;
            }
        }
        sockClient.CloseConnection();
    }
    else if ( choice == 1 )
    {
        //SERVER
        ServerSocket sockServer;
        cout<<"czekajnahostq..."<<endl;
        sockServer.StartHosting( port );
        //Connected
        while ( !done )
        {
            cout<<"\t--czekaj--";
            sockServer.RecvData( recMessage, STRLEN );
            cout<<"on > "<<recMessage<<endl;
            sockServer.GetAndSendMessage();
            if ( strcmp( recMessage, "end" ) == 0 ||
                    strcmp( sendMessage, "end" ) == 0 )
            {
                done = true;
            }
        }
    }
}










Socket.cpp
#include "Socket.h"

Socket::Socket()
{
    if( WSAStartup( MAKEWORD(2, 2), &wsaData ) != NO_ERROR )
    {
        cerr<<"error\n";
        system("pause");
        WSACleanup();
        exit(10);
    }

    //Create a socket
    mySocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( mySocket == INVALID_SOCKET )
    {
        cerr<<"Srrror"<<endl;
        system("pause");
        WSACleanup();
        exit(11);
    }

    myBackup = mySocket;
}

Socket::~Socket()
{
    WSACleanup();
}

bool Socket::SendData( char *buffer )
{
    send( mySocket, buffer, strlen( buffer ), 0 );
    return true;
}

bool Socket::RecvData( char *buffer, int size )
{
    int i = recv( mySocket, buffer, size, 0 );
    buffer[i] = '\0';
    return true;
}

void Socket::CloseConnection()
{
    //cout<<"CLOSE CONNECTION"<<endl;
    closesocket( mySocket );
    mySocket = myBackup;
}

void Socket::GetAndSendMessage()
{
    char message[STRLEN];
    cin.ignore();//without this, it gets the return char from the last cin and ignores the following one!
    cout<<"psz > ";
    cin.get( message, STRLEN );
    SendData( message );
}

void ServerSocket::StartHosting( int port )
{
     Bind( port );
     Listen();
}

void ServerSocket::Listen()
{
    //cout<<"LISTEN FOR CLIENT..."<<endl;
    
    if ( listen ( mySocket, 1 ) == SOCKET_ERROR )
    {
        cerr<<"error\n";
        system("pause");
        WSACleanup();
        exit(15);
    }
    
    //cout<<"ACCEPT CONNECTION..."<<endl;
    
    acceptSocket = accept( myBackup, NULL, NULL );
    while ( acceptSocket == SOCKET_ERROR )
    {
        acceptSocket = accept( myBackup, NULL, NULL );
    }
    mySocket = acceptSocket;
}

void ServerSocket::Bind( int port )
{
    myAddress.sin_family = AF_INET;
    myAddress.sin_addr.s_addr = inet_addr( "0.0.0.0" );
    myAddress.sin_port = htons( port );
    
    //cout<<"BIND TO PORT "<<port<<endl;

    if ( bind ( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress) ) == SOCKET_ERROR )
    {
        cerr<<"error\n";
        system("pause");
        WSACleanup();
        exit(14);
    }
}

void ClientSocket::ConnectToServer( const char *ipAddress, int port )
{
    myAddress.sin_family = AF_INET;
    myAddress.sin_addr.s_addr = inet_addr( ipAddress );
    myAddress.sin_port = htons( port );
    
    //cout<<"CONNECTED"<<endl;

    if ( connect( mySocket, (SOCKADDR*) &myAddress, sizeof( myAddress ) ) == SOCKET_ERROR )
    {
        cerr<<"error klient\n";
        system("pause");
        WSACleanup();
        exit(13);
    } 
}








Socket.h
#pragma once
#include <iostream>
#include "WinSock2.h"

using namespace std;

const int STRLEN = 256;

class Socket
{
    protected:
        WSADATA wsaData;
        SOCKET mySocket;
        SOCKET myBackup;
        SOCKET acceptSocket;
        sockaddr_in myAddress;
    public:
        Socket();
        ~Socket();
        bool SendData( char* );
        bool RecvData( char*, int );
        void CloseConnection();
        void GetAndSendMessage();
};

class ServerSocket : public Socket
{
    public:
        void Listen();
        void Bind( int port );
        void StartHosting( int port );
};

class ClientSocket : public Socket
{
    public:
        void ConnectToServer( const char *ipAddress, int port );
};












Działa:) ale czy możecie mi przetłumaczyć troszkę w miarę możliwośći? dokładniej do socketów zbliżę się jutro pozdrawia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1