상세 컨텐츠

본문 제목

3. Process - Socket

Operating System

by seoia 2020. 4. 22. 19:50

본문

 

Socket은 Client - Server system의 communication 방식 중 하나이다.

 

Socket은 Data communication을 한다.

 

쏘켓은 <ip address> : < port #>로 identify한다.

Ip주소와 포트 정보가 있으면 클라이언트는 네트워크를 통해 서버 프로세스에 접근 가능하다.

 

포트는 컴퓨터에 네트워크로 연결하는 것으로, 컴퓨터는 multiple 포트를 가지고 있어야 한다.

서버는 특정한 포트를 열어놓고 클라이언트가 접속하는지 확인한다.

 

포트는 65536개가 있는데 1024 아래에 포트는 특정 서비스에 사용되고 있다.

 

쏘켓을 사용할 때, 클라이언트는 포트를 선택하여 자신의 id 주소와 결합해서 포트를 하나 만는다.

 

  • Java Socket 

자바 쏘켓에서는 두개의 클래스를 지원하고 있다.

- ServerSocket : client가 접속하는지 monitoring해서 연결을 허락한다.

- Socket : 실제 쏘켓에 대응되는 클래스이다.

 

 


 

소켓 프로그래밍 (Server & Client 문자열 주고 받기)

(출처 : https://y0ubat.tistory.com/76 )

 

Server 코드이다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


#define BUF 128

int main(int argc, char *argv[]){

	char buffer[BUF];
    struct sockaddr_in server_addr, client_addr;
    
    char temp[20];
    int server_fd, client_fd;
    int len, msg_size;
    char test[20];
    
    if(argc != 2) {     //실행 코멘트가 올바르지 않을 때
    	printf("Usage ./a.out [PORT] \n"); 
        exit(0);
    }
    
    
    if((server_fd= socket(AF_INET,SOCK_STREAM,0)) ==-1){
    	printf("Server : Cannot open Socket\n");
        exit(0);
    }
    
    memset(&server_addr, 0x00, sizeof(server_addr));
    
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(atoi(argv[1]));
    
    if(bind (server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
    	printf("Server: Cannot bind local address\n");
        exit(0);
    }
    
    if(listen(server_fd,5) < 0){
    	printf("Server: Cannot listen connect \n");
        exit(0);
    }
    
    
    memset(buffer, 0x00, sizeof(buffer));
    
    len=sizeof(client_addr);
    
    printf("======[PORT] : %d ========\n",atoi(argv[1]));
    printf("Server : Waiting Connection request \n");
    
    
    while(1){
    	client_fd=accept(server_fd,(struct sockaddr *) &client_addr, (socklen_t *)&len);
        
        if(client_fd <0){
        	printf("Server: Accept failed \n");
            exit(0);
        }
        
        inet_ntop (AF_INET, &client_addr.sin_addr.s_addr,temp,sizeof(temp));
        
        printf("Server : %s client connect.\n",temp);
        
        send(client_fd, "test test test", 0xff,0);
        
        msg_size=recv(client_fd, (char *)buffer, BUF_LEN,0);
        send(client_fd, (char *) buffer, msg_size,0);
        
        
        close(client_fd);
        
        printf("Server : %s client closed.\n",temp);
        
        
    }
        
	close (server_fd);
    
    return 0;
    
 }
    

 

 

Client 코드이다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


#define BUF_SIZE 1024
#define PORT 1234
#define IPADDR "127.0.0.1"


int main(int argc, char *argv[]){

	
    int client_fd, len;
    struct sockaddr_in client_addr;
    char recv_data[BUF_SZIE];
    
    client_fd = socket(PF_INET, SOCK_STREAM, 0);
    
    client_addr.sin_addr.s_addr = inet_addr (IPADDR);
    client_addr.sin_family = AF_INET;
    client_addr.sin_port = htons(PORT);
    
    if(connect(client_fd, (struct sockaddr *) &client_addr, sizeof(client_addr)) == -1){
    	printf("Cannot connect \n");
        close (client_fd);
        return -1;
    }
    
    recv (client_fd, recv_data, sizeof(recv_data), 0);
    
    printf("recv data : %s\n", recv_data);
    
    close(client_fd);
    
    return 0;
    
 }
    
 }
    

'Operating System' 카테고리의 다른 글

6. Process Synchronization_2  (0) 2020.05.05
6. Process Synchronization _ 1 , Peterson's Solution  (0) 2020.04.22
3. Process - RPC / Pipes  (0) 2020.04.22

관련글 더보기