SOCKETS: Datei versenden über TCP
-
Hallo Hustbär danke für deine Antwort, diese Fehler #1 wie du sie so schön nennst sind meistens gar nicht von mir das sind dann Fehler aus einem Tutorial unter www.c-worker.ch, da habe ich das nämlich her die anderen Sachen leuchten mir größten Teils ein nur bei strcmp liegt das Problem das er manchmal obwohl ich "Start"(wohlgemerkt genau in dieser form auch groß- und kleinschreibung) nicht erkennt, deswegen habe ich strstr genommen.
-
Wenns mit strcmp nicht geht dann steht eben nicht genau "Start" drinnen...
-
aber eigentlich hätte er doch genau das schicken sollen, oder etwa nicht?? beim ausgeben steht ja auch genau das drinne
-
Vielleicht steht da ja auch "Start " in dem empfangenen String drin (Leerzeichen fallen bei der Ausgabe nicht besonders auf ;)).
-
könnt sein aber das ganze funktioniert irgendwie auch so nicht der will einfach nicht in die datei schreiben
-
Hallo mal wieder ich habe das ganze nun nach langer Zeit gelöst
und wollte hier jetzt nur nochmal den Quellcode reinsetzen, falls wer das selbe Problem hat.Client:
#include <windows.h> #include <winsock2.h> #include <stdio.h> #include <iostream> #include <fstream> #define DMEGABYTE 2000000 using namespace std; //Prototypen int startWinsock(void); int send_block(SOCKET s, const char* data, int size); int recv_block(SOCKET s,char* data, int size); int main() { long rc; SOCKET s; SOCKADDR_IN addr; char buf[256]; // Winsock starten rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } // Socket erstellen s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } // Verbinden memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(5432); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr("127.0.0.1"); rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); return 1; } fstream file("C:\\winnn.exe",fstream::in | fstream::out | fstream::binary); file.seekg(0,fstream::end); //Pointer auf das Dateiende setzen unsigned long int length = file.tellg(); //Auslesen wie weit Pointer vom Anfang weg ist unsigned long int remaining = 0; file.seekg(0); //Pointer wieder auf Anfang setzen wichtig! char scan[256]; sprintf(scan,"%u",length); send(s,scan,strlen(scan),0); recv(s,buf,256,0); cout<<"Rueckerstattung empfangen!"<<scan<<" ---- "<<length<<endl; if(length >= DMEGABYTE) { char buffer[DMEGABYTE]; for(unsigned long int i = 0;i<length;i=i+DMEGABYTE) { file.seekg(i); remaining = length - i; if(remaining >= DMEGABYTE) { char * buffer = new char[DMEGABYTE]; file.read(buffer,DMEGABYTE); send_block(s,buffer,DMEGABYTE); cout << "2MB Durchlauf" << endl; delete buffer; rc = recv(s, buf, 256, 0); } else { char * remain = new char[remaining]; file.read(remain,remaining); send_block(s,remain,remaining); cout << "Abschluss" << endl; delete remain; } } } else { char buffer[length]; file.read(buffer,length); send_block(s,buffer,length); free (buffer); } cout<<"Senden Fertig!"<<endl; file.close(); closesocket(s); WSACleanup(); system("PAUSE"); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } // für blocking stream sockets int send_block(SOCKET s, const char* data, int size) { if(size == 0) return 0; if(size < 0) return SOCKET_ERROR; int remaining = size; while(remaining > 0) { int rc = send(s, data, remaining, 0); assert(rc != 0); // rc == 0 sollte mit blocking stream sockets niemals vorkommen if((rc == 0) || (rc == SOCKET_ERROR)) return SOCKET_ERROR; if(rc > remaining) { // huh??? return SOCKET_ERROR; } data += rc; remaining -= rc; } return size; } int recv_block(SOCKET s,char* data, int size) { if(size == 0) return 0; if(size < 0) return SOCKET_ERROR; int remaining = size; while(remaining > 0) { int rc = recv(s, data, remaining, 0); assert(rc != 0); // rc == 0 sollte mit blocking stream sockets niemals vorkommen if((rc == 0) || (rc == SOCKET_ERROR)) return SOCKET_ERROR; if(rc > remaining) { // huh??? return SOCKET_ERROR; } data += rc; remaining -= rc; } return size; }Der Server:
#include <iostream> #include <fstream> #include <stdlib.h> #include <windows.h> #include <winsock2.h> #define SERVER_PORT 5432 #define RECV_BUF_MAXLEN 256 #define SEND_BUF_MAXLEN 256 #define DMEGABYTE 2000000 using namespace std; long WinsockStartup(); int send_block(SOCKET s, const char* data, int size); int recv_block(SOCKET s,char* data, int size); int main() { long rc; SOCKET sockListen; SOCKET sockConnected; SOCKADDR_IN addr; int addrlen = sizeof(addr); char sendBuf[SEND_BUF_MAXLEN+1]; char recvBuf[256+1]; addr.sin_addr.s_addr = 0; addr.sin_family = AF_INET; addr.sin_port = htons(SERVER_PORT); // TCP-PORT! rc = WinsockStartup(); sockListen=socket(AF_INET,SOCK_STREAM,0); rc = bind(sockListen, (SOCKADDR*)&addr, sizeof(addr)); rc = listen(sockListen, 0); cout << "Waiting for a connection..." << endl; sockConnected=accept(sockListen, (SOCKADDR*)&addr, &addrlen); fstream file("C:\\Programme\\CopyWinnn3.exe",fstream::in | fstream::out | fstream::binary | fstream::trunc); rc = recv(sockConnected,recvBuf,256,0); recvBuf[rc] = '\0'; unsigned long length = 0; unsigned long remaining = 0; sscanf(recvBuf,"%u",&length); cout<<length<<endl; send(sockConnected,"Moin",4,0); if(length >= DMEGABYTE) { char buffer[DMEGABYTE]; for(unsigned long int i = 0;i<length;i=i+DMEGABYTE) { file.seekg(i); remaining = length - i; if(remaining >= DMEGABYTE) { char * buffer = new char[DMEGABYTE]; recv_block(sockConnected,buffer,DMEGABYTE); file.write(buffer,DMEGABYTE); cout << "2MB Durchlauf" << endl; delete buffer; send(sockConnected,"weiter",6,0); } else { char * remain = new char[remaining]; recv_block(sockConnected,remain,remaining); file.write(remain,remaining); cout << "Abschluss" << endl; delete remain; } } } else { char buffer[length]; rc = recv_block(sockConnected,buffer,length); file.write(buffer,length); free (buffer); } file.close(); cout<<"Fertig gesandt!"<<endl; system("PAUSE"); return 0; } long WinsockStartup() { long rc; WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 1); rc = WSAStartup( wVersionRequested, &wsaData ); return rc; } int send_block(SOCKET s, const char* data, int size) { if(size == 0) return 0; if(size < 0) return SOCKET_ERROR; int remaining = size; while(remaining > 0) { int rc = send(s, data, remaining, 0); assert(rc != 0); // rc == 0 sollte mit blocking stream sockets niemals vorkommen if((rc == 0) || (rc == SOCKET_ERROR)) return SOCKET_ERROR; if(rc > remaining) { // huh??? return SOCKET_ERROR; } data += rc; remaining -= rc; } return size; } int recv_block(SOCKET s,char* data, int size) { if(size == 0) return 0; if(size < 0) return SOCKET_ERROR; int remaining = size; while(remaining > 0) { int rc = recv(s, data, remaining, 0); //assert(rc != 0); // rc == 0 sollte mit blocking stream sockets niemals vorkommen if((rc == 0) || (rc == SOCKET_ERROR)) return SOCKET_ERROR; if(rc > remaining) { // huh??? return SOCKET_ERROR; } data += rc; remaining -= rc; cout<<"Size: "<<strlen(data)<<endl; } return size; }Viel Spaß damit

-
Da muss aber noch einiges verbessert werden!
-
z.B. ? Es funktioniert so wunderbar
-
Fehlerbehandlung? :p
-
Ich wollte ja nur mal zeigen wie es geht die Fehlerbehandlung kann man dann ja immer noch hinzufügen
-
was für ne fehlerbehandlung ?
meinste ne fehlerkorrektur oder was?
das programm läuft doch nur solange kein error kommt und den rest machen die sockets