/ Forside/ Teknologi / Udvikling / C/C++ / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Chatserver - slet
Fra : Razuki
Vist : 432 gange
80 point
Dato : 29-01-04 13:33

Jeg er ikke så god til C så jeg vil gerne have lidt hjælp hvis nogen kan hjælpe.
Det drejer sig om en chatserver, jeg har fået fliket sammen med udgangspunkt i et eksempel, jeg fandt i en temmelig slidt lærebog. mit program virker men jeg har et problem.
Jeg mangler en kode så man kan slette hvis man f.eks skriver forkert.
Hvis nogen har en brugbar kodestump vil jeg blive meget glad.
Den kode jeg bruger ligenu er:

#include <stdio.h> /* printf(), fprintf() */
#include <winsock2.h> /* Til at snakke med internet protokol */
#include <conio.h>
main()
{
WSADATA wsaData;
int serverSocket; /* Socket descriptor for server */
int clientSocket; /* Socket descriptor for client */
int tast; /* hvilken tast */
struct sockaddr_in ServerAdr; /* Server adresse (Vores adresse */
struct sockaddr_in ClientAdr; /* klientens addresse */
unsigned short ServerPort; /* Port som vores server lytter på*/

#define RCVBUFSIZE 25 /* Antal tegn vi højst vil modtage af gangen */
char modtageBuffer[RCVBUFSIZE]; /* Buffer for modtagene data */
int Bufferstr; /* Antal tegn vi har modtaget*/
long imode=1; /* forhindrer blocking */
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) /* Start Winsock 2.0 DLL */
{
printf("WSAStartup() fejler, kan ikke starte winsock");
return; /* Afbryder programmet */
}

printf("Vælg Serverport. Som Standard anbefales 23\n");
scanf ("%i", &ServerPort);
/* Vi laver en "Socket" som kan stå og lytte */
if ((serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
printf("Oprettelse af socket fejler, kan ikke starte winsock");
return; /* Afbryder programmet */
}
printf("Program startet. Initialiserer server.\n");
/* Serverens adressere */
memset(&ServerAdr, 0, sizeof(ServerAdr)); /* Nulstiller først det hele */
ServerAdr.sin_family = AF_INET; /* Internet adressesystem*/
ServerAdr.sin_addr.s_addr = htonl(INADDR_ANY); /* Alle klienter kan komme ind */
ServerAdr.sin_port = htons(ServerPort); /* Den port vi lytter på */

/* Nu putter vi indstillingerne ind på vores "socket" */
if (bind(serverSocket, (struct sockaddr *) &ServerAdr, sizeof(ServerAdr)) < 0)
{
printf("Bind mislykket");
return; /* Afbryder programmet */
}

printf("Initalisering er klaret\n");

/* Så er vi klar til at lytte og vente */
listen(serverSocket,1);

printf("Lytter; Forbindelse accepteres automatisk ved signal\n");

/* Hvis nogen bider på krogen så skal vi acceptere en forbindelse*/

clientSocket = accept(serverSocket, (struct sockaddr *) &ClientAdr, NULL);
ioctlsocket(clientSocket,FIONBIO,&imode);
printf("Forbindelse etableret til %s\n", inet_ntoa(ClientAdr.sin_addr));
tast =0;
while (tast != 27)
{


if (kbhit())
{
tast = getch();
printf("%c", tast);
send(clientSocket, &tast,1,0);
if (tast ==13)
{
tast = 10;
printf("%c",tast,1,0);
}
}
Bufferstr = recv(clientSocket, modtageBuffer, RCVBUFSIZE, 0);
if (Bufferstr > 0)
{
/* Send det tilbage, så vedkommende kan se hvad der bliver skrevet */
send(clientSocket, modtageBuffer, Bufferstr, 0);
modtageBuffer[Bufferstr] = 0; /* Vi skal afslutte teksten */
printf("%s",modtageBuffer); /* Skriv teksten ud på skærmen */
}
}
printf ("Lukker forbindelse\n") ;
closesocket(clientSocket); /* luk for forbindelsen */
printf("Programmet er nu afsluttet\n");

}

Jeg mangler kode til at slette under chatten og, jeg vil også gerne vide hvor jeg evt. skal sætte den ind..
På forhånd tak. Razuki

 
 
Kommentar
Fra : BertelBrander


Dato : 29-01-04 19:59

Jeg er ikke sikker på at man kan slette under en chat. Du har jo sendt det du vil have slettet. Men det var måske en ide at prøve at trykke på <Backspace> og se om det virker.

Hvis det ikke virker kan du prøve at sende karakterne fra 0 > 32 undtagen 10 og 13, f.ex:

int zz;
for(zz = 0; zz < 32; zz++)
if(zz != 10 && zz != 13)
send(clientSocket, &zz, 1, 0);

Ellers må du lade brugeren skrive en hel sætning og trykke <enter> inden du sender beskeden, for at give ham/hende en chance for at rette inden det sendes.

Kommentar
Fra : Razuki


Dato : 30-01-04 08:34

Backspace virker ikke. Den går et tegn tilbage men slette ikke det der står.
Det andet var nok en god ide, men getch koden tillader jo kun brugeren at skrive 1 tegn...

Kommentar
Fra : BertelBrander


Dato : 31-01-04 00:07

Der er så vidt jeg kan se to problemer:

1: At slette karakteren hos den der skriver.
2: At slette karakteren hos den der læser.

Den eneste løsning på begge disse problermer er, så vidt jeg ved, at hente en hel linie fra brugeren og først sende den når han/hun trykker <enter>
Til det formål kan man f.ex. bruge fgets(...) eller man kan lave en funktion der bruger getch()/kbhit(). fgets() har den fordel at den er lettere at bruge, men den ulempe at man ikke kan se hvad den anden/de andre skriver mens man taster.

Kommentar
Fra : Razuki


Dato : 31-01-04 09:40

Hvordan kan man evt. helt præsist gøre det, i mit eksempel?
Beklager min uvidenhed...



Kommentar
Fra : BertelBrander


Dato : 31-01-04 20:53

Der er lige et par ting jeg synes vil skal på det rene inden vi går videre.

Er det verdens bedste chat program som du vil have nogen til at lave for dig? Hvis det er tilfældet kunne du jo state med søge lidt på google og/eller besøge: www.sourceforge.net.

Hvis du derimod er ude på at lære at programere og lave din eget chat program vil/kan jeg godt forsøge at hjælpe.

Først skal vi finde ud af om du vil lave en meget simpel version eller om du har ambitioner om at lave noget lidt mere avanceret?

Hvis du vil lave noget simpelt erstater du blot kbhit() og getch() med fgets(). Hvis ikke du har nogen ide om hvordan det skal gøres, vil jeg foreslå dig at lære noget (mere) grundlæggende programmering inden du kaster dig over chat programmet.

Kommentar
Fra : Razuki


Dato : 02-02-04 08:28

Nej vi snakker ikke om verdens bedste chatprogram. Vi har et projekt igang hvor vi skal finde ud af at lave en, hvori der er meningen vii skal finde sider hvor vi kan finde hjælp. Læreren foreslog Kandu som en af de sider, og jeg spurgte her, fordi jeg tidligere på denne side har fået hjælp.

Den server der er beskrevet i øverste indlæg, lever fuldt op til kravene, hvis ellers vi kunne få backspare til at virke når man skriver.

Jeg har forsøgt at søge på google, som du siger men, med de søgekriterier jeg kan tilbyde når jeg ikke langt, specielt fordi de fleste sider åbenbart omhandler C++, og ikke C, samt at mit engelske ikke er på niveau med tekniske forklaringer.

Jeg har tidligere erfaringer med programmering, med ikke i dette programmeringssprog, deri ligger problemer, da jeg er vant til at programmere i VB... :)

Svar nok?

Kommentar
Fra : BertelBrander


Dato : 02-02-04 19:36

Ok.

Jeg ved ikke ret meget om chat-programmer og ved ikke om man kan slette. Hvis du kan finde ud af om/hvordan man kan, så kan jeg godt hjælpe med at implementere det.

Ellers må du/vi lave en løsning hvor brugeren skriver en hel linie inden den sendes, for at give ham mulighed for at rette. Jeg kan godt prøve at lave et eksempel, hvis det har interesse.

Hvilken kompiler bruger du?

Du har følgende muligheder
Dette spørgsmål er blevet annulleret, det er derfor ikke muligt for at tilføje flere kommentarer.
Søg
Reklame
Statistik
Spørgsmål : 177425
Tips : 31962
Nyheder : 719565
Indlæg : 6407918
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste