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. |
|
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ą...
Kurs WinSock, C++ |
|
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 |
|
npHard |
» 2011-11-20 11:52:19 |
|
pekfos |
» 2011-11-20 11:54:22 w Windowsie też są rury (pipe) :P |
|
Marys Temat założony przez niniejszego użytkownika |
» 2011-11-20 12:32:52 Czyli krótko mówiąc, proponujecie sieć |
|
m4tx |
» 2011-11-20 13:44:59 DBus :) |
|
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:
#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 ); };
#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" ); } } } } } } } } } 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; } } #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. |
|
« 1 » |