반응형
[어플리케이션 프로토콜]
데이터 길이 | 데이터 | |
바이트 | 4 바이트 | 1 바이트 |
자료형 | char [4] (int) | char |
// client
#define INT_SIZE 4 // len 바이트 수
#define MAX_SIZE 1024
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET clnt_sock;
SOCKADDR_IN serv_addr;
char msg[MAX_SIZE], read_msg[MAX_SIZE];
int recv_len, send_len;
if (argc != 3)
{
printf("usage: %s <ip> <port>\n", argv[0]);
exit(1);
}
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
err_handling("startup() error");
clnt_sock = socket(PF_INET, SOCK_STREAM, 0);
if (clnt_sock == INVALID_SOCKET)
err_handling("socket() error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if (connect(clnt_sock, &serv_addr, sizeof(serv_addr)) == SOCKET_ERROR)
err_handling("connect() error");
fputs("connect....\n", stdout);
fputs("msg: ", stdout);
scanf("%s", &msg[INT_SIZE]);
send_len = strlen(&msg[INT_SIZE]); // 길이 정보
memcpy(msg, &send_len, INT_SIZE);
send(clnt_sock, msg, strlen(&msg[INT_SIZE]) + INT_SIZE, 0);
recv(clnt_sock, &recv_len, INT_SIZE, 0); // 길이
recv(clnt_sock, read_msg, recv_len, 0);
read_msg[recv_len] = 0;
printf("read msg: %s\n", read_msg); // 수신 확인 목적
fputs("msg: ", stdout);
scanf("%s", &msg[INT_SIZE]);
send_len = strlen(&msg[INT_SIZE]); // 길이 정보
memcpy(msg, &send_len, INT_SIZE);
send(clnt_sock, msg, strlen(&msg[INT_SIZE]) + INT_SIZE, 0);
closesocket(clnt_sock);
WSACleanup();
return 0;
}
// server
#define INT_SIZE 4 // len 바이트 수
#define MAX_SIZE 1024
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET clnt_sock, serv_sock;
SOCKADDR_IN serv_addr, clnt_addr;
int clnt_sz, recv_len, send_len;
char read_msg[MAX_SIZE];
char msg[MAX_SIZE];
if (argc != 2)
{
printf("usage: %s <port>\n", argv[0]);
exit(1);
}
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
err_handling("start up() error");
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
if (serv_sock == INVALID_SOCKET)
err_handling("socket() error");
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if (bind(serv_sock, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR)
err_handling("bind() error");
if (listen(serv_sock, 5) == SOCKET_ERROR)
err_handling("listen() error");
clnt_sz = sizeof(clnt_addr);
for (int n = 0; n < 5; n++)
{
clnt_sock = accept(serv_sock, (SOCKADDR*)&clnt_addr, &clnt_sz);
if (clnt_sock == INVALID_SOCKET)
err_handling("accept() error");
else
printf("connect: %d\n", n + 1);
recv(clnt_sock, &recv_len, INT_SIZE, 0); // 4바이트 길이 정보
recv(clnt_sock, read_msg, recv_len, 0);
read_msg[recv_len] = 0;
printf("read msg: %s\n", read_msg);
fputs("send msg:", stdout);
scanf("%s", &msg[INT_SIZE]);
send_len = strlen(&msg[INT_SIZE]); // 길이정보
memcpy(msg, &send_len, INT_SIZE);
send(clnt_sock, msg, strlen(&msg[INT_SIZE]) + INT_SIZE, 0);
recv(clnt_sock, &recv_len, INT_SIZE, 0); // 4바이트 길이 정보
recv(clnt_sock, read_msg, recv_len, 0);
read_msg[recv_len] = 0;
printf("read msg: %s\n", read_msg);
}
closesocket(serv_sock);
WSACleanup();
return 0;
}
반응형
'프로그래밍의 기초 > TCP | IP' 카테고리의 다른 글
UDP 기반 서버/ 클라이언트의 구현 (0) | 2022.01.12 |
---|---|
UDP에 대한 이해 (0) | 2022.01.12 |
TCP 이론 (흐름제어) (0) | 2022.01.11 |
에코 클라이언트의 해결책 (0) | 2022.01.11 |
Iterative 기반의 서버, 클라이언트 구현 (0) | 2022.01.10 |