munou

  • タグ:
  • タグはありません
/********************************************************/
/* */
/* */
/*80 */
/*使 */
/*ctrl-c */
/* */
/* */
/********************************************************/
/* */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
//#include <sys/socket.h>
//#include <arpa/inet.h>
//#include <unistd.h>
#pragma warning(disable:4996)
#pragma warning(disable:4244)
/**/
#define SERVERPORTNUM 81 /**/
#define MAXNUM 10/**/
#define MSGLENGTH 256 /**/
#define SEED 32767/**/
#define LINES 15/**/
#define MAXS 65535/**/
#define CHARS 4/**/
#define OUTPUTFILE "2gram.txt"/**/
/**/
void startserver(int *serversocket);/**/
void sendtext(int cs,char *msg);/**/
void sendmes(int cs,char msgs[LINES][MSGLENGTH]);/**/
void sendhead(int cs);/**/
void sendtail(int cs);/*html*/
void sendbox(int cs);/**/
void getmes(int cs,char msgs[LINES][MSGLENGTH]);
/**/
void decoder(char msg[],char sjismsg[]);/**/
void agent(char megs[LINES][MSGLENGTH]);
/**/
int getreplydata();/**/
void learn(char msgs[LINES][MSGLENGTH]);/*2-gram*/
void searchword(int *i,char word[]);/*2-gram*/
int cont(char msg[MSGLENGTH],int start);/**/
int iskanji(char chr);/*sjis1byte*/
int rnd(int n);/*n*/
/**/
char reply[MAXS][MSGLENGTH];/*2-gram*/
int replyno;/**/
/******************/
/* main() */
/******************/
int main()
{
int serversocket;/**/
int clientsocket;/**/
struct sockaddr_in client;/**/
unsigned int cl;/**/
char msgs[LINES][MSGLENGTH]={""};/**/
WSADATA wsaData;
SOCKET sock;
WSAStartup(MAKEWORD(2,0), &wsaData);
/**/
replyno=getreplydata();
/**/
srand(SEED);
/**/
startserver(&serversocket);
/**/
while(1){
cl=sizeof(client);
if((clientsocket
= accept(serversocket,(struct sockaddr *) &client,(int *)&cl))<0){
fprintf(stderr,"accept()\n");
exit(1);/**/}
/**/
getmes(clientsocket,msgs);
/**/
agent(msgs);
/**/
sendmes(clientsocket,msgs);
/**/
closesocket(clientsocket);
/**/
if(strlen(msgs[1])>0)/**/
learn(msgs);/**/
}
WSACleanup();
}
/***********************/
/* learn() */
/*2-garm */
/***********************/
void learn(char msgs[LINES][MSGLENGTH])
{
FILE *fp;/**/
int start,end,i;/**/
char word[MSGLENGTH];/**/
/**/
if((fp=fopen(OUTPUTFILE,"a"))==NULL){
fprintf(stderr,"fopen()\n");
exit(1);/**/
}
/*2-gram*/
start=0;
printf("\n");
while(start<strlen(msgs[1])){
end=cont(msgs[1],start);
for(i=0;i<end-start;++i)/**/
word[i]=msgs[1][start+i];
word[i]='';/**/
fprintf(fp,"%s\n",word);/**/
printf(" word:%s\n",word);
/**/
if(replyno<MAXS-1){
++replyno;
strcpy(reply[replyno],word);
}
start=end;/**/
}
/**/
fprintf(fp,"\n");
strcpy(reply[++replyno],"");
/**/
fclose(fp);
}
/**********************/
/* cont() */
/* */
/**********************/
int cont(char msg[MSGLENGTH],int start)
{
int i;
int state;
state=iskanji(msg[start]);/**/
for(i=start+2;i<strlen(msg);i+=2)
if(state!=iskanji(msg[i]))break;
return i;
}
/*************************/
/* iskanji() */
/*sjis1byte */
/*************************/
int iskanji(char chr)
{
if((unsigned char)chr>=0x88)return 1;
else return 0;
}
/******************************/
/* getreplydata() */
/* */
/******************************/
int getreplydata()
{
int lineno=0;/**/
int chrno=0;/**/
int chr;/**/
while(((chr=getchar())!=EOF)&&(lineno<MAXS)){
if(chr=='\n')/**/
chr='';/**/
reply[lineno][chrno]=chr;/**/
++chrno;/**/
if(chrno>(MSGLENGTH-10)){/**/
reply[lineno][chrno]='';
chrno=0;
++lineno;
}
else if(chr==''){/**/
chrno=0;
++lineno;
}
}
reply[lineno][chrno]='';
if(lineno==0){/*2-gram*/
fprintf(stderr,"2-gram\n");
exit(1);
}
printf("%d\n",lineno);
return lineno;/*2-gram*/
}
/**************************/
/* setreply() */
/* */
/**************************/
void setreply(char msgs[LINES][MSGLENGTH])
{
static int i=0;/**/
int ptr;/**/
int length;/**/
char word[MSGLENGTH];/**/
int counter;/**/
/**/
ptr=rnd(strlen(msgs[1]))/2*2;/**/
strncpy(word,&(msgs[1][ptr]),CHARS);/**/
word[CHARS]='';/**/
/*2-gram*/
printf("keyword:%s\n",word);
/*2-gram*/
strcpy(msgs[0],">");
searchword(&i,word);
strcat(msgs[0],word);/**/
if(strlen(reply[i])<=0)return;/**/
/*2-gram*/
while(strlen(msgs[0])<MSGLENGTH){
printf(" msgs[0]:%s reply[]:%s\n",msgs[0],reply[i]);
strcat(msgs[0],reply[i]);/**/
strcpy(word,reply[i]);
++i;if(i>replyno)i=0;
if(strlen(reply[i])<=0)break;/**/
searchword(&i,word);/**/
}
}
/**************************/
/* searchword */
/*2-gram */
/**************************/
void searchword(int *i,char word[])
{
int counter;/**/
/*2-gram*/
counter=0;
while(counter<=replyno){
if(strstr(reply[*i],word)!=NULL){
strcpy(word,reply[*i]);
++(*i);/**/
return;/**/
}
++(*i);
if(*i>replyno)*i=0;
++counter;
}
/**/
*i=rnd(replyno-1);
strcpy(word,reply[*i]);
++(*i);/**/
}
/*************************/
/* agent() */
/* */
/*************************/
void agent(char msgs[LINES][MSGLENGTH])
{
int i;
int select;
/*msgs[][]*/
for(i=LINES-1;i>0;--i)strcpy(msgs[i],msgs[i-1]);
/**/
if(strlen(msgs[1])>0){/**/
setreply(msgs);
printf("%s\n",msgs[0]);
}
}
/****************************/
/* getmes() */
/* */
/****************************/
void getmes(int cs,char msgs[LINES][MSGLENGTH])
{
char prev1,prev2,prev3;/**/
char msg[MSGLENGTH];/**/
int i;
prev1=prev2='';
i=0;
while(((recv(cs,&msg[i],1,0))>0)&&(i<MSGLENGTH-1)){/**/
if((msg[i]=='\n')&&(prev1='\r'))break;
/**/
prev2=prev1;prev1=msg[i];/**/
++i;
}
msg[i]='';/**/
if(strchr(msg,'=')!=NULL){/**/
/*msgs[][]*/
for(i=LINES-1;i>0;--i)strcpy(msgs[i],msgs[i-1]);
decoder(strchr(msg,'='),msgs[0]);
printf("%s\n",msgs[0]);/**/
}
prev1=prev2=prev3='';
while(((recv(cs,msg,1,0))>0)&&(i<MSGLENGTH-1)){
/*1*/
if((msg[0]=='\n')&&(prev1=='\r')&&(prev2=='\n'))break;
/**/
prev3=prev2;prev2=prev1;prev1=msg[0];/**/
}
}
/*************************/
/* decoder() */
/* */
/*************************/
void decoder(char msg[],char sjismsg[])
{
int i=1,j=0;
char hexch[3];/*216()*/
while(msg[i]!=' '){/*sjis*/
if(i>MSGLENGTH-2)break;/**/
else if(msg[i]=='+'){
sjismsg[j]=' ';/**/
++i;
}
else if(msg[i]=='%'){/**/
++i;
hexch[0]=msg[i];
hexch[1]=msg[i+1];
hexch[2]='';
sjismsg[j]=strtol(hexch,NULL,16);
++i;++i;
}
else {/**/
sjismsg[j]=msg[i];
++i;
}
++j;
}
sjismsg[j]='';/**/
}
/*************************/
/* sendmes() */
/* */
/*************************/
void sendmes(int cs,char msgs[LINES][MSGLENGTH])
{
int i;
/*html*/
sendhead(cs);
/**/
sendbox(cs);
/**/
for(i=0;i<LINES;++i){
sendtext(cs,msgs[i]);
sendtext(cs,"<br>\r\n");
}
/*html*/
sendtail(cs);
}
/*************************/
/* sendbox() */
/* */
/*************************/
void sendbox(int cs)
{
sendtext(cs,
"<form action=\"cgi\"method=\"get\">");
sendtext(cs,
"<input type=\"submit\"value=\"send\">\r\n");
sendtext(cs,
"<input type=\"text\"name=\"text\"size=\"80\"maxlength=\"60\">\r\n");
sendtext(cs,"</form>\r\n");
}
/**************************/
/* sendhead() */
/* */
/**************************/
void sendhead(int cs)
{
sendtext(cs,
"<html><head><title>chat server</title></head><body>\r\n");
}
/**************************/
/* sendtail() */
/*html */
/**************************/
void sendtail(int cs)
{
sendtext(cs,"</body></html>\r\n\r\n");
}
/***************************/
/* sendtext() */
/* */
/* */
/***************************/
void sendtext(int cs,char *msg)
{
send(cs,msg,strlen(msg),0);/**/
}
/***************************/
/* rnd() */
/*n */
/***************************/
int rnd(int n)
{
int rndno;/**/
while((rndno=(double)rand()/RAND_MAX*n)==n);
return rndno;
}
/***************************/
/* startserver() */
/* */
/***************************/
void startserver(int *serversocket)
{
struct sockaddr_in serveradd;/**/
/**/
if((*serversocket=
socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0){
fprintf(stderr,"socket()\n");exit(1);
/**/}
memset(&serveradd,0,sizeof(serveradd));
serveradd.sin_family=AF_INET;
serveradd.sin_addr.s_addr=htonl(INADDR_ANY);
serveradd.sin_port=htons(SERVERPORTNUM);
if(bind(*serversocket,(struct sockaddr *)&serveradd,
sizeof(serveradd))<0){
fprintf(stderr,"bind()\n");exit(1);
/**/}
/**/
if(listen(*serversocket,MAXNUM)<0){
fprintf(stderr,"listen()\n");exit(1);
/**/}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX