728x90
반응형
▶ 소켓
프로그램이 네트워크에서 데이터를 통신할 수 있도록 하는 연결선
두 pc 혹은 프로세스 간에 통신을 가능하게 함
네트워크를 경유하는 프로세스 간 통신의 접속점으로, 소켓을 통해 클라이언트와 서버 프로그램 사이에 데이터를 송,수신할 수 있음
데이터를 통신할 수 있도록 해주는 연결부이기 때문에 통신할 두 프로그램(Client, Server) 모두에 소켓이 생성 되어야함
▶ 프로토콜
컴퓨터나 원거리 통신 장비 사이에서 메시지를 주고 받는 양식과 규칙 체계 = 통신 규약 및 약속
ex) http, ASCII, TCP, UDP, IP 등
<socket 생성함수>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
- domain: 인터넷이나 같은 시스템 내에서 통신할지 정한다
- type: 데이터의 전송 형태
- protocol: 사용할 프로토콜 / 보통 디폴트 0을 사용
<sever 소켓>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#define BUFF_SIZE 1024
int main() {
int server_socket;
int client_socket;
int client_addr_size;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
char buff_rcv[BUFF_SIZE + 5];
char buff_snd[BUFF_SIZE + 5];
// internet 기반의 소켓 생성 (INET)
server_socket = socket(PF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
printf("server socket fail\n");
exit(1);
}
//서버의 IP주소와 PORT 번호를 sockaddr_in 구조체에 저장
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//구조체에 저장한 주소를 socket에 연결
if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
printf("bind() error\n");
exit(1);
}
if (listen(server_socket, 5) == -1) {
printf("listen() fail\n");
exit(1);
}
while (1) {
client_addr_size = sizeof(client_addr);
//클라이언트의 연결을 수락
client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_size);
if (client_socket == -1) {
printf("accept() fail\n");
exit(1);
}
//클라이언트로부터 전달받은 데이터를 읽음
read(client_socket, buff_rcv, BUFF_SIZE);
printf("receive: %s\n", buff_rcv);
printf(buff_snd, "%d : %s", strlen(buff_rcv), buff_rcv);
//전달받은 데이터를 다시 전송
write(client_socket, buff_snd, strlen(buff_snd) + 1);
//클라이언트 소켓 종료
close(client_socket);
}
}
<Client 소켓>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#define BUF_SIZE 1024
int main(int argc, char** argv) {
int client_socket; //client socket 정보를 구하기 위해 변수 선언
struct sockaddr_in server_addr);
char buff[BUFF_SIZE + 5];
client_socket = socket(PF_INET, SOCK_STREAM, 0);
if (client_socket == -1) {
printf("socket create fail\n");
exit(1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET; // IPv4 인터넷 프로토콜
server_addr.sin_port = htons(49445); //사용할 port 번호는 49445
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //서버의 주소
if (connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
printf("connect fail\n");
exit(1);
}
//클라이언트로 자료를 송신, NULL 까지 포함해서 전송
write(client_socket, argv[1], strlen(argv[1]) + 1);
read(client_socket, buff, BUFF_SIZE); //클라이언트로부터 전송된 자료를 읽어들임
printf("%s\n", buff);
close(client_socket); //클라이언트 소켓 종료
return 0;
}
728x90
반응형
'C' 카테고리의 다른 글
main 함수의 argc, argv (0) | 2023.02.05 |
---|---|
C언어 총 정리 (0) | 2022.11.26 |