Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Komunikacja programów

Ostatnio zmodyfikowano 2011-12-02 03:28
Autor Wiadomość
Marys
Temat założony przez niniejszego użytkownika
Komunikacja programów
» 2011-11-19 22:25:45
Witam,
muszę napisać programiki, które będą między sobą wymieniać dane. Pytanie, jak to zrobić? Baza danych, sieć, plik...? Projekt zakłada 2 programy które zgłaszają odpowiedzi do trzeciego, a ten trzeci sprawdza odpowiedź i wydaje decyzje.
P-44368
DejaVu
» 2011-11-19 23:14:48
Masz napisać program i nie wiesz czego użyć? Chyba takie rzeczy na wykładach Ci omawiali skoro ich wymagają...

» KursyKurs WinSock, C++ kurs
P-44369
Marys
Temat założony przez niniejszego użytkownika
» 2011-11-19 23:32:55
No akurat tu chodzi o rozwiązanie problemu, a wybrali sobie C++ i nie wiem za bardzo jak zrobić to tak, żeby programy się komunikowały
P-44371
npHard
» 2011-11-20 11:52:19
Jaki system? Jest kilka sposobów. Najprościej chyba używając socketów. W linuksie można skorzystać z mechanizmu zwanego potokiem(pipe).
http://www.cs.fredonia.edu/zubairi/s2k2/csit431/pipes.html
P-44378
pekfos
» 2011-11-20 11:54:22
w Windowsie też są rury (pipe) :P
P-44379
Marys
Temat założony przez niniejszego użytkownika
» 2011-11-20 12:32:52
Czyli krótko mówiąc, proponujecie sieć
P-44381
m4tx
» 2011-11-20 13:44:59
DBus :)
P-44382
Marys
Temat założony przez niniejszego użytkownika
» 2011-12-02 03:28:32
Dobra zrobiłem sobie serwer - klient i działa. Teraz chciałem skorzystać z możliwości podłączenia dwóch klientów i skorzystałem z funkcji select() opisanej na tej stronie. Wszytko fajnie, tylko serwer po starcie klienta się wyłącza :/ Nie wiem, może pokaże co dotychczas mam:
C/C++
//ArbiterSocket.h

#pragma once
#include <iostream>
#include <WinSock2.h>
#include <vector>

using namespace std;

class Socket
{
protected:
    WSADATA wsaData;
    SOCKET mySocket;
    SOCKET myBackup;
    SOCKET acceptSocket;
    sockaddr_in myAddress;
    fd_set master;
    fd_set read_fds;
    int fdmax;
    char buf[ 256 ];
    int nbytes;
    int addrlen;
    int i, j;
    struct sockaddr_in remoteaddr;
    int newfd;
public:
    Socket();
    ~Socket();
    bool SendData( char * );
    bool ReceiveData( char *, int );
    void CloseConnection();
   
   
};

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

C/C++
#include "ArbiterSocket.h"

Socket::Socket()
{
    if( WSAStartup( MAKEWORD( 2, 2 ), & wsaData ) != NO_ERROR )
    {
        cout << "Error with WSAStartup" << endl;
        WSACleanup();
        exit( 10 );
    }
   
    mySocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
   
    if( mySocket == INVALID_SOCKET )
    {
        cout << "Error creating socket" << endl;
        WSACleanup();
        exit( 11 );
    }
   
    myBackup = mySocket;
   
   
   
}

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

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

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

void Socket::CloseConnection()
{
    closesocket( mySocket );
    mySocket = myBackup;
}
void ServerSocket::Listen()
{
   
   
    FD_ZERO( & master );
    FD_ZERO( & read_fds );
    FD_SET( mySocket, & master );
    fdmax = mySocket;
    acceptSocket = SOCKET_ERROR;
    while( acceptSocket == SOCKET_ERROR )
    {
        read_fds = master;
        if( select( fdmax + 1, & read_fds, NULL, NULL, NULL ) == - 1 ) {
            perror( "select" );
            exit( 1 );
        }
       
        for( i = 0; i <= fdmax; i++ ) {
            if( FD_ISSET( i, & read_fds ) ) {
                if( i == mySocket ) {
                    addrlen = sizeof( remoteaddr );
                    if(( newfd == accept( mySocket, NULL, NULL ) ) == - 1 ) {
                        perror( "accept" );
                    } else {
                        FD_SET( newfd, & master );
                        if( newfd > fdmax ) {
                            fdmax = newfd;
                        }
                        printf( "selectserver: new connection from %s on"
                        "socket %d\n", inet_ntoa( remoteaddr.sin_addr ), newfd );
                    }
                } else {
                    if(( nbytes = ReceiveData( buf, sizeof( buf ) ) ) <= 0 ) {
                        if( nbytes == 0 ) {
                            printf( "selectserver: socket %d hung up\n", i );
                        } else {
                            perror( "recv" );
                        }
                        closesocket( i );
                        FD_CLR( i, & master );
                    } else {
                        for( j = 0; j <= fdmax; j++ ) {
                            if( FD_ISSET( j, & master ) ) {
                                if( j != mySocket && j != i ) {
                                    if( send( j, buf, nbytes, 0 ) == - 1 ) {
                                        perror( "send" );
                                    }
                                }
                            }
                        }
                    }
                }
               
            }
            //acceptSocket = accept(myBackup, NULL, NULL);
        }
    }
    mySocket = acceptSocket;
}

void ServerSocket::StartHosting( int port )
{
    myAddress.sin_family = AF_INET;
    myAddress.sin_addr.s_addr = inet_addr( "0.0.0.0" );
    myAddress.sin_port = htons( port );
   
    if( bind( mySocket,( SOCKADDR * ) & myAddress, sizeof( myAddress ) ) == SOCKET_ERROR )
    {
        cout << "Failed to connection" << endl;
        WSACleanup();
        exit( 14 );
    }
   
    if( listen( mySocket, 1 ) == SOCKET_ERROR )
    {
        cout << "Error listening on socket" << endl;
    }
   
}

C/C++
#include <iostream>
#include "ArbiterSocket.h"

using namespace std;

const int STRLEN = 256;
int maxClients = FD_SETSIZE;

int main()
{
    int choice;
    int port = 1313;
    char * ipAddress = "127.0.0.1";
    char recMessage[ STRLEN ];
    char sendMessage[ STRLEN ];
    bool done = false;
   
   
   
    ServerSocket sockServer;
    cout << "HOSTING..." << endl;
    sockServer.StartHosting( port );
    sockServer.Listen();
    while( !done )
    {
        cout << "waiting for message..." << endl;
        sockServer.ReceiveData( recMessage, STRLEN );
        cout << "Client>" << recMessage << endl;
        cout << "\nEnter message..." << endl;
        cin >> sendMessage;
        cout << "Server>" << sendMessage << endl;
        sockServer.SendData( sendMessage );
        cout << "message sent" << endl;
        if( strcmp( recMessage, "end" ) == 0 || strcmp( sendMessage, "end" ) == 0 )
        {
            done = true;
        }
    }
   
    return 0;
}
Pewnie jakiś głupi błąd, którego nie zauważyłem, albo coś pomyliłem w obiektówce.
P-45051
« 1 »
  Strona 1 z 1