소켓을 활용한 프로그래밍에 있어서 Client/Server간의 구조를 아는것도 중요하지만 socket관련함수를 어떻게 사용하는지 아는것도 매우 중요한것 같다.
다음의 도표는 이를 알기 쉽게 표현한 것이다.
예제 코드를 보면 좀더 이해가 빠르지 않을까...!?
#include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <stdio.h>
#define NSTRS 3 /* no. of strings */ #define ADDRESS "mysocket" /* addr to connect */
/* * Strings we send to the client. */ char *strs[NSTRS] = { "This is the first string from the server.
", "This is the second string from the server.
", "This is the third string from the server.
" };
main() { char c; FILE *fp; int fromlen; register int i, s, ns, len; struct sockaddr_un saun, fsaun;
/* * Get a socket to work with. This socket will * be in the UNIX domain, and will be a * stream socket. */ if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { perror("server: socket"); exit(1); }
/* * Create the address we will be binding to. */ saun.sun_family = AF_UNIX; strcpy(saun.sun_path, ADDRESS);
/* * Try to bind the address to the socket. We * unlink the name first so that the bind won't * fail. * * The third argument indicates the "length" of * the structure, not just the length of the * socket name. */ unlink(ADDRESS); len = sizeof(saun.sun_family) + strlen(saun.sun_path);
if (bind(s, &saun, len) < 0) { perror("server: bind"); exit(1); }
/* * Listen on the socket. */ if (listen(s, 5) < 0) { perror("server: listen"); exit(1); }
/* * Accept connections. When we accept one, ns * will be connected to the client. fsaun will * contain the address of the client. */ if ((ns = accept(s, &fsaun, &fromlen)) < 0) { perror("server: accept"); exit(1); }
/* * We'll use stdio for reading the socket. */ fp = fdopen(ns, "r");
/* * First we send some strings to the client. */ for (i = 0; i < NSTRS; i++) send(ns, strs[i], strlen(strs[i]), 0);
/* * Then we read some strings from the client and * print them out. */ for (i = 0; i < NSTRS; i++) { while ((c = fgetc(fp)) != EOF) { putchar(c);
if (c == '
') break; } }
/* * We can simply use close() to terminate the * connection, since we're done with both sides. */ close(s);
exit(0); }
#include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <stdio.h>
#define NSTRS 3 /* no. of strings */ #define ADDRESS "mysocket" /* addr to connect */
/* * Strings we send to the server. */ char *strs[NSTRS] = { "This is the first string from the client.
", "This is the second string from the client.
", "This is the third string from the client.
" };
main() { char c; FILE *fp; register int i, s, len; struct sockaddr_un saun;
/* * Get a socket to work with. This socket will * be in the UNIX domain, and will be a * stream socket. */ if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { perror("client: socket"); exit(1); }
/* * Create the address we will be connecting to. */ saun.sun_family = AF_UNIX; strcpy(saun.sun_path, ADDRESS);
/* * Try to connect to the address. For this to * succeed, the server must already have bound * this address, and must have issued a listen() * request. * * The third argument indicates the "length" of * the structure, not just the length of the * socket name. */ len = sizeof(saun.sun_family) + strlen(saun.sun_path);
if (connect(s, &saun, len) < 0) { perror("client: connect"); exit(1); }
/* * We'll use stdio for reading * the socket. */ fp = fdopen(s, "r");
/* * First we read some strings from the server * and print them out. */ for (i = 0; i < NSTRS; i++) { while ((c = fgetc(fp)) != EOF) { putchar(c);
if (c == '
') break; } }
/* * Now we send some strings to the server. */ for (i = 0; i < NSTRS; i++) send(s, strs[i], strlen(strs[i]), 0);
/* * We can simply use close() to terminate the * connection, since we're done with both sides. */ close(s);
exit(0); }
Tags: client server socket 서버 소켓 소켓프로그래밍 윈도우즈 클라이언트
|