Network

TCP - hello, world를 출력하는 소켓 프로그램

로픽 2016. 10. 5. 20:39
300x250

리눅스 Centos 6.5 환경 - 소켓 프로그램

서버 프로그램


#include <stdio.h>

#include <netinet/in.h>

#include <sys/socket.h>


#define PORT 9000


char buffer[BUFSIZ] = "hello, world";


main()

{

int c_socket, s_socket;  //소켓 생성 위한 변수(클라이언트 소켓, 서버 소켓)

struct sockaddr_in s_addr, c_addr;    //소켓의 주소 저장

int len, n;


s_socket = socket(PF_INET, SOCK_STREAM, 0);

memset(&s_addr, 0, sizeof(s_addr));

s_addr.sin_addr.s_addr = htonl(INADDR_ANY);           //host 방식을 네트워크 방식으로 변경

s_addr.sin_family = AF_INET;

s_addr.sin_port = htons(PORT);        // 포트 설정


if(bind(s_socket, (struct sockaddr *)&s_addr, sizeof(s_addr)) == -1){  //소켓과 주소의 연결

printf("Can not Bind!!\n");

return -1;

}


if(listen(s_socket, 5) == -1){        //소켓에 접속을 기다리고 있다

printf("listen Fail\n");

return -1;

}


while(1){

len = sizeof(c_addr);


c_socket = accept(s_socket, (struct sockaddr *)&c_addr, &len);      //소켓에 접속하면 연결


n=strlen(buffer);

write(c_socket, buffer, n);        //buffer의 내용을 전송한다


close(c_socket);

}

close(s_socket);

}


클라이언트 프로그램


#include <stdio.h>

#include <netinet/in.h>

#include <sys/socket.h>


#define PORT 9000

#define IPADDR "127.0.0.1"


char rcvBuffer[BUFSIZ];

main()

{

int c_socket;        //s_socket 불필요

struct sockaddr_in s_addr, c_addr;

int len, n;


c_socket = socket(PF_INET, SOCK_STREAM, 0);

memset(&c_addr, 0, sizeof(c_addr));

c_addr.sin_addr.s_addr=inet_addr(IPADDR);

c_addr.sin_family=AF_INET;

c_addr.sin_port=htons(PORT);        //주소를 자기자신으로 변경한 것을 제외하고 서버와 동일


if(connect(c_socket, (struct sockaddr *)&c_addr, sizeof(c_addr)) == -1){        //서버와 연결

printf("Can not Connection\n");

close(c_socket);

return -1;

}


if( n = read(c_socket, rcvBuffer, sizeof(rcvBuffer)) < 0){

return -1;        // 서버의 데이터를 읽어 rcvBuffer에 저장한다.

}


rcvBuffer[n] = '\0';        // 문장을 마무리하기 위해서 마지막에 널문자 삽입

printf("received Date : %s\n", rcvBuffer);                //rcvBuffer 출력


close(c_socket);

}


linux




반응형