728x90
반응형
아침에 했던 소스
#include <stdio.h> //터미널.pdf 34페이지 참고 #include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int main(void) { int iMaxFD; fd_set stRFd; //select에서 만든 구조체, 사용법만 익히자 iMaxFD = 1; //항상 +1을 해줘야한다.(키보드를 사용하기 위해선), select함수에서 +1을 하게끔 정해놓은것 char caBuff[250]; int iRet; //개행 문자를 제거하기 위해 선언했다. FD_ZERO(&stRFd); //구조체를 FD_ZERO 를 이용해서 초기화 한다. FD_SET(0,&stRFd); //쓰는방법->FD_SET(번호,&());, 키보드를 감시 printf("select 실행중 ...\n"); select(iMaxFD , &stRFd, NULL, NULL, NULL); //UNIX 617페이지 참조 printf("--------------------------------"); iRet = read(0,caBuff,250); //select를 통해 들어오는것을 read로 읽자 //read의 첫번째인자는 키보드를 선택하기위해 0 //read의 두번째인자는 버퍼(위에 버퍼를 선언해주자) caBuff[iRet - 1] = 0; //문자열 생성,개행문자를 없애주기 위해 -1 printf("[%s]\n", caBuff); return 0; }
client.c
#include "tcp.h" int iCSock; void End(int iNum) { close(iCSock); exit(0); } void sRead(int iNum) { char caBuff[BSIZE]; int iRet; iRet=read(iCSock , caBuff, BSIZE); caBuff[iRet-1]=0; printf("\n Incomming Message: [%s]\n", caBuff); printf("input Message: "); fflush(stdout); } int main(int iArg, char *cpAcmd[]) { int iRet; int iLen; fd_set stRFd; char caBuff[BSIZE]; short sPort; struct sockaddr_in stServer; if(iArg==1) { sPort=PORT; } else { sPort=atoi(cpAcmd[1]); } iCSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(iCSock<0) { printf("can not make a socket \n"); perror("iCSock"); return 0; } iLen=sizeof(stServer); bzero(&stServer, iLen); stServer.sin_family = AF_INET; stServer.sin_addr.s_addr =inet_addr(IP_SERVER); //stServer.sin_port = htons(PORT); stServer.sin_port = htons(PORT); iRet=connect(iCSock, (struct sockaddr *)&stServer, if(iRet==-1) { printf("connect error \n"); perror("connect"); close(iRet); return 0; } printf("server is running ... \n"); signal(SIGINT, End); while(1) { printf("input Message: "); fflush(stdout); FD_ZERO(&stRFd); FD_SET(0,&stRFd);//키보드에서 받은 값을 구조체에 잊 FD_SET(iCSock, &stRFd);//네트워크에서 받은 값을 저 select(iCSock+1, &stRFd, NULL, NULL, NULL); if(FD_ISSET(0, &stRFd)!=0) { iRet=read(0, caBuff, BSIZE); write(iCSock, caBuff, iRet); } if(FD_ISSET(iCSock, &stRFd)!=0) { iRet=read(iCSock, caBuff, BSIZE); if(iRet==0) { printf("server is disconnected \n"); End(0); return 0; } caBuff[iRet-1]=0; printf("\n [server: %s] \n", caBuff); } } close(iCSock); return 0; }
server.c
#include "tcp.h" int iCSock[MAXUSER]; int iSSock; void sRead(int iNum) { char caBuff[BSIZE]; int iRet; iRet=read(iCSock , caBuff, BSIZE); caBuff[iRet-1]=0; printf("\n Incomming Message: [%s]\n", caBuff); printf("input Message: "); fflush(stdout); } void End(int iNum) { close(iCSock); close(iSSock); exit (0); } int main(int iArg, char *cpAcmd[]) { int iRet; int iLen; int iTSock; int iUser; int iCnt; char caBuff[BSIZE]; int iMaxFD; fd_set stRFd; short sPort; struct sockaddr_in stServer; struct sockaddr_in stClient; if(iArg==1) { sPort=PORT; } else { sPort=atoi(cpAcmd[1]); } iSSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(iSSock<0) { printf("can not make a socket \n"); perror("iSSock"); return 0; } iLen= sizeof(stClient); bzero(&stServer, iLen); stServer.sin_family = AF_INET; stServer.sin_addr.s_addr = INADDR_ANY; //stServer.sin_port = htons(PORT); stServer.sin_port = htons(sPort); iRet=bind(iSSock, (struct sockaddr *)&stServer, iLe if(iRet==-1) { printf("binding error \n"); perror("bind"); close(iSSock); return 0; } iRet=listen(iSSock, 5); if(iRet==-1) { printf("listen error \n"); perror("listen"); close(iSSock); return 0; } printf("server is running ...[%d] \n", sPort); signal(SIGINT, End ); iUser=0; while(1) { printf("input Message: "); fflush(stdout); FD_ZERO(&stRFd); FD_SET(0,&stRFd); FD_SET(iCSock, &stRFd); FD_SET(iSSock, &stRFd); iMaxFD=iCSock+1; select(iMaxFD, &stRFd, NULL, NULL, NULL); if(FD_ISSET(iSSock, &stRFd)!=0) { iTSock=accept(iSSock, (struct sockaddr *)&s if(iTSock==-1) { printf("accept error \n"); perror("accept"); continue; } if(iUSER>=3) { close(iTSock); printf("Maxuser is over the number \n") continue; } iCSock[iUser]=iTSock; ++iUser; } if(FD_ISSET(0, &stRFd)!=0) { iRet=read(0, caBuff, BSIZE); for(iCnt=0; iCnt<iUser; ++iCnt) { write(iCSock[iCnt], caBuff, iRet); } } for(iCnt=0; iCnt<iUser; ++iCnt) { if(FD_ISSET(iCSock[iCnt], &stRFd)!=0) { iRet=read(iCSock[iCnt], caBuff, BSIZE); if(iRet==0) { printf("client is disconnected \n") --iUser; iCSock[iCnt]=iCSock[iUser]; return 0; } caBuff[iRet-1]=0; printf("\n [client: %s] \n", caBuff); } } } return 0; }
tcp.h
#ifndef __TCP_H__ #define __TCP_H__ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #include <sys/stat.h> #include <sys/signal.h> #include <stdlib.h> #include <sys/time.h> #define BSIZE 250 #define IP_SERVER "192.168.1.60" #define PORT 10000 #define MAXUSER 3 #endif //__TCP_H__
<출력결과>
오늘 수업 요약.
728x90
'코스웨어 > 16년 스마트컨트롤러' 카테고리의 다른 글
2016-04-26_조재찬_업무일지_디지털제어-RPi GPIO 제어 (0) | 2016.04.26 |
---|---|
20160425_김도관_업무일지_디지털제어_회로 기초 (0) | 2016.04.26 |
2016-04-25_조재찬_업무일지_디지털제어-회로 기초 (0) | 2016.04.25 |
20160421_장진웅_업무일지_공장내Network_일대일통신6_멀티채팅2, 패킷보기 (1) | 2016.04.21 |
20160419_장진웅_업무일지_공장내Network_일대일통신4_양방향 채팅 (0) | 2016.04.20 |
20160418_장진웅_업무일지_공장내Network_일대일통신3 (0) | 2016.04.18 |
버츄얼박스 com 개체를 만들수 없습니다 오류 (1) | 2016.04.17 |
20160415_장진웅_업무일지_공장내Network_일대일통신_입출력다중화(원시적인 채팅 프로그램) (1) | 2016.04.16 |