계속 반복하는 서버 클라이언트 프로그램을 만들려고 하는데 도와주세요.!
글쓴이: mengkyum / 작성시간: 수, 2009/05/13 - 12:56오후
제가 프로그래밍 하려는 것은
1. 타켓보드(linux)에서 1초마다 임의의 데이터를 windows-PC(client)로 받아오는 프로그램
2. 서버에서 임의의 명령어를 받을시 이미 저장되있던 파일을 windows-PC(client)로 보내는 프로그램
각각의 1,2, 소켓 프로그램을 구현하기 했서 이 2개를 합친다고 합쳤습니다.
동작 구현은 2번을 임의의 명령어로 동작시키고 1번에 해당하는 명령어를 치면 1번 동작을 하는 프로그램을
계속 반복하는 프로그램으로 만들려고
하는데 이게 자꾸 2번동작을 하고 나면 종료를 해버립니다.
while문으로 돌리는데도 자꾸 빠져나오는 이유가 뭘까요?.....'''''
조언좀 부탁드립니다.
//서버(linux) 소스 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #define BUFSIZE 30 void data(void); void error_handling(char *message); char spectrum_data[BUFSIZE]; int main(int argc, char **argv) { int serv_sd; int clnt_sd; int fd; char buf[BUFSIZE]; char message[BUFSIZE]; char command_start[BUFSIZE]="#start\n"; char command_file_send[BUFSIZE]="#send\n"; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; int clnt_addr_size; int len; int str_len; int status; int j=0; if(argc!=2){ printf("Usage : %s <port>\n", argv[0]); exit(1); } fd = open("/mnt/mmc/data.txt", O_RDONLY); if(fd == -1) error_handling("File open error"); serv_sd=socket(PF_INET, SOCK_STREAM, 0); if(serv_sd == -1) error_handling("socket() error"); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(atoi(argv[1])); if( bind(serv_sd, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1 ) error_handling("bind() error"); if( listen(serv_sd, 5)==-1 ) error_handling("listen() error"); clnt_addr_size=sizeof(clnt_addr); clnt_sd=accept(serv_sd, (struct sockaddr*)&clnt_addr,&clnt_addr_size); if(clnt_sd==-1) error_handling("accept() error"); ////////////////////////////////저장 파일 전송 ///////////////////////////////////////// while(1){ while( (str_len=read(clnt_sd, message,BUFSIZE)) != 0){ write(1, message,str_len); if(!strcmp(message,command_file_send)){ write(clnt_sd,command_file_send,str_len); //while(status==0){ while( (len=read(fd, buf, BUFSIZE)) != 0){ write(clnt_sd, buf, len); } //if(len==0) //status=1; //} //if(status==1) //break; } ///////////////////////////////// 데이터 실시간 전송 /////////////////////////////////////// else if(!strcmp(message,command_start)){ len=sizeof(spectrum_data); write(clnt_sd,command_start,str_len); while(1) { data(); write(clnt_sd,spectrum_data,len); write(1, spectrum_data,len); sleep(1); } } //message[str_len]=0; return; } //message=0; return; } ////////////////////////////////////////////////////////////////////////////////////////////// close(fd); close(clnt_sd); return 0; } void data(void) { char i; for(i=0;i<10;i++) { spectrum_data[i]= (0x30+(rand()%10)); spectrum_data[10]='\n'; } //return; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
//클라이언트(windows) 소스 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #include <windows.h> #define BUFSIZE 30 void ErrorHandling(char *message); int main(int argc, char **argv) { WSADATA wsaData; SOCKET hSocket; char buf[BUFSIZE]; char message[BUFSIZE]; char command_start[BUFSIZE]="#start\n"; char command_file_send[BUFSIZE]="#send\n"; char spectrum_data[BUFSIZE]; FILE* fp; SOCKADDR_IN servAddr; int len; int str_len; int status=0; if(argc!=3){ printf("Usage : %s <IP> <port>\n", argv[0]); exit(1); } fp = fopen("C:\\ex\\data.txt", "w"); if(fp == NULL) { ErrorHandling("File open error"); } if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) ErrorHandling("WSAStartup() error!"); /* 서버 접속위한 소켓 생성 */ hSocket=socket(PF_INET, SOCK_STREAM, 0); if(hSocket == INVALID_SOCKET) ErrorHandling("socket() error"); memset(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family=AF_INET; servAddr.sin_addr.s_addr=inet_addr(argv[1]); servAddr.sin_port=htons(atoi(argv[2])); if( connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR ) ErrorHandling("connect() error!"); while(1) { //status=0; fputs("-------COMMAND--------\n",stdout); fputs("1. #send = send file\n",stdout); fputs("2. #start = send data\n",stdout); fputs("----------------------\n",stdout); fputs("input command : ",stdout); fgets(message, BUFSIZE,stdin); send(hSocket,message,strlen(message),0); //명령어 전송 str_len=recv(hSocket,message,BUFSIZE-1,0); //서버의 응답 //////////////////////////// 저장 파일 전송 //////////////////////////// if(!strcmp(message,command_file_send)) { //while(status==0){ /* 데이터를 전송 받아서 파일에 저장한다 */ while( (len=recv(hSocket, buf, BUFSIZE, 0)) != 0 ) { fwrite(buf, sizeof(char), len, fp); } //if(len==0); //status=1; //} //if(status==1) //break; } ////////////////////////// 실시간 데이터 전송 //////////////////////////// else if(!strcmp(message,command_start)) { while(1){ len=recv(hSocket, buf, BUFSIZE, 0); printf("%s",buf); printf("\n"); Sleep(1000); } } return; } ///////////////////////////////////////////////////////////////////////// fclose(fp); closesocket(hSocket); WSACleanup(); return 0; } void ErrorHandling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
Forums:
linux가 없어서 테스트는 못해보겠지만..
루프를 빠져나온 직후에 메시지 출력 코드를 넣어서, 정말로 루프를 빠져나오는건지, 아니면 런타임오류(예외)때문에 프로그램이 그냥 죽어버리는 것인지부터 체크를 해봐야 할것 같습니다. 전자라면 루프가 빠져나오는 조건을 갖는 코드들 (리턴이라든지 break, goto등등)을 체크해보시면 되겠고 후자라면 포인터, 메모리 번지의 유효성이라든지, 연산과정에서 0으로 나누는 부분이 있는게 아닌지 등등을 체크해야 되겠죠.
저런 류의 프로그램이 항상 그렇듯.. 원인은 아주 단순한곳에 있지 않을까 싶습니다.
--
This is for you new people. I have just one rule :
Everyone fights, no one quits. If you don't do your job, I'll shoot you myself. Do you get me?
--
댓글 달기