/*** TCP Server ***/ #include#include #include #include #include #include #include #include #include #define DATAFILE "/Users/j05043/jikken/nagata/tcpip/data.txt" #define DELIMITS " \t\n\r" char datavalue[256]; int GetLineFromPeer(char *line, int hostsoc) { int i; for(i = 0 ; ; ) { if(1 != read(hostsoc,line + i,1)) continue; else { i++; *(line + i) = (char)0; } if(((char)('\n')) == (*(line + i - 1))) return i; } } char *GetKeywordData(char *key) { FILE *fp; char buff[256]; if((FILE *)NULL == (fp = fopen(DATAFILE,"r"))) return (char *)NULL; for(;;) { char *p; char *pp; fgets(buff,256,fp); if(feof(fp)) break; if(ferror(fp)) break; if((char *)NULL == (p = strtok(buff,DELIMITS))) continue; if((char *)NULL == (pp = strtok((char *)NULL,DELIMITS))) continue; if(0 == strcmp(p,key)) { fclose(fp); strcpy(datavalue,pp); return datavalue; } } fclose(fp); return (char *)NULL; } int main() { unsigned short port = 5683; int servsoc; int hostsoc; struct sockaddr_in srcAddr; struct sockaddr_in dstAddr; int dstAddrSize = sizeof(dstAddr); memset(&srcAddr, 0, sizeof(srcAddr)); srcAddr.sin_port = htons(port); srcAddr.sin_family = AF_INET; srcAddr.sin_addr.s_addr = htonl(INADDR_ANY); servsoc = socket(AF_INET, SOCK_STREAM, 0); bind(servsoc, (struct sockaddr *) &srcAddr, sizeof(srcAddr)); listen(servsoc, 1); printf("now waiting for client connect\n"); hostsoc = accept(servsoc, (struct sockaddr *)&dstAddr, &dstAddrSize); printf("Connected from %s\n", inet_ntoa(dstAddr.sin_addr)); char RecvBuff[256]; for(;;) { char *p; char SendBuff[256]; char *pp; (void)GetLineFromPeer(RecvBuff, hostsoc); /* Get 1 line from peer */ if(((char)('=')) == *(RecvBuff)) /* If End Mark */ { close(0); exit(0); } if((char *)NULL != (p = strchr(RecvBuff,'='))) { *p = (char)0; if((char *)NULL == (pp = GetKeywordData(RecvBuff))) sprintf(SendBuff,"%s=\n",RecvBuff); else sprintf(SendBuff,"%s=%s\n",RecvBuff,pp); (void)write(hostsoc,SendBuff,strlen(SendBuff)); } } }