1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
925
925
EMPFEHLEN
-
22.11.08 21:08 #1
- Registriert seit
- Mar 2008
- Beiträge
- 143
Hallo!
Ich habe folgenden Server kompilieren können und er arbeitet auch wunderbar:
Jetzt wollte ich das ganze in winAPI verpacken, naja.. klappt eigentlich auch, nur, dass er sich jetzt bei acceptSocket aufhängt und nciht mehr reagiert!Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
#include <windows.h> #include <stdio.h> #define MAX_CLIENTS 10 using namespace std; int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } int main() { long rc; SOCKET acceptSocket; SOCKADDR_IN addr; char buf[256]; char buf2[300]; FD_SET fdSet; SOCKET clients[MAX_CLIENTS]; rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } acceptSocket=socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket erstellt!\n"); } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(12345); addr.sin_addr.s_addr=INADDR_ANY; rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) { printf("Fehler: bind, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket an port 12345 gebunden\n"); } rc=listen(acceptSocket,10); if(rc==SOCKET_ERROR) { printf("Fehler: listen, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("acceptSocket ist im listen Modus....\n"); } for(unsigned short i=0;i<MAX_CLIENTS;i++) { clients[i]=INVALID_SOCKET; } while(1) { FD_ZERO(&fdSet); // Inhalt leeren FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufügen // alle gültigen(!=INVALID_SOCKET) client sockets hinzufügen for(unsigned short i=0;i<MAX_CLIENTS;i++) { if(clients[i]!=INVALID_SOCKET) { FD_SET(clients[i],&fdSet); } } rc=select(0,&fdSet,NULL,NULL,NULL); if(rc==SOCKET_ERROR) { printf("Fehler: select, fehler code: %s\n",WSAGetLastError()); return 1; } //wenn acceptSocket im fd_set(und platz) => verbindung annehmen if(FD_ISSET(acceptSocket,&fdSet)) { // einen freien platz für den neuen client suchen, und die verbingung annehmen for(unsigned short i=0;i<MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { clients[i]=accept(acceptSocket,NULL,NULL); printf("Neuen Client angenommen (%d)\n",i); break; } } } // prüfen welche client sockets im fd_set sind for(unsigned short i=0;i<MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { continue; // ungültiger socket=>i++ } if(FD_ISSET(clients[i],&fdSet)) { rc=recv(clients[i],buf,256,0); // prüfen ob die verbindung geschlossen wurde oder ein fehler auftrat if(rc==0 || rc==SOCKET_ERROR) { printf("Client %d hat die Verbindung geschlossen\n",i); closesocket(clients[i]); clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben für andere } else { buf[rc]='\0'; // daten ausgeben und eine antwort senden printf("Client %d hat folgendes gesandt: %s\n",i,buf); // antwort senden sprintf(buf2,"Du mich auch %s\n",buf); send(clients[i],buf2,(int)strlen(buf2),0); } } } } }
Hier ein CODEAuszug:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
if(lParam == (LPARAM)hStart) { if(HIWORD(wParam) == BN_CLICKED) EnableWindow(hStart,false); EnableWindow(hEdit2,false); EnableWindow(hStandard,false); EnableWindow(hStop,true); GetWindowText(hEdit2, lpString2, GetWindowTextLength(hEdit2)+1); GetWindowText(hEdit3, lpString3, GetWindowTextLength(hEdit3)+1); ofstream mo ("C:/Programme/server.txt",ios::trunc); mo << lpString2 << endl << lpString3; mo.close(); delete lpString2; delete lpString3; GetWindowText(hFortschritt, lpString_Fortschritt, GetWindowTextLength(hFortschritt)+1); string bla ="Server wurde erfolgreich gestartet."; str_fortschritt =""; str_fortschritt+= lpString_Fortschritt; str_fortschritt+="\r\n"; str_fortschritt+=bla; SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); rc=startWinsock(); if(rc!=0) { str_fortschritt+="\r\n"; str_fortschritt+="Fehler: StartWinsock, Fehler Code:"; str_fortschritt+=rc; SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); return 1; } else { str_fortschritt+="\r\n"; str_fortschritt+="Winsock gestartet!"; SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); } // Socket erstellen acceptSocket=socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { str_fortschritt+="\r\n"; str_fortschritt+="Fehler: Der Socket konnte nicht erstellt werden, fehler code: "; str_fortschritt+=WSAGetLastError(); SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); return 1; } else { str_fortschritt+="\r\n"; str_fortschritt+="Socket erstellt!"; SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(port);//Standard: 2001 addr.sin_addr.s_addr=ADDR_ANY; rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) { str_fortschritt+="\r\n"; str_fortschritt+="Fehler: Socketbinding, fehler code: "; str_fortschritt+=WSAGetLastError(); SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); return 1; } else { str_fortschritt+="\r\n"; str_fortschritt+="Socket an Port "; string g; ifstream mo ("C:/Programme/server.txt"); getline(mo,g,'\n'); mo.close(); str_fortschritt+=g; str_fortschritt+=" gebunden"; SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); } SendMessage(hwnd,WM_SIZE,0,0); //UpdateWindow rc=listen(acceptSocket,10); if(rc==SOCKET_ERROR) { str_fortschritt+="\r\n"; str_fortschritt+="Fehler: Listen Socket, fehler code: "; str_fortschritt+=WSAGetLastError(); SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); return 1; } else { str_fortschritt+="\r\n"; str_fortschritt+="acceptSocket ist im listen Modus....."; SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); SendMessage(hwnd,WM_SIZE,0,0); } for(unsigned short i=0;i<MAX_CLIENTS;i++) { clients[i]=INVALID_SOCKET; } while(1){ FD_ZERO(&fdset); //Inhalt leeren FD_SET(acceptSocket, &fdset); //Den Socket der Verbindungen annimt hinzufügen //Alle gültigen(!=INVALID_SOCKET)client sockets hinzufügen: for(unsigned short i=0;i<MAX_CLIENTS;i++) { if(clients[i]!=INVALID_SOCKET) { FD_SET(clients[i],&fdset); } } rc = select(0,&fdset,NULL,NULL,NULL); if(rc==SOCKET_ERROR) { str_fortschritt+="\r\n"; str_fortschritt+="select-Fehler, Code:"; int vy = WSAGetLastError(); char pq[256]; //int ->char Konvertierung! sprintf(pq, "%d",vy); str_fortschritt +=pq; SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); return 1; } //wenn accepsocket im fd_set ist und genügend platz => verbindung annehmen if(FD_ISSET(acceptSocket,&fdset)) { //freien Platz suchen for(unsigned short i = 0; i< MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { clients[i]=accept(acceptSocket,NULL,NULL); str_fortschritt+="\r\n"; str_fortschritt+="Neuen Client "; str_fortschritt+=i; str_fortschritt+=" angenommen."; str_fortschritt+=WSAGetLastError(); SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); break; } } } //prüfen welche ClientSockets im fd_set sind: for(unsigned short i = 0; i<MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { continue;//ungültig, =>weitermachen(i++) } if(FD_ISSET(clients[i],&fdset)) { rc = recv(clients[i],buf,256,0); //prüfen, ob Verbindung besteht, oder Fehler: if(rc==0 || rc==SOCKET_ERROR) { str_fortschritt+="\r\n"; str_fortschritt+="Client "; str_fortschritt+=i; str_fortschritt+=" hat die Verbindung abgebrochen."; SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); closesocket(clients[i]); clients[i]=INVALID_SOCKET; //Platz freimachen } else { buf[rc]='\0'; printf("Client %d hat dolgendes gesandt: %s\n",i,buf); sprintf(buf2, "Du mich acuh %s",buf); send(clients[i],buf2,(int)strlen(buf2),0); } } } //FOR } //WHILE } //hStart }//switch(messages) return 0; }//CALLBACKPROC.
Vielen Dank für die Mühen schoneinmal!
lg
kickerxy
-
Wenn ich das richtig sehe bleibt dein Programm bei "select()" stehen, den Select warrtet darauf bis der Socket bereit ist. Das Problem kannst du übergeben, in dem du einen Sinnvolen letzten Parameter übergibst, damit select sofort abbricht.
der Part dürfte dann in etwa so aussehen:
Code cpp:1 2 3
timeval t_time t_time.tv_sec = t_time.tv_usec = 0; rc = select(0,&fdset,NULL,NULL,&t_time);
mfg
SGSSGene
-
23.11.08 13:51 #3
- Registriert seit
- Mar 2008
- Beiträge
- 143
Vielen Dank! Ich denke, dass bringt mich schon einen großen Schritt weiter!
Ich habs eingebaut, hab auch mal ne variable in der while Schleife hochzählen lassen und in eine .txt schreiben lassen, deshalb weiß ich, dass er jetzt die whileschleife immerwieder ausführt und nicht mehr bei select stehenbleibt.
Dennoch nimmt er keinen Client an, zumindestens denke ich das..., obwohl im client "verbunden" steht, hier der Auschnitt vom Client:Der Server jedoch ist in der whileschleife und reagiert nicht mehr, und zeigt auch nicht an, dass ein Client connected hat/will.Code :1 2
rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR){//...}else{//->Verbunden}
#edit: mir ist grade noch etwas aufgefallen:
Wenn ich ein folgendes mache
also ein boolean auswerte
läuft es! Er nimmt einen neuen Client an, bricht dann natürlich ab, aber immerhin einen kann er jetzt annehmenCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
#include.... .... bool verbunden = false; .... int WINAPI WinMain.... ..... while(1){ if(verbunden==true){ break; }else{ FD_ZERO(&fdset); //Inhalt leeren FD_SET(acceptSocket, &fdset); //Den Socket der Verbindungen annimt hinzufügen //Alle gültigen(!=INVALID_SOCKET)client sockets hinzufügen: for(unsigned short i=0;i<MAX_CLIENTS;i++) { if(clients[i]!=INVALID_SOCKET) { FD_SET(clients[i],&fdset); } } timeval t_timet_time; t_timet_time.tv_sec=t_timet_time.tv_usec=0; rc = select(0,&fdset,NULL,NULL,&t_timet_time); if(rc==SOCKET_ERROR) { str_fortschritt+="\r\n"; str_fortschritt+="select-Fehler, Code:"; int vy = WSAGetLastError(); char pq[256]; //int ->char Konvertierung! sprintf(pq, "%d",vy); str_fortschritt+=pq; SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); return 1; } //wenn accepsocket im fd_set ist und genügend platz => verbindung annehmen if(FD_ISSET(acceptSocket,&fdset)) { //freien Platz suchen for(unsigned short i = 0; i< MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { clients[i]=accept(acceptSocket,NULL,NULL); str_fortschritt+="\r\n"; str_fortschritt+="Neuen Client "; str_fortschritt+=i; str_fortschritt+=" angenommen."; str_fortschritt+=WSAGetLastError(); SendMessage(hFortschritt, WM_SETTEXT, 0, (LPARAM)str_fortschritt.c_str()); verbunden = true; break; } } }
Nun hab ich warscheinlich nur noch das Problem, dass er sich in der whileschleife zu sehr auslastet?
lg
kickerxyGeändert von kickerxy123 (23.11.08 um 13:53 Uhr)
-
Hallo,
Ich habe mir aus diversen Foren und Tutorial-Seiten einen Server und einen Client auf CMD-Fenster Basis ge*****t. Nun bin ich dabei den Server unter WinApi du *****en, nur weiß ich net wo ich meine select()-Schleife einbaun sollte... Kann mir jemand helfen****
Hier wären meine Source-Dateien:
http://www.megaupload.com/?d=T5UMOU7T
mfg. Poseidon
-
28.08.10 18:33 #5
So einige schreiben immer Sternchen (*****), was soll das heißen****
Willst du etwa von der Konsolenanwendung zur richtigen Windows-Applikation portieren?
Wann willst du denn den Code ausführen, beim Start? Nach einer Betätigung eines Button?mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
Ähnliche Themen
-
[c++/winApi]Socket - Buttons
Von kickerxy123 im Forum C/C++Antworten: 3Letzter Beitrag: 02.12.08, 00:00 -
socket programming problem mit select()
Von scriptkiddiie im Forum C/C++Antworten: 4Letzter Beitrag: 14.04.08, 16:19 -
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 30.01.08, 10:24 -
'Socket Error #10038 Socket operation on non-socket'
Von jupp2oo8 im Forum C/C++Antworten: 2Letzter Beitrag: 29.01.08, 14:59 -
Server Socket und Client Socket
Von spiderman21 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 2Letzter Beitrag: 23.10.07, 17:00





Zitieren

Login





