willbend Skrevet 29. januar 2006 Del Skrevet 29. januar 2006 (endret) Hvorfor funker ikke dette: #include <stdio.h> #include "winsock.h" #include <iostream> using namespace std; int main(int argc, char *argv[]) { // 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 1; } // Connect to a server. sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr("193.69.165.21"); // vg.no clientService.sin_port = htons( 80 ); if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { printf( "Failed to connect.\n" ); WSACleanup(); return 1; } // Send and receive data. char sendbuf[32]="GET / HTTP/1.1"; char recvbuf[4000]; int bytesRecv; send( m_socket, sendbuf, strlen(sendbuf), 0 ); bytesRecv=recv( m_socket, recvbuf, strlen(recvbuf), 0 ); if ( bytesRecv == -1 ) { printf( "Connection Closed.\n"); WSACleanup(); return 1; } cout<< recvbuf; } Det bare står å blinker og ingenting skjer. Endret 29. januar 2006 av willbend Lenke til kommentar
dayslepr Skrevet 29. januar 2006 Del Skrevet 29. januar 2006 (endret) du må sende to newlines etter GET-headeren din edit: husk at "newline" er definert som CRLF i HTTP-spec'en .. så du må sende to tegn.. mener det er \r\n i C, om jeg husker rett (der \r da står for CR og \n for LF) Endret 29. januar 2006 av dayslepr Lenke til kommentar
willbend Skrevet 29. januar 2006 Forfatter Del Skrevet 29. januar 2006 (endret) Jeg skiftet "GET / HTTP/1.1" til "GET / HTTP/1.1\n\n" og "cout<< recv" til "cout<< recvbuf" men fikk ingen html kode, det ble bare blankt EDIT: GET / HTTP/1.1\r\n da blinker det bare GET / HTTP/1.1\n\r det samme GET / HTTP/1.1\n\n programmer avslutter men printer ut ingenting Endret 29. januar 2006 av willbend Lenke til kommentar
willbend Skrevet 29. januar 2006 Forfatter Del Skrevet 29. januar 2006 (endret) Hvis vi har char recvbuf[4000]; Hvis jeg skifter str. til 30 eller 60 da får jeg starten av html koden, men hvis jeg endrer til 100, 200 fikk jeg bare "HTT", skifter jeg til 1000 får jeg ingenting Jeg tror det har noe med str. på packets å gjøre? Må jeg pakke recv inni en loop eller no ? Endret 29. januar 2006 av willbend Lenke til kommentar
dayslepr Skrevet 29. januar 2006 Del Skrevet 29. januar 2006 to newlines blir \r\n\r\n Må jeg pakke recv inni en loop eller no ? jupp .. Lenke til kommentar
willbend Skrevet 29. januar 2006 Forfatter Del Skrevet 29. januar 2006 Når jeg bruker denne koden while(bytesRecv != -1) { bytesRecv=recv( m_socket, recvbuf, strlen(recvbuf), 0 ); cout<< recvbuf; } Da får jeg all html koden osv. men på slutten får jeg masse l> l> l> l> Hva er det fornoe ? Lenke til kommentar
dayslepr Skrevet 29. januar 2006 Del Skrevet 29. januar 2006 (endret) når cout får en peker til en char så skriver den ut tegn helt til den treffer tegnet \0 bruk std::write(recvbuf, bytesRecv); Endret 29. januar 2006 av dayslepr Lenke til kommentar
willbend Skrevet 29. januar 2006 Forfatter Del Skrevet 29. januar 2006 "Write is not a member of std" står det. Lenke til kommentar
dayslepr Skrevet 29. januar 2006 Del Skrevet 29. januar 2006 #include <fstream> bruk www.cppreference.com Lenke til kommentar
willbend Skrevet 29. januar 2006 Forfatter Del Skrevet 29. januar 2006 Fortsatt samme error når jeg inkluderer <fstream>. Lenke til kommentar
dayslepr Skrevet 29. januar 2006 Del Skrevet 29. januar 2006 paste koden (fitteforum med tåplige og unødvendige regler .. lang nok post nå?) Lenke til kommentar
willbend Skrevet 29. januar 2006 Forfatter Del Skrevet 29. januar 2006 #include <stdio.h> #include "winsock.h" #include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { // 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 1; } // Connect to a server. sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr("194.63.248.47"); clientService.sin_port = htons( 80 ); if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { printf( "Failed to connect.\n" ); WSACleanup(); return 1; } // Send and receive data. char sendbuf[60]="GET / HTTP/1.1\r\n\r\n"; char recvbuf[30]; int bytesRecv; send( m_socket, sendbuf, strlen(sendbuf), 0 ); while(bytesRecv != -1) { bytesRecv=recv( m_socket, recvbuf, strlen(recvbuf), 0 ); std::write(recvbuf, bytesRecv); } } Lenke til kommentar
dayslepr Skrevet 29. januar 2006 Del Skrevet 29. januar 2006 hum .. det var kanskje cout.write(....); Lenke til kommentar
willbend Skrevet 29. januar 2006 Forfatter Del Skrevet 29. januar 2006 Ja det funket, men programmet avsluttet ikke, det bare står å blinker, hva gjør jeg da ? Lenke til kommentar
dayslepr Skrevet 29. januar 2006 Del Skrevet 29. januar 2006 finner ut hvorfor «det står å blinker» så klart Lenke til kommentar
willbend Skrevet 29. januar 2006 Forfatter Del Skrevet 29. januar 2006 Jeg prøvde å slenge på WSACleanup(); return 1; etter loopen, men virket ikke. Hva gjør jeg ? Lenke til kommentar
dayslepr Skrevet 29. januar 2006 Del Skrevet 29. januar 2006 (endret) finner ut hva du skal gjøre edit: «hvordan kommer man frem til "hvem, hva, hvor"»? da finner du sikkert selv ut hvorfor, og da vet du hvordan Endret 29. januar 2006 av dayslepr Lenke til kommentar
willbend Skrevet 29. januar 2006 Forfatter Del Skrevet 29. januar 2006 Jeg skjønner ikke hvorfor det bare blinker. Lenke til kommentar
dayslepr Skrevet 30. januar 2006 Del Skrevet 30. januar 2006 (endret) det er fordi den "står fast" et sted .. den står sansynligvis å venter på noe fyr opp Linux og skriv man recv .. tast så /wait (søk på ordet wait) bruk en debugger og stepp deg igjennom koden skritt for skritt .. da ser du hvor den venter .. (edit: du stiller spørsmål som en 5-åring når du sier "den står bare å blinker" .........) Endret 30. januar 2006 av dayslepr Lenke til kommentar
kjetil7 Skrevet 31. januar 2006 Del Skrevet 31. januar 2006 (endret) Uten å ha studert koden din alt for nøye så ser det i hvert fall ut som at du har et buffer-problem. Du bør lage en egen socket-klasse som har recv_all() og send_all() funksjoner. Dette vil forenkle din hverdag betydelig. Her er eksempel på en ikke-optimalisert recv_all() som du kan bruke i programmet ditt: #include <vector> int recv_all(SOCKET sock, std::vector<char> & buffer) { static const int BLOCKSIZE = 4096; int bytes_read=0, offset=0; buffer.resize(BLOCKSIZE * 2); char* dst = &buffer[0]; while(0 < (bytes_read = recv(sock, dst, BLOCKSIZE, 0)) ) { offset += bytes_read; buffer.resize(offset + BLOCKSIZE); dst = &buffer[0] + offset; } buffer.resize(offset); return offset; } Du kan bruke den slik: std::vector<char> buffer; if(recv_all(m_socket, buffer)) { buffer.push_back(0); std::cout << &buffer[0] << std::endl; } Du bør også lese sjekke ut select()-funksjonen for å gjøre koden din mer robust. Du kan f.eks. lage en is_readable() funksjon som tar en timeout som parameter. Lykke til. Edit: 2 leifer Endret 31. januar 2006 av kjetil7 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå