001
23.01.2003, 08:36 Uhr
virtual
Sexiest Bit alive (Operator)
|
Hm. Das ist jetzt wirklich nur schnell zusammen gehackt: Der Server sieht so aus:
C++: |
/*recv.c*/ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <arpa/inet.h> #include <ctype.h>
static int handle_request(int);
static const char* prgname;
int main( int argc, char** argv) { unsigned short lport; int lsocket; char lhostname[64]; struct hostent* lhostentry; struct sockaddr_in laddr; static int quit = 0;
/* * Get application name */ prgname = *argv + strlen(*argv); while (prgname != *argv && prgname[-1]!='/') prgname--;
/* * Check command line */ if (argc!=2) { fprintf(stderr, "error: %s: invalid command line.\n" "usage: %s tcp-port\n", prgname, prgname); exit(EXIT_FAILURE); } if (1!=sscanf(argv[1], "%hu", &lport)) { fprintf(stderr, "error: %s: expected unsigned integer (port number)\n" "usage: %s tcp-port\n", prgname, prgname); exit(EXIT_FAILURE); }
/* * Say hello */ printf("%s - simple TCP server demo\n" "Listens for incoming client connections and executes\n" "the received strings in a shell. The program terminates\n" "when a line with the text \"exit\" is received.\n", prgname);
/* * Setup address information */ if (-1 == gethostname(lhostname, sizeof(lhostname))) { fprintf(stderr, "error: %s: gethostname() failed: %s\n", prgname, strerror(errno)); exit(EXIT_FAILURE); } lhostentry = gethostbyname(lhostname); if (NULL == lhostentry) { fprintf(stderr, "error: %s: gethostbyname() failed: %s\n", prgname, strerror(errno)); exit(EXIT_FAILURE); } memset(&laddr, 0, sizeof(laddr)); laddr.sin_family = lhostentry->h_addrtype; memcpy((char*)&laddr.sin_addr, lhostentry->h_addr, lhostentry->h_length); laddr.sin_port = htons(lport);
/* * Create socket */ lsocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (-1 == lsocket) { fprintf(stderr, "error: %s: socket() failed: %s\n", prgname, strerror(errno)); exit(EXIT_FAILURE); }
/* * Bind socket to address */ if (-1 == bind(lsocket, &laddr, sizeof(laddr))) { fprintf(stderr, "error: %s: bind() failed: %s\n", prgname, strerror(errno)); close(lsocket); exit(EXIT_FAILURE); }
/* * Set back log */ if (-1 == listen(lsocket, 10)) { fprintf(stderr, "error: %s: listen() failed: %s\n", prgname, strerror(errno)); close(lsocket); exit(EXIT_FAILURE); } /* * Enter loop for receiving requests */ printf("Waiting for connection at %s:%hu...\n", lhostname, lport); do { int csocket; struct sockaddr_in caddr; socklen_t clen;
/* * Accept a connection */ clen = sizeof(caddr); csocket = accept(lsocket, &caddr, &clen); if (-1 == csocket) { fprintf(stderr, "warning: %s: accept() failed: %s\n", prgname, strerror(errno)); continue; } /* * Handle client request */ quit = handle_request(csocket); } while(!quit);
/* * cleanup */ close(lsocket); }
int handle_request( int csocket) { char* buffer = NULL; char* tmp; size_t size = 0; size_t len = 0; size_t chunk; int quit = 0; /* * Fetch command from stream */ for(;;) { /* * Resize receive buffer */ size += 1024; tmp = realloc(buffer, size); if (NULL == tmp) { if (NULL != buffer) free(buffer); close(csocket); fprintf(stderr, "warning: %s: realloc(%u) failed.\n", prgname, size); return 0; } buffer = tmp; /* * Get next portion */ chunk = read(csocket, buffer+len, size-len-1); if (chunk>=0) { buffer[len+chunk] = 0; } if (size-len-1>chunk) break; len += chunk; } if (chunk<0) { if (NULL != buffer) free(buffer); close(csocket); fprintf(stderr, "warning: %s: read() failed: %s.\n", prgname, strerror(errno)); return 0; } len += chunk; while (len>0 && iscntrl(buffer[len-1])) buffer[--len] = 0;
/* * Print command */ printf("Got command: >%s<\n", buffer); if (strcmp(buffer, "exit")) { system(buffer); }else { printf("Program will be finished\n"); quit = 1; }
/* * cleanup */ free(buffer); close(csocket); return quit; }
|
Es ist ein simples Demo: es öffnet ein TCP Socket für den Port, den du über kommandozeile angibst und empfängt dort nachrichten. Wenn die Nachricht "exit" ist, beendet sich das Programm; ansonsten führt es die Nachricht als Command in der Shell aus. Als client kannst Du auch ein telnet nehmen:
Code: |
telnet rechnername tcp-port
|
Dann Die Nachricht eintippen, gefolgt von CTRL-D. Alternativ nächste Antwort von mir in diesem Thread lesen.
Ein "echter" Server würde vermutlich jeden Clientrequest in einem separatem Thread beantworten; auch kann man sicherlich noch nach dem accept mehr informationen ausgeben, welcher Client sich connected hat. Aber das wirst Du schon hinbekommen... -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 23.01.2003 um 08:36 Uhr von virtual editiert. |