socket class を使って server と client program を書き換える †さて、mysockaddr class と mysocket class を使って、前の server program と client program を書き換えてみよう。 まず server の方。 #include "mysocket.h" #define BACKLOG 3 #define SERVICE_PORT 8888 int main() { struct sockaddr_in ca; socklen_t calen; mysockaddr sa( 0, SERVICE_PORT ); mysocket s(PF_INET, SOCK_STREAM); if(s.bind(sa.address(),sa.length()) == -1) return 1; if(s.listen(BACKLOG) == -1) return 1; while(1) { calen = sizeof(ca); mysocket t = s.accept((struct sockaddr*)&ca, &calen); t.send("Hello\r\n", 7, 0); } return 0; } mysocket のうち t を while loop 中に入れることで close を止めている。 close しなくても while loop の終端で scope からはずれて destructor が呼ばれる。 さて、clinet の方。 #include <cstdio> #include <cstdlib> #include "mysocket.h" #define MYBUFSIZE 128 int main(int argc, char* argv[]) { static char buf[MYBUFSIZE + 1]; if(argc != 3) { fprintf(stderr,"Usage: %s host port\n", argv[0]); return (-1); } int port = ::atoi(argv[2]); mysockaddr sa( argv[1], port ); mysocket s(PF_INET, SOCK_STREAM); if(s.connect(sa.address(), sa.length()) == -1) { fprintf(stderr, "Cannot connect to %s:%d\n", argv[1], port); return 1; } int n; while((n = s.recv(buf, MYBUFSIZE)) > 0) { buf[n] = 0; printf( "%s", buf ); } return 0; } こちらも main の scope から抜ける時に s の desctructor が 呼ばれるということで、close を省略している。 だいぶ C++ らしくなってきた。 |