19. maj 2003 - 17:29
Der er
11 kommentarer og
1 løsning
server programmering
skal man lave en ny socket når man skal send en to forskellige hjemme side på browser, vi har en socket men efter vi har vist vores første hjemmeside og hvor der kan indtastes brugernavn og password ,og har hente de oplysninger tilbage til serveren.vi har behandlet dem og så skal vi igen vise mail
oplysning på browseren, det kan vi ikke, den siger at siden er sent men kan ikke få det vist, skal vi oprette en ny socket eller hvad...
Her er noget kode, jeg skev nogen kommentar hvor det går galt , jeg vidste ikke hvormeget jeg skulle sende. håber du kan hjælpe som med noget
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET; /* host byte order */
my_addr.sin_port = htons(MYPORT); /* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
== -1) {
perror("bind");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
while(1) { /* main accept() loop */
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
&sin_size)) == -1) {
perror("accept");
continue;
}
printf("server: got connection from %s\n", \
inet_ntoa(their_addr.sin_addr));
if (!fork()) { /* this is the child process */
FILE *file;
file = fopen("Log In.html" ,"rb");
if(file)
{
fseek(file, 0, SEEK_END);
int fileLength = ftell(file);
fseek(file, 0, SEEK_SET);
unsigned char *buffer = new unsigned char[fileLength];
fread(buffer, sizeof(char), fileLength, file);
fclose(file);
if(send(new_fd, buffer, fileLength, 0) == -1)
{
printf("*error* - could not send\n");
}
else
{
printf("*success* - sent %i bytes\n", fileLength);
}
}
int sockfd, numbyte;
if ((numbyte=recv(new_fd, userbuf_inn, MAXDATASIZE, 0)) == -1)
{
perror("recv username og password: ");
exit(1);
}
cout << "buffer indholder = " << userbuf_inn;
char username[20];
char password[20];
locate(userbuf_inn, "username=", username);// kalder funktionen locate//
locate(userbuf_inn, "password=", password);
printf("Username\%s\n",username);
printf("Password\%s\n",password);
/********************************************MSQL**************************************/
int status=0;
dbid=msqlConnect(NULL);
status=msqlSelectDB(dbid,"mininumdb");
if(status==-1)
{
perror("Efter_msqlconnect:");
cout<<"msqlErrMsg:databasen kører ikke"<<endl;
}
else
{
cout<<"************Forbindelsen til databasen er oprettet************"<<endl;
}
/******************Det indtastede username og password sendes til databasen**************/
cout<<"************1************"<<endl;
sprintf(j, "select *from bruger where brugernavn='%s' and adgangskode='%s'",username,password);
cout<<"************ 2************"<< username<<endl;
int i;
i=msqlQuery(dbid,"select *from bruger");
result=msqlStoreResult();
cout<< "antal rækker"<< msqlNumRows(result);
cout<< "j" << j;
i=msqlQuery(dbid,j);
cout<<"*****3******"<<endl;
cout<<"i="<< i <<endl;
result=msqlStoreResult();
if (i>=1)
{
cout<<"************4************ result ="<< result <<endl;
row=msqlFetchRow(result);
cout<<"************5************ row ="<< row <<endl;
cout<<"bruger er logget ind ="<< j<<endl;
}
else
{
cout<< " ingen data i databasen" << endl;
exit(1);
}
/*********************************indbakke hentes ind***************************/
(sprintf(j, "select *from indbakke where brugernavn='%s'",username));
i=msqlQuery(dbid,j);
result=msqlStoreResult();
string htmlstring;
ant_r= msqlNumRows(result);
ant_k=msqlNumFields(result);
cout<<"Antal kolonner:"<<ant_k<<endl;
cout<<"*****1******"<<endl;
printf("Resultat numrows: %d\n", ant_r);
FILE *indbakkefile;
indbakkefile = fopen("Indbakke.html" ,"rb");
if(indbakkefile)
{
fseek(indbakkefile, 0, SEEK_END);
int fileLength = ftell(indbakkefile);
fseek(indbakkefile, 0, SEEK_SET);
char *indbakkebuffer = new char[fileLength];
fread(indbakkebuffer, sizeof(char), fileLength, indbakkefile);
fclose(indbakkefile);
string htmlstring = indbakkebuffer; // convertering af char til sting
string html = tabelud( ant_r, ant_k,result, htmlstring);
/*FEJL ...... string html indholder den anden hjemmeside , men den viser indholdet på sammeside)*/
char htmlchr[5000] = {'\0'};
strncat( htmlchr, html.c_str(), 5000); // max 1000 chars
if(send(new_fd, htmlchr, strlen(htmlchr) , 0) == -1)
{
printf("*error* - could not send\n");
}
else
{
printf("*success* - sent %i bytes\n");
VI FÅR EN SUCCESS MEN INHOLDET BLIVER VIST PÅ SAMME SIDE
}
}
}
close(new_fd);
//exit(0);
//------------------------------------------------------------------
close(new_fd); /* parent doesn't need this */
while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
}
}
Først ert par små detaljer, som sikkert ikke betydre noget for problem-stillingen:
1)
file = fopen("Log In.html" ,"rb");
HTML er text og derfor bør den åbnes "r" ikke "rb"
2)
file = fopen("Log In.html" ,"rb");
if(file)
{
fseek(file, 0, SEEK_END);
int fileLength = ftell(file);
fseek(file, 0, SEEK_SET);
unsigned char *buffer = new unsigned char[fileLength];
fread(buffer, sizeof(char), fileLength, file);
fclose(file);
kan godt kræve meget memory hvis filen er stor.
3)
Det er noget meget langt kode, som uden tvivl med fordel kunne
splittes op i nogle funktioner.