select()
-
Hi!
Habe eine Server Anwendung:cout << "Server is starting socket...\n"; WSADATA WSAData; WSAStartup(MAKEWORD(2,0),&WSAData); SOCKET sock1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); srv.sin_family = AF_INET; srv.sin_port = htons( (unsigned short int) atol(argv[3])); srv.sin_addr.S_un.S_addr = INADDR_ANY; bind(sock1,(SOCKADDR*)&srv,sizeof(srv)); cout << "Server binds socket...\n"; listen(sock1,3); cout << "Server is listen...\n"; cli_size = sizeof(cli); sock1 = accept(sock1, (struct sockaddr*)&cli, &cli_size); s1=sock1; send(sock1,hello,strlen(hello),0); cout << "Client " << inet_ntoa(cli.sin_addr) << " has connected!\n"; send(sock1,argv[2],strlen(argv[2]),0); for(;;) { if (!kbhit()) { ch = getch(); cout << argv[2] << "> " << ch; cin.getline(data, 1024); send(sock1,data,strlen(data),0); } else { FD_ZERO(&fds); FD_SET(sock1, &fds); ret = select(sock1+1, &fds, NULL, NULL, &tv); if (FD_ISSET(sock1, &fds)) { len = recv(sock1,data,strlen(data),0); data[len]='\0'; if (first==true) { nick = data; first = false; } else { cout << nick << "> " << data << "\n"; } } } }
und eine Client Anwendung:
cout << "Connecting...\n"; WSADATA WSAData; WSAStartup(MAKEWORD(2,0),&WSAData); SOCKET sock1 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); cli.sin_family = AF_INET; cli.sin_port = htons( (unsigned short int) atol(argv[4])); cli.sin_addr.S_un.S_addr = inet_addr(argv[3]); if (connect(sock1,(SOCKADDR*)&cli,sizeof(cli))==SOCKET_ERROR) { cout << "Connecting failed!\n"; exit(0); } else { cout << "Connected with " << inet_ntoa(cli.sin_addr) << "\n\n"; } send(sock1,argv[2],strlen(argv[2]),0); for(;;) { if (!kbhit()) { ch = getch(); cout << argv[2] << "> " << ch; cin >> data; send(sock1,data,strlen(data),0); } else { FD_ZERO(&fds); FD_SET(sock1, &fds); ret = select(sock1+1, &fds, NULL, NULL, &tv); if (FD_ISSET(sock1, &fds)) { len = recv(sock1,data,strlen(data),0); data[len]='\0'; if (first==true) { nick = data; first = false; } else { cout << nick << "> " << data << "\n"; } } }
Problem ist, dass beide Anwendungen nichts erhalten. Habe schon mit telnet probiert. Senden tun sie, aber erhalten nichts!
Schätze mal das der Aufruf von select() falsch ist!
Schon mal Danke im voraus!wer
-
irgendwer schrieb:
sock1 = accept(sock1, (struct sockaddr*)&cli, &cli_size);
Ist das so gewollt?
Teil mal dein Programm in Funktionen oder so auf (und teste sie), da lässt sich der Fehler besser einschränken und beheben.
-
Ich denke schon.
Muss ich das nicht machen um später die IP des Clienten abrufen zu können?
siehe code:cout << "Client " << inet_ntoa(cli.sin_addr) << " has connected!\n";
Denke es liegt an der select() Funktion.
Habe schon auf einigen Seiten im Inet geschaut wo diese Funktion beschrieben wird, aber konnte nicht weiter kommen.wer
-
bei accept solltest du wohl einen anderen socket verwenden, sonst ist der andere müll! accept gibt den _neuen_ socket zurück, du überschreibst also deinen wächtersocket. des weiteren solltest du mal deine send aufrufe überprüfen, sprich die rückgabewerte anschauen. hast du ausserdem die FDSETs und das Timeval richtig gesetzt? ein bisschen komisch kommit auch vor, dass du nach belieben sendest und empfängst: send und recv sind blokierende aufrufe, also must du deine programme entsprechend ausrichten. ausserdem ist deine abfrage (if(!kbhit())) ein bisschen komisch. du solltest dir schon im klaren sein, wer mit senden und empfangen dran ist, wenn nicht, musst du entweder mit nonblocking arbeiten, oder multithreaded. ist dir ausserdem folgendes aufgefallen:
serverseite: Cli --> connected --> Svr Svr --> send --> Cli Svr --> send --> Cli [if-abfrage] a] Svr --> send --> Cli b] Cli --> send --> Svr clientseite: Cli --> connected --> Svr Cli --> send --> Svr [if-abfrage] a] Cli --> send --> Svr b] Svr --> send --> Cli
das kann überhauptnicht funktionieren
du musst bei blokierenden aufbau ein schema behalten, das dann auf beiden seiten durchexerziert wird. deine programme machen zu beginn beide ähnliche sachen, mindestens eins müsste aber gleich zu beginn was empfangen, weil der andere sendet. das variable senden/empfangen musst du multithreaded oder ohne blokierende sockets (schwieriger) angehen.