TCP Server와 Client 예시 Code
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 9999
int main(void){
int sock, client_sock; // 소켓 디스크립터(서버, 클라이언트) 저장 변수
struct sockaddr_in addr, client_addr; // 소켓의 주소(서버, 클라이언트)를 담는 구조체 변수
char buffer[1024]; // 서버로 수신할 버퍼 데이터 저장 변수
int addr_len, recv_len; // 클라이언트로부터 수신된 데이터 바이트 수
// IPv4,TCP/IP 프로토콜 사용 형태의 소켓 생성 후 sock의 저장
if((sock = socket(AF_INET, SOCK_STREAM, 0))<0){
perror("socket make fail");
return 1;
}
memset(&addr, 0x00, sizeof(addr)); // 소켓 초기화
addr.sin_family = AF_INET; // 주소 체계 설정 (IPv4)
addr.sin_addr.s_addr = htonl(INADDR_ANY); // 접속을 기다리는 모든 IP 주소 받아 저장
addr.sin_port = htons(PORT); // 포트 번호 저장
// 소켓에 IP주소와 포트 번호 지정하여 소켓 통신 사용 준비
if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){
perror("bind fail");
return 1;
}
// 소켓에서 연결을 기다리는 대기열 큐 생성
if(listen(sock, 5) < 0){
perror("listen fail");
return 1;
}
addr_len = sizeof(client_addr); // 클라이언트 주소의 크기 addr_len 저장
printf("waiting for clinet..\n");
// 클라이언트의 접속 요청을 받아드리고 클라이언트와 통신하는 전용 소켓 생성
while((client_sock = accept(sock, (struct sockaddr *)&client_addr, &addr_len)) > 0){
printf("clinet ip : %s\n", inet_ntoa(client_addr.sin_addr)); // IP 주소 출력
if((recv_len = recv(client_sock, buffer, 1024, 0)) < 0){ // 소켓으로부터 데이터를 수신
perror("recv ");
return 1;
break;
}
buffer[recv_len] = '\0'; // 수신된 버퍼 마지막 entet
printf("received data : %s\n", buffer); // 수신된 데이터 출력
send(client_sock, buffer, strlen(buffer), 0); // 연결된 서버에 버퍼 안 데이터 전송
close(client_sock); // 클라이언트 소켓 연결 종료
}
close(sock); // 소켓 연결 종료
return 0;
}
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 9999
int main(void){
int sock; // 소켓 디스크립터 저장 변수
struct sockaddr_in addr; // 소켓의 주소를 담는 구조체 변수
char buffer[1024]; // 서버로 수신할 버퍼 데이터 저장 변수
const char *msg = "hello! world!"; // 서버로 보내는 문자열
int recv_len; // 소켓으로부터 데이터를 수신된 바이트 수 저장 변수
// IPv4,TCP/IP 프로토콜 사용 형태의 소켓 생성 후 sock의 저장
if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror("socket make fail");
return 1;
}
memset(&addr, 0x00, sizeof(addr)); // 소켓 초기화
addr.sin_family = AF_INET; // 주소 체계 설정 (IPv4)
addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // long형으로 주소 변환 후 IP 주소 설정
addr.sin_port = htons(PORT); // 포트 번호 설정
// 생성한 소켓을 통해 서버로 접속 요청
if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0){
perror("connect fail");
return 1;
}
// 연결된 서버로 문자열 전송
if(send (sock, msg, strlen(msg), 0) < 0){
perror("send fail");
return 1;
}
// 소켓으로부터 데이터 수신 후 수신된 데이터 바이트 recv_len 저장
if((recv_len = recv(sock, buffer, 1024, 0)) < 0){
perror("recv fail");
return 1;
}
buffer[recv_len] = '\0'; // 수신된 데이터 마지막 버퍼에 enter
printf("recevied data : %s\n", buffer); // 수신된 데이터 출력
close(sock); // 소켓 연결 종료
return 0;
}