#include #include #include #include extern "C" { #include #include #include } #include #include #include //---------- monitor Printer {}; void heartbeat( Printer & mutex ) { fprintf(stderr, "."); } void message( Printer & mutex, char * _msg, size_t len ) { fprintf(stderr, "'%.*s'", len, _msg); } void status( Printer & mutex, const char * st ) { fprintf(stderr, "%s\n", st); } void error( Printer & mutex, const char * _msg, int error) { fprintf(stderr, "%s - %s\n", _msg, strerror(error)); } Printer printer; //---------- thread HeartBeat {}; void ^?{}( HeartBeat & mutex ) {} void main( HeartBeat & this ) { while(true) { waitfor( ^?{} : this ) { break; } or else{ sleep( 5`s ); heartbeat( printer ); } } } //---------- thread Server { int port; }; void main( Server & this ) { char data[256]; struct iovec iov = { data, 256 }; struct msghdr msg = { "", 0, &iov, 1, NULL, 0, 0 }; int sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0) { error( printer, "socket", -sock); exit( EXIT_FAILURE ); } status( printer, "Socket created" ); struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(this.port); int ret = bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if(ret < 0) { error( printer, "bind", -ret); exit( EXIT_FAILURE ); } status( printer, "Socket bound" ); listen(sock,1); struct sockaddr_in cli_addr; __socklen_t clilen = sizeof(cli_addr); int newsock = cfa_accept4(sock, (struct sockaddr *) &cli_addr, &clilen, 0, 0, -1`s, 0p, 0p); if (newsock < 0) { error( printer, "accept", -newsock); exit( EXIT_FAILURE ); } status( printer, "Socket accepted, looping" ); while(1) { int res = cfa_recvmsg(newsock, &msg, 0, 0, -1`s, 0p, 0p); if(res == 0) break; if(res < 0) { error( printer, "recvmsg", -res); exit( EXIT_FAILURE ); } message(printer, data, res); } ret = cfa_close(newsock, 0, -1`s, 0p, 0p); if(ret < 0) { error( printer, "close new", -ret); exit( EXIT_FAILURE ); } ret = cfa_close(sock, 0, -1`s, 0p, 0p); if(ret < 0) { error( printer, "close old", -ret); exit( EXIT_FAILURE ); } } //---------- int main(int argc, char * argv []) { if(argc != 2) { printf("usage: %s portnumber\n", argv[0]); exit( EXIT_FAILURE ); } int port = atoi(argv[1]); if(port < 1) { printf("Invalid port : %d (from %s)\n", port, argv[1]); exit( EXIT_FAILURE ); } HeartBeat heartbeat; Server server = { port }; // while(true); }