본문 바로가기

엔지니어/C++

socket_test_server

728x90
반응형
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <winsock2.h>
#define QLEN 10
#define PORT 10020
int main(int argc, char* argv[])
{
                 struct sockaddr_in ServerAddr;   /* 서버의 주소 구조체 */
                 struct sockaddr_in ClientAddr;   /* 클라이언트의 주소 구조체 */
                 SOCKET serverSocket, clientSocket;  /* 서버,클라이언트 소켓의 기술자 */
                 int port = PORT ;                  /* 서버 프로그램의 포트 번호 */
                 int addrlen;                        /* 주소의 길이 */
                 int recvbyte = 0;   /* 수신한 데이터의 길이 */
                 char buf[10];                    /* 서버가 전송할 데이터 저장 버퍼 */
                                                                                                                                                 // 윈도우 운영체제에서 필요한 설정
                 WSADATA wsaData;
                 if (WSAStartup(MAKEWORD (2, 2), &wsaData) != 0)
                                 return -1;
                 // 서버의 주소 구조체 초기화: 내용을 memset 함수로 모두 0으로 초기화한 후에
                 // 각 필드에 필요한 값들을 설정한다.
                 // 따라서, 값이 설정되지 않은 필드는 0으로 초기화된다.
                memset(&ServerAddr, 0, sizeof(ServerAddr));
                ServerAddr.sin_family = AF_INET;       /* 인터넷 주소 체계 설정 */
                ServerAddr.sin_port = htons(port);           /* 포트 번호 설정 */
                ServerAddr.sin_addr. s_addr = htonl(INADDR_ANY );     /* 모든 IP주소로 설정*/

                                                                                                                                                                                                                                 // 서버의 메인 소켓 생성
                serverSocket = socket( PF_INET, SOCK_STREAM , 0);
                 if (serverSocket < 0) {
                                printf( "소켓 생성 실패\n" );
                                exit(1);
                }
                 // 서버의 주소 구조체를 생성한 소켓에 연계
                 if (bind(serverSocket, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr)) < 0) {
                                printf( "bind 함수 실패\n" );
                                exit(1);
                }
                 // 클라이언트로부터의 연결을 대기
                 if (listen(serverSocket, QLEN ) < 0) {
                                printf( "listen 함수 실패 \n" );
                                exit(1);
                }
                 while (1)   /* 서버 프로그램은 종료되지 않고  무한히 수행 */
                {
                                 //클라이언트로부터의 요청을 받아 연결하고, 통신을 위한 소켓을 생성
                                printf( "클라이언트로부터 접속을 기다리는 중\n" );
                                addrlen = sizeof(ClientAddr);
                                 if ((clientSocket = accept(serverSocket, (struct sockaddr *)&ClientAddr, &addrlen)) < 0)
                                {
                                                printf( "클라이언트와의 연결 실패\n" );
                                                exit(1);
                                }

                                 //연결된 클라이언트로부터 메시지 수신
                                recvbyte = recv(clientSocket, buf, sizeof(buf), 0);
                                 if (recvbyte < 0)
                                {
                                                printf( " 메시지 수신 실패\n" );
                                                exit(1);
                                }
                                buf[recvbyte] = '\0';
                                printf( "수신한 메시지:%s\n" , buf);    /*  수신한 메시지 출력 */
                                send(clientSocket, buf, strlen(buf), 0);   /*  서버에게 메시지 전송 */

                                closesocket(clientSocket);  /*  통신한 클라이언트와의 연결을 종료*/
                }
                closesocket(serverSocket);  /* 이하 부분은 수행되지 않는댜 */
                WSACleanup();
                 return 0;
}


반응형

'엔지니어 > C++' 카테고리의 다른 글

socket_test_client  (0) 2016.05.26
agent server (create by sk)  (0) 2016.05.26
agent server makefile (create by sk)  (0) 2016.05.26
agent client makefile (create by sk)  (0) 2016.05.26
j2-agent(/etc/init.d/) (create by sk)  (0) 2016.05.26