#include "smartsock2.h"
int main(void) { int iSock; //socket 생성 struct sockaddr_in stAddr; //socket의 주소 int iRet; //error 값은 저장한다. int iCSock[MAX_USER]; //새로운 소켓을 저장할 변수이다. unsigned int uiUser; socklen_t uiSockLen = sizeof(struct sockaddr); //unsigned int이다. char cBuffer[BUF_SIZE]; //echo서버를 위한 변수 iSock = socket(AF_INET, SOCK_STREAM, 0); //socket 생성 fd_set fdRead; unsigned int uiCnt; unsigned int uiCnt2; int iMSock;
if(iSock < 0) //socket 에러 확인 { perror("socket() error : "); close(iSock); //리턴하기 전에 close도 해주어야한다. return 10; }
bzero(&stAddr, sizeof(stAddr)); //구조체를 지운다. stAddr.sin_family = AF_INET; // stAddr.sin_port = htons(PORT); //고정 PORT stAddr.sin_addr.s_addr = inet_addr(IP); //고정 IP
iRet = bind(iSock, (struct sockaddr *)&stAddr, sizeof(stAddr)); if(iRet < 0) //bind 에러 확인 { perror("bind() error : "); close(iSock); //리턴하기 전에 close도 해주어야한다. return 15; }
iRet = listen(iSock, 5); if(iRet < 0) { perror("listen() error : "); close(iSock); //리턴하기 전에 close도 해주어야한다. return 20; } uiUser = 0; while(1) { FD_ZERO(&fdRead); FD_SET(0, &fdRead); FD_SET(iSock, &fdRead); iMSock = iSock; for(uiCnt = 0; uiCnt < uiUser ;++uiCnt) { FD_SET(iCSock[uiCnt], &fdRead); if(iMSock < iCSock[uiCnt]) { iMSock = iCSock[uiCnt]; } } select(iMSock+1, &fdRead, 0, 0, 0); if(0 != FD_ISSET(iSock, &fdRead)) { iCSock[uiUser] = accept(iSock, (struct sockaddr*)&stAddr, &uiSockLen); if(iCSock[uiUser] < 0) { perror("accept() error : "); continue; } printf("incoming client\n"); //누군가 접근중이다. printf("client IP : [%s]\n", inet_ntoa(stAddr.sin_addr)); //client IP write(iCSock[uiUser], "Welcome!", sizeof("Welcome!")); ++uiUser; }
if(0 != FD_ISSET(0, &fdRead)) { iRet = read(0, cBuffer, MSG_SIZE); cBuffer[iRet-1] = 0; for(uiCnt = 0; uiCnt < uiUser ;++uiCnt) { write(iCSock[uiCnt], cBuffer, MSG_SIZE); } } for(uiCnt = 0; uiCnt < uiUser ;++uiCnt) { if(0 != FD_ISSET(iCSock[uiCnt], &fdRead)) { read(iCSock[uiCnt], cBuffer, MSG_SIZE); for(uiCnt2 = 0; uiCnt2 < uiUser ;++uiCnt2) { if(uiCnt != uiCnt2) // 보낸곳 제외 write(iCSock[uiCnt2], cBuffer, MSG_SIZE); } if(0 == strncmp(MSG_END, cBuffer, strlen(MSG_END))) { close(iCSock[uiCnt]); --uiUser; iCSock[uiCnt] = iCSock[uiUser]; } } } } for(uiCnt = 0; uiCnt < uiUser ;++uiCnt) { close(iCSock[uiCnt]); } close(iSock); // return 0; }
|