29. august 2005 - 13:30
Der er
24 kommentarer og 1 løsning
Char og Winsock
Hej :) Har fundet en source som jeg videre udviklede på.. Men kan ikke få den til at sammenligne recv med noget char.. Den giver fejl ved accept socket :S .. Hvordan kan det være ?.. Bruger dev-c++ og Min source er: #include <stdio.h> #include <winsock2.h> int main() { // Initialize Winsock. WSADATA wsaData; int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); if ( iResult != NO_ERROR ) printf("Error at WSAStartup()\n"); // Create a socket. SOCKET m_socket; m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( m_socket == INVALID_SOCKET ) { printf( "Error at socket(): %ld\n", WSAGetLastError() ); WSACleanup(); return 0; } // Bind the socket. sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr( "10.92.5.59" ); service.sin_port = htons( 80 ); if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) { printf( "bind() failed.\n" ); closesocket(m_socket); return 0; } // Listen on the socket. if ( listen( m_socket, 1 ) == SOCKET_ERROR ) printf( "Error listening on socket.\n"); // Accept connections. SOCKET AcceptSocket; printf( "Waiting for a client to connect...\n" ); while (1) { AcceptSocket = SOCKET_ERROR; while ( AcceptSocket == SOCKET_ERROR ) { AcceptSocket = accept( m_socket, NULL, NULL ); } printf( "Client Connected.\n"); m_socket = AcceptSocket; break; } // Send and receive data. start: int bytesSent; int bytesRecv = SOCKET_ERROR; char sendbuf[100] = "Hello Daddy, What can i do for you ?"; char recvbuf[50]; char test[50]; send( m_socket, sendbuf, strlen(sendbuf), 0 ); recv( m_socket, recvbuf, 32, 0 ); if ( strcmpi ( recvbuf, "quit" ) == 0 { send( m_socket, "Goodbye!", strlen(sendbuf), 0 ); return 0; } else { send( m_socket, "Unkown Command", strlen(sendbuf), 0 ); } goto start; return 0; }
Annonceindlæg fra DE-CIX
29. august 2005 - 13:44
#1
du mangler ihvertfald en ) i linie 63
29. august 2005 - 13:45
#2
og så får jeg en warning på SOCKET og sign unsigned værdier men det er kun en warning
29. august 2005 - 13:52
#3
Omg.. Den fejl havde jeg ik lige spottet.. Men har stadig en fejl.. Når jeg connecter via telnet.. Og trykker på keys.. Så sender den det samme konstant.. Det skal gerne ende med såen at når jeg skriver "quit" i buffer så lukker den ned.. :P Men tror kun den sender 1 tegn af gangen.. og vil gerne have den til at sende et helt ord...
29. august 2005 - 14:06
#4
der er ingen garanti for hvordan recv læser om det bliver 1 gang med quit eller 4 gange med et bogstav af gangen put en while løkke omkring recv
29. august 2005 - 14:06
#5
recv( m_socket, recvbuf, 32, 0 ); if ( strcmpi ( recvbuf, "quit" ) == 0 recv nulterminerer ikke strengen så det test går ikke sandsyneligvis galt
29. august 2005 - 14:07
#6
send( m_socket, "Goodbye!", strlen(sendbuf), 0 ); strlen(sendbuf) er ikke længden af "Goodbye!"
29. august 2005 - 14:13
#7
Mener mere.. Hvordan jeg kan sende kommandoer fra telnet til server.. Såen jeg f.eks kan lave et online spil osv..
29. august 2005 - 14:28
#8
Okay har ryddet lidt op i koden.. Og forstået noget af det du forklarede.. Men det virker stadig ik :( #include <stdio.h> #include <winsock2.h> int main() { // Initialize Winsock. WSADATA wsaData; int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); if ( iResult != NO_ERROR ) printf("Error at WSAStartup()\n"); // Create a socket. SOCKET m_socket; m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( m_socket == INVALID_SOCKET ) { printf( "Error at socket(): %ld\n", WSAGetLastError() ); WSACleanup(); return 0; } // Bind the socket. sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr( "10.92.5.59" ); service.sin_port = htons( 80 ); if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) { printf( "bind() failed.\n" ); closesocket(m_socket); return 0; } // Listen on the socket. if ( listen( m_socket, 1 ) == SOCKET_ERROR ) printf( "Error listening on socket.\n"); // Accept connections. SOCKET AcceptSocket; printf( "Waiting for a client to connect...\n" ); while (1) { AcceptSocket = SOCKET_ERROR; while ( AcceptSocket == SOCKET_ERROR ) { AcceptSocket = accept( m_socket, NULL, NULL ); } printf( "Client Connected.\n"); m_socket = AcceptSocket; break; } // Send and receive data. int bytesSent; int bytesRecv = SOCKET_ERROR; char sendbuf[100]; char recvbuf[50]; char messages[20]; send( m_socket, "Welcome... Enter a Command: ", 32, 0 ); start: recv( m_socket, recvbuf, 32, 0 ); if ( strcmpi ( recvbuf, "quit" ) == 0 ) { send( m_socket, "Goodbye!", 32, 0 ); return 0; } else { send( m_socket, "Unkown Command", 32, 0 ); } goto start; return 0; }
29. august 2005 - 14:29
#9
prøv og læs i en while løkke indtil du modtager et linie skift !
29. august 2005 - 14:35
#10
Såen her: #include <stdio.h> #include <winsock2.h> int main() { // Initialize Winsock. WSADATA wsaData; int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); if ( iResult != NO_ERROR ) printf("Error at WSAStartup()\n"); // Create a socket. SOCKET m_socket; m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( m_socket == INVALID_SOCKET ) { printf( "Error at socket(): %ld\n", WSAGetLastError() ); WSACleanup(); return 0; } // Bind the socket. sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr( "10.92.5.59" ); service.sin_port = htons( 80 ); if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) { printf( "bind() failed.\n" ); closesocket(m_socket); return 0; } // Listen on the socket. if ( listen( m_socket, 1 ) == SOCKET_ERROR ) printf( "Error listening on socket.\n"); // Accept connections. SOCKET AcceptSocket; printf( "Waiting for a client to connect...\n" ); while (1) { AcceptSocket = SOCKET_ERROR; while ( AcceptSocket == SOCKET_ERROR ) { AcceptSocket = accept( m_socket, NULL, NULL ); } printf( "Client Connected.\n"); m_socket = AcceptSocket; break; } // Send and receive data. int bytesSent; int bytesRecv = SOCKET_ERROR; int x=0; char sendbuf[100]; char recvbuf[50]; send( m_socket, "Welcome... Enter a Command: ", 32, 0 ); do { recv( m_socket, recvbuf, 32, 0 ); if ( strcmpi ( recvbuf, "quit" ) == 0 ) { send( m_socket, "Goodbye!", 32, 0 ); return 0; } else { send( m_socket, "Unkown Command", 32, 0 ); } } while(x!=1); return 0; }
29. august 2005 - 15:08
#11
Hm.. Kan du ikke give mig et eksempel på hvordan jeg skal lave et while loop ? Og samtidig putte dem i den samme variable.. ? Ville være dejligt :P
29. august 2005 - 15:27
#12
konstruktion som den her er ofte brugt: /* read data */ p=(char *)&msg; ix=0; while((len=recv(sd2,p+ix,sizeof(msg)-ix,0))>0) { ix=ix+len; } [den her læser dog til client lukker - måske vil du kun læse til newline]
29. august 2005 - 23:17
#13
Yeah den skal læse til jeg trykker enter.. :) Eller newline som du siger :)
30. august 2005 - 13:26
#14
Arne.. :( Savner lidt hjælp :P Hehe..
30. august 2005 - 15:18
#15
måske /* read data */ p=(char *)&msg; ix=0; while(memchr(p,'\n',ix)==NULL) len=recv(sd2,p+ix,sizeof(msg)-ix,0)); ix=ix+len; }
30. august 2005 - 15:18
#16
men husk at der evt. godt kan komme noget tekst efter \n som du skal have overført til næste read
30. august 2005 - 19:07
#17
Umiddelbart kan jeg ikke få det til at virke.. Har rodet med det en del nu.. Ville være meget rart hvis du ku ligge det på min kode og evt. teste det.. For ser ik ud til min vil :S Nok bare mig der gør noget forkert her..
31. august 2005 - 22:04
#18
hvordan ser koden ud nu ?
01. september 2005 - 08:47
#19
Indtil videre ser den såen her ud men det fungere ik rigtigt: #include <stdio.h> #include <winsock2.h> int main() { // Initialize Winsock. WSADATA wsaData; int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); if ( iResult != NO_ERROR ) printf("Error at WSAStartup()\n"); // Create a socket. SOCKET m_socket; m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( m_socket == INVALID_SOCKET ) { printf( "Error at socket(): %ld\n", WSAGetLastError() ); WSACleanup(); return 0; } // Bind the socket. sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr( "10.92.5.59" ); service.sin_port = htons(80); if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) { printf( "bind() failed.\n" ); closesocket(m_socket); return 0; } // Listen on the socket. if ( listen( m_socket, 1 ) == SOCKET_ERROR ) printf( "Error listening on socket.\n"); // Accept connections. SOCKET AcceptSocket; printf( "Waiting for a client to connect...\n" ); while (1) { AcceptSocket = SOCKET_ERROR; while ( AcceptSocket == SOCKET_ERROR ) { AcceptSocket = accept( m_socket, NULL, NULL ); } printf( "Client Connected.\n"); m_socket = AcceptSocket; break; } // Send and receive data. int bytesSent; int bytesRecv = SOCKET_ERROR; int x=0; char sendbuf[100]; char recvbuf[50]; send( m_socket, "Welcome... Enter a Command: ", 28, 0 ); do { recv( m_socket, recvbuf, 32, 0 ); p=(char *)&msg; ix=0; while(memchr(p,'\n',ix)==NULL) len=recv(sd2,p+ix,sizeof(msg)-ix,0)); ix=ix+len; } if ( strcmpi ( recvbuf, "quit" ) == 0 ) { send( m_socket, "Goodbye!", 32, 0 ); printf ("Client Disconnected. \n"); return 0; } else { send( m_socket, "Unkown Command", 32, 0 ); } } while(x!=1); return 0; }
02. september 2005 - 22:07
#20
fungerer ikke rigtigt er vist en underdrivelse det compiler ikke p.g.a. uerklærede variable
02. september 2005 - 22:24
#21
eksempel som virker (men ikke gør noget): #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <windows.h> #include <errno.h> int main(int argc,char *argv[]) { 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 */ 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); ix=0; } } fin: /* close sockets */ closesocket(sd2); closesocket(sd); /* windows specifik */ WSACleanup(); return 0; }
04. september 2005 - 13:22
#22
Genialt.. :D Det virker jo som det skal :) Må jeg sende dig point ?
04. september 2005 - 13:27
#23
så ligger jeg et svar
04. september 2005 - 18:48
#24
Såen.. Tror du fik dem.. :)
04. september 2005 - 18:49
#25
jep
Kurser inden for grundlæggende programmering