프로그래밍의 기초/TCP | IP
C언어를 통한 네트워크 프로그래밍의 이해
Kim나현
2022. 1. 5. 17:24
반응형
- 소켓: 네트워크망에 연결하기 위한 도구
- 서버: 연결 요청을 수락하는 기능의 프로그램
- socket의 생성
- ip, port number를 서버 socket에 할당
- 소켓을 연결 요청 가능한 상태로 만듦
- socket을 통해 연결 요청 수락
- 클라이언트: 연결 요청을 진행하는 소켓
- socket의 생성
- 연결 요청
더보기
[리눅스 기반으로 실행]
GCC컴파일러: 리눅스 C컴파일러
- 컴파일
gcc hello_server.c -o hserver
→hello_server.c 파일을 컴파일하여 hserver라는 이름의 실행파일을 만듦
- 실행
./hserver
→현재 디렉터리에 있는 hserver라는 이름의 파일을 실행
윈도우 기반으로 코드를 사용할 경우
[server socket programming]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <sys/types.h>
#include <sys/stat.h>
void err_handling(const char* message)
{
fputs(message, stderr);
fputs("\n", stderr);
printf("erroor: %d", WSAGetLastError());
exit(1);
}
int main(int argc, char*argv[])
{
WSADATA wsaData;
SOCKET serv_sock;
SOCKET clnt_sock;
SOCKADDR_IN serv_addr;
SOCKADDR_IN clnt_addr;
socklen_t clnt_addr_size;
char message[] = "Hello, world";
if (argc != 2) // 입력 인수 2개 아닐경우
{
printf("Usage: %s <port>, argc: %d\n", argv[0], argc);
exit(1);
}
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //소켓 라이브러리 초기화
err_handling("WSAStartup() error!");
serv_sock = socket(PF_INET, SOCK_STREAM, 0); // create socket
if (serv_sock == -1)
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); // ip
serv_addr.sin_port = htons(atoi(argv[1])); // port
if (bind(serv_sock, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == -1) // 서버socket에 ip, port 할당
err_handling("bind() error");
if (listen(serv_sock, 5) == -1)
err_handling("listen() error");
clnt_addr_size = sizeof(clnt_addr);
clnt_sock = accept(serv_sock, (SOCKADDR*)&clnt_addr, &clnt_addr_size); // accept to client when connection from client
if (clnt_sock == -1)
err_handling("accept() error");
send(clnt_sock, message, sizeof(message), 0);
closesocket(clnt_sock);
closesocket(serv_sock);
WSACleanup();
return 0;
}
[client socket programming]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <sys/types.h>
#include <sys/stat.h>
void err_handling(const char* message)
{
fputs(message, stderr);
fputs("\n", stderr);
printf("erroor: %d", WSAGetLastError());
exit(1);
}
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET sock;
SOCKADDR_IN serv_addr;
char messsage[30];
int str_len;
if (argc != 3) //입력인수 3개 아닐경우
{
printf("Usage: %s <IP> <port>\n", argv[0]);
exit(1);
}
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) //소켓 라이브러리 초기화
err_handling("WSAStartup() error!");
sock = socket(PF_INET, SOCK_STREAM, 0); // create client socket
if (sock == -1)
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]); // ip
serv_addr.sin_port = htons(atoi(argv[2])); // port
if (connect(sock, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == -1) //connect
err_handling("connect() error");
str_len = recv(sock, messsage, sizeof(messsage) - 1, 0);
if (str_len == -1)
err_handling("read() error");
printf("message from server: %s\n", messsage);
closesocket(sock);
WSACleanup();
return 0;
}
반응형