void fakempi_connect( sFakeMPI* fakempi ) { /* *親ノードなら */ if ( fakempi->myrank == 0 ){ /* *socketをnprocs-1だけ開く。ポートが重複しないようにするには、あらかじめそのポートが使えるかどうかを調べておいた方がよかろう。 */ int i; for( i=1; i<fakempi->nprocs; i++ ){ fakempi->socks[i] = listen_socket( i + fakempi->portbase ); } fprintf( fakempi_verbose, "Parent is listening.\n" ); for( i=1; i<fakempi->nprocs; i++ ){ fakempi->msgsocks[i] = accept_child( fakempi->socks[i] ); } } else{ /* *親のソケットに接続する。 */ sleep( 0 ); fakempi->mysock = get_connected( fakempi->myrank + fakempi->portbase ); fprintf( fakempi_verbose, "Child %d is get connected.( socket %d ) \n", fakempi->myrank, fakempi->mysock ); } }
int main(int argc, char** argv) { struct configuration cfg; int parent, sock, got; unsigned int pkt_num = 0; parse_options(argc, argv, &cfg); /* Initialise */ parent = add_socket(&cfg); do_ioctl(&cfg, parent); sock = parent; if( cfg.cfg_protocol == IPPROTO_TCP ) sock = accept_child(parent); do_ts_sockopt(sock); /* Run forever */ while( 1 ) { pkt_num ++; got = do_recv(sock, pkt_num); /* TCP can detect an exit; for UDP, zero payload packets are valid */ if ( got == 0 && cfg.cfg_protocol == IPPROTO_TCP ) { printf( "recvmsg returned 0 - end of stream\n" ); break; } } close(sock); if( cfg.cfg_protocol == IPPROTO_TCP ) close(parent); return 0; }