이건.. SE 우리의 씨에르사마를 위해 짠거.. 메인부분.. 음.. 좀 구조가 거지같지만 뭐.. 실제 코딩은 한 40시간 정도 삽질은 5일 정도 한 듯 하군.. ㅋ..
int main (int argc,char *argv[])
{
pthread_t cam_thread;
pthread_t sensor_thread;
int t_id;
int listenfd,maxfd;
int i = 0,nready;
int port = 2112;
struct sockaddr_in cliaddr;
int client_len,connfd,sockfd;
/* Sets of file descriptors for I/O multiplexing */
fd_set rset, allset;
listenfd = makeListenSock(port);
/*if(argc != 2)
{
printf("usage: %s port\n", argv[0]);
exit(1);
}
port = atoi(argv[1]);
*/
/*Create Cam Server Thread*/
t_id = pthread_create(&cam_thread, NULL, camServerMain, NULL);
if (t_id < 0)
{
perror("thread create error : ");
exit(0);
}
/*Connect to Cam Server */
camfd = makeConnect(2113);
printf("camfd %d\n",camfd);
/*Create Sensor Server Thread*/
t_id = pthread_create(&sensor_thread, NULL, sensorServerMain, NULL);
if (t_id < 0)
{
perror("thread create error : ");
exit(0);
}
sensorfd = makeConnect(2114);
printf("sensorfd %d\n",sensorfd);
/*Client Socket List Initialize */
for( i=0; i<FD_SETSIZE; i++)
client[i] = -1;
printf("서버소켓 %d\n",listenfd);
maxfd = listenfd;//초기화
maxi = 1;
FD_ZERO(&allset);
FD_SET(camfd, &allset);
FD_SET(sensorfd, &allset);
//ㅎㅎ 역시 잼있게 짠 것은.. 서버 소켓 3개 켜놓고.. 하나 셋에 집어 넣고 한 저 집념.. ㅋㅋㅋ
// 이상하게 Centralize한게 좋다고나 할까.. 허허..
FD_SET(listenfd, &allset);//fd set에 listen sock 입력
client[0] = camfd;
client[1] = sensorfd;
if(camfd>maxfd);
maxfd = camfd;
if(sensorfd>maxfd);
maxfd = sensorfd;
while(1)
{
rset = allset; /* structure assignment */
nready = select(maxfd+1, &rset,NULL,NULL,NULL);
if(FD_ISSET(listenfd, &rset))
{
/* new main_client connection */
client_len = sizeof(cliaddr);
connfd = accept(listenfd,(struct sockaddr *)&cliaddr, &client_len);
printf("connected sockfd = %d\n", connfd);
for (i=0; i<FD_SETSIZE; i++)
{
if (client[i] < 0)
{
client[i] = connfd; /* save descriptor */
break;
}
}
if(i == FD_SETSIZE)
{
printf("Too many peers");
exit(1);
}
FD_SET(connfd, &allset); /* add new descriptor to set */
if (connfd > maxfd)
maxfd = connfd; /* for select */
if (i > maxi)
maxi = i; /* max index in client[] array */
if (--nready <= 0)
continue; /* no more readable descriptors */
}
/*if(toltime!=-1)
{
if(toltime == 30)
{
char* sendData;
toltime = -1;
sendData = makeBytePacket(PARENTPACKET_TAG,-1,saveSIG,-1,NULL,0);
sendMsg(sensorfd,sendData,sizeof(int)*5);
free(sendData);
}
printf("toltime = %d",toltime);
toltime++;
}*/
for(i=0;i<=maxi; i++)
{ /* check all clients for data */
if((sockfd=client[i]) < 0)
continue;
if(FD_ISSET(sockfd, &rset))
{
int size = 0, n;
char *buf = NULL;
if((n=readMsg(sockfd,&size,sizeof(size)))==0)
{
/* connection closed by client */
close(sockfd);
FD_CLR(sockfd, &allset);
client[i] = -1;
printf("Connection lost from = %d\n", sockfd);
}else if( n == sizeof(int))
{
/* Read more data from a camera or a camera viewer socket*/
size = ntohl(size);
//printf("Main received packet size = %d\n", size);
buf = (char *)malloc(size);
readMsg(sockfd, buf, size);
packetProcessForClient(sockfd, buf, size);
free(buf);
}
if (--nready <= 0){
break; /* no more readable descriptors */
}
}
}
}
}
// 아 설명이 귀찮음으로 주석 생략.. 옆에 붙은 영어 주석은 허허.. 원래 스켈레톤에 있던거구나