05. september 2005 - 10:29
Der er
15 kommentarer og 1 løsning
Sizeof() Problem..
Hej, Har et problem med Sizeof() den angiver ikke det korrekte sizeof.. Når jeg vil have den til at angive størrelsen angiver den det til 4 tegn.. Min kode ser såen her ud #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <windows.h> #include <errno.h> int main(int argc,char *argv[]) { newconnection: WSADATA WSAData; int sd,sd2,status,len,ix; char cmd[100],*p; struct sockaddr_in local; /* windows specifik */ WSAStartup(0x0101,&WSAData); /* create socket */ sd=socket(AF_INET,SOCK_STREAM,0); if(sd<0) { printf("Error creating socket: %s\n",strerror(errno)); goto fin; } /* bind socket */ local.sin_family=AF_INET; local.sin_port = htons(1234); local.sin_addr.s_addr = INADDR_ANY; status=bind(sd,(struct sockaddr *)&local,sizeof(local)); if(status<0) { printf("Error binding socket: %s\n",strerror(errno)); goto fin; } /* listen socket */ status=listen(sd,5); if(status<0) { printf("Error listening socket: %s\n",strerror(errno)); goto fin; } /* accept connection */ sd2=accept(sd,0,0); if(sd2<0) { printf("Error accepting socket: %s\n",strerror(errno)); goto fin; } /* read data */ printf("Client Logged in.. ! \n"); char* messages; p=(char *)&cmd; ix=0; while((len=recv(sd2,p+ix,1,0))>0) { ix=ix+len; if(cmd[ix-1]=='\n') { cmd[ix-1]='\0'; printf("CMD: %s\n",cmd); messages="Hello"; send(sd, messages, sizeof(messages),0); ix=0; } } fin: printf("Client Logged Out.. ! \n"); /* close sockets */ closesocket(sd2); closesocket(sd); /* windows specifik */ WSACleanup(); goto newconnection; return 0; } Og selveste problemer ligger vist i denne linie: send(sd, messages, sizeof(messages),0); - Prøv eventuelt at compilere det og connect i telnet.. Forstår ik problemet :S På forhånd tak
Annonceindlæg fra Salesforce
05. september 2005 - 10:39
#1
det er da helt rigtigt ! sizeof en pointer er typisk 4 byte
05. september 2005 - 10:40
#2
i det konkrete tilfælde: prøv med strlen
05. september 2005 - 11:15
#3
ArhG .. :D Havde prøvet med Strlen Men det virkede ik.. Så prøvede jeg igen nu .. Men det virker nu.. :P Skriv lige et svar :)
05. september 2005 - 11:20
#4
svar
05. september 2005 - 11:23
#5
Men nu har jeg fået et nyt problem.. Hvis du li vil hjælpe med det oss :P Eller ska jeg oprette et nyt spørgsmål ?
05. september 2005 - 11:50
#6
bare spørg
05. september 2005 - 12:04
#7
Kan ikke få IF til at virke.. KOden ser såen her ud.. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <windows.h> #include <errno.h> int main(int argc,char *argv[]) { newconnection: WSADATA WSAData; int sd,sd2,status,len,ix; char cmd[100],*p; struct sockaddr_in local; /* windows specifik */ WSAStartup(0x0101,&WSAData); /* create socket */ sd=socket(AF_INET,SOCK_STREAM,0); if(sd<0) { printf("Error creating socket: %s\n",strerror(errno)); goto fin; } /* bind socket */ local.sin_family=AF_INET; local.sin_port = htons(1234); local.sin_addr.s_addr = INADDR_ANY; status=bind(sd,(struct sockaddr *)&local,sizeof(local)); if(status<0) { printf("Error binding socket: %s\n",strerror(errno)); goto fin; } /* listen socket */ status=listen(sd,5); if(status<0) { printf("Error listening socket: %s\n",strerror(errno)); goto fin; } /* accept connection */ sd2=accept(sd,0,0); if(sd2<0) { printf("Error accepting socket: %s\n",strerror(errno)); goto fin; } /* read data */ printf("Client Logged in.. ! \n"); char* messages; p=(char *)&cmd; ix=0; messages="Welcome Online! "; send(sd2, messages, strlen(messages),0); while((len=recv(sd2,p+ix,1,0))>0) { ix=ix+len; if(cmd[ix-1]=='\n') { cmd[ix-1]='\0'; printf("Remote User Input: %s\n",cmd); messages="<console> "; send(sd2, messages, strlen(messages),0); ix=0; /*Code start*/ if ( strcmpi ( cmd, "quit" ) == 0 ) { messages="Aight, Goodbye ! :) \n"; send(sd2, messages, strlen(messages),0); goto fin; } else { messages="Unknown Command "; send(sd2, messages, strlen(messages),0); } /*Code start*/ } } fin: printf("Client Logged Out.. ! \n"); /* close sockets */ closesocket(sd2); closesocket(sd); /* windows specifik */ WSACleanup(); goto newconnection; return 0; } Det sku se ud til at virke.. Men det gør det ik :S
05. september 2005 - 12:14
#8
kan du præcisere "virker ikke" ?
05. september 2005 - 12:15
#9
Altså.. Den ska sammenligne inputtet fra CMD til at være "quit" hvis det matcher skal den lukke.. Men den vil ikke få det til at matche.. Selvom de egentlig er Ens.. Så vil den ikke matche dem..
05. september 2005 - 12:24
#10
remote user input er "quit" men den skriver alligevel "unknown command" ?
05. september 2005 - 12:25
#11
Ja nemlig.. Det er det som er mit problem.. Hehe..
05. september 2005 - 12:28
#12
skud fra hoften: if(cmd[strlen(cmd)-1]=='\r') cmd[strlen(cmd)-1] = '\0';
05. september 2005 - 12:29
#13
Hm.. Kan du ikke prøve at sætte det ind i min kode ?.. Forstår nemlig ikke lige helt præcist liniens funktion..
05. september 2005 - 12:35
#14
lige efter linien: cmd[ix-1]='\0';
05. september 2005 - 12:42
#15
Yeah Tak.. Det virker :D - Smid lige et svar.. Og hvis du har for meget tid, vil du så ikke lige prøve at forklare hvad linien "if(cmd[strlen(cmd)-1]=='\r') cmd[strlen(cmd)-1] = '\0';" gør ?
05. september 2005 - 12:53
#16
jeg hart svaret fo rlang tid siden og du har accepteret det her var en ekstra jeg fjerner er trailing \r fordi der sendes quit\r\n den forrige linie fjerner \n og den vi har tilføjer nu fjerner \r
Kurser inden for grundlæggende programmering