TCP Socket 4

강윤경·2022년 10월 31일
0

Network

목록 보기
7/17

TCP Server와 Client 예시 Code


Server 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; 
}

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;	// 소켓 디스크립터 저장 변수
	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; 
}

0개의 댓글