SOCKETS: Datei versenden über TCP
-
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