• 1
  • 2
2009-02-25, 17:44
  #1
Medlem
Lich.queens avatar
Knde fr att kolla upp sockets samt ntverksprogrammering, frst och frmst i windows.

Har lst allt som jag kunnat hitta och frsttt grunderna iaf. tnkte att ett bra stt att lra mig r att skriva en Enkel applik. sjlv.

S hr r Det enklaste chattprogrammet ngonsin.

NOTIS: Det r inget problem med att starta sockets
Client:

Kod:
//En massa starta socketskod borttagen

while (recvbuf && sendbuf)
{
recv(clientconnect,recvbuf,sizeof(recvbuf),0);
cout << "recv: " << recvbuf << endl;
cout << "send: "; cin.get(sendbuf,100);
send(clientconnect,sendbuf,sizeof(sendbuf),0);
}
closesocket(clientconnect);
}


Server:

Kod:
//ven hr borttagen

while(sendbuf && recvbuf)
{
cout << "send: "; cin.getline(sendbuf,100);
send(client,sendbuf,sizeof(sendbuf),0);
recv(client,recvbuf,sizeof(recvbuf),0);
cout << "recv: " << recvbuf << endl;
}
closesocket(client);
closesocket(serverlisten);
WSACleanup();
}

Som ni ser s skapas en aslutning, servern vntar p input och clienten p att server ska skicka ngot, och sedan tvrt om tills ngon avbryter.

Dock s hoppar bde programmen ver recv ibland vilket gr att allt kommer i ofas. Min tanke var att ngon return char fljde med och strde.. men men om ngon kunde lnkta till(har dock letat en hel del)eller kan visa ngot basic chattprogram som anvnder sig av winsock vore jag tacksam grna lite frklaring p vgen
Citera
2009-02-26, 00:19
  #2
Medlem
Lich.queens avatar
Gjort lite mer forskning fram och till baka, och det verkar som jag inte kan gra
recv // ta emot
send//skicka ngot
//recv //ta emot ngot igen

s fort jag gr det brjar den hoppa ver grejer och krngla. Svrt att frklara och jag vore drfr tacksam om ngon bara kunde kasta upp en enkel chattkod som bygger p skicka, vnta p meddelande,skicka igen osv. S enkelt som mjligt

nnu mer info:

ndrade koden till fljande fr att hitta var problemet sitter:

Client:

Kod:
do{
check = recv(clientconnect,recvbuf,sizeof(recvbuf),0);
if (check > 0)
cout << "recv: " << recvbuf << endl;
else
cout << "closing connection..." << endl;
}while(check>0);

Server:

Kod:
char sendbuf[256]="hej";
send(client,sendbuf,sizeof(sendbuf),0);
send(client,sendbuf,sizeof(sendbuf),0);
send(client,sendbuf,sizeof(sendbuf),0);
send(client,sendbuf,sizeof(sendbuf),0);

Detta borde ju skicka hej till clienten 4 gnger, och clienten borde skriva ut hej 4 gnger. Men den skriver bara ut 2! Varfr?
__________________
Senast redigerad av Lich.queen 2009-02-26 kl. 00:38.
Citera
2009-02-26, 05:49
  #3
Medlem
Ett tips r att anvnda olika trdar fr olika saker. Du kan t.ex. ha en egen trd med en recv loop och sedan skta all inmatning (send) i main. Fr sm buffrar och inlrning kan det ven hjlpa att nollstlla buffern varje gng du behandlat den med hjlp av memset(buffer, 0, sizeof(buffer));
Citera
2009-02-26, 07:31
  #4
Medlem
kaks avatar
Citat:
Ursprungligen postat av Lich.queen
Gjort lite mer forskning fram och till baka, och det verkar som jag inte kan gra
recv // ta emot
send//skicka ngot
//recv //ta emot ngot igen

s fort jag gr det brjar den hoppa ver grejer och krngla. Svrt att frklara och jag vore drfr tacksam om ngon bara kunde kasta upp en enkel chattkod som bygger p skicka, vnta p meddelande,skicka igen osv. S enkelt som mjligt

nnu mer info:

ndrade koden till fljande fr att hitta var problemet sitter:

Client:

Kod:
do{
check = recv(clientconnect,recvbuf,sizeof(recvbuf),0);
if (check > 0)
cout << "recv: " << recvbuf << endl;
else
cout << "closing connection..." << endl;
}while(check>0);

Server:

Kod:
char sendbuf[256]="hej";
send(client,sendbuf,sizeof(sendbuf),0);
send(client,sendbuf,sizeof(sendbuf),0);
send(client,sendbuf,sizeof(sendbuf),0);
send(client,sendbuf,sizeof(sendbuf),0);

Detta borde ju skicka hej till clienten 4 gnger, och clienten borde skriva ut hej 4 gnger. Men den skriver bara ut 2! Varfr?

Hur stor r recvbuf? Om den r strre n sendbuf s r det vl inget som hindrar att tv meddelanden tas emot samtidigt?
Citera
2009-02-26, 10:54
  #5
Medlem
Lich.queens avatar
recvbuff r 2048 bytes

Frlt om jag var otydlig. Hur jag n skriver programmet s skickas bara tv meddelanden frn servern till clienten, ven om jag har 4 send eller 10. Hur gr jag fr att skicka flera meddelanden (ca 4-5) frn servern till clienten?
Citera
2009-02-26, 10:59
  #6
Medlem
kaks avatar
Citat:
Ursprungligen postat av Lich.queen
recvbuff r 2048 bytes

Frlt om jag var otydlig. Hur jag n skriver programmet s skickas bara tv meddelanden frn servern till clienten, ven om jag har 4 send eller 10. Hur gr jag fr att skicka flera meddelanden (ca 4-5) frn servern till clienten?
Hur vet du att bara tv skickas? Har du tittat p returvrdet frn recv?
Jag tror att flera snda buffrar klumpas ihop och lses ut av ett anrop till recv. Eftersom det dyker upp ett '\0' efter "hej" s ser du bara det frsta meddelandet nr du skriver ut det.
Citera
2009-02-26, 13:40
  #7
Medlem
Sugmins avatar
jag har ocks ett winsock problem.

varfr fungerar inte detta?

Kod:
#include <winsock.h>

#include <iostream>

using namespace std;

int main() {

  try {
    SocketClient s("www.google.com", 80);

    s.SendLine("GET / HTTP/1.0");
    s.SendLine("Host: www.google.com");
    s.SendLine("");

    while (1) {
      string l = s.ReceiveLine();
      if (l.empty()) break;
      cout << l;
      cout.flush();
    }

  } 
  catch (const char* s) {
    cerr << s << endl;
  } 
  catch (std::string s) {
    cerr << s << endl;
  } 
  catch (...) {
    cerr << "unhandled exception\n";
  }

  return 0;
}
Citera
2009-02-26, 16:08
  #8
Medlem
Lich.queens avatar
Citat:
Ursprungligen postat av kak
Hur vet du att bara tv skickas? Har du tittat p returvrdet frn recv?
Jag tror att flera snda buffrar klumpas ihop och lses ut av ett anrop till recv. Eftersom det dyker upp ett '\0' efter "hej" s ser du bara det frsta meddelandet nr du skriver ut det.

Japp, tittade p resultaten. Om jag gr send() 4 gnger s tar clienten frst emot meddelandet, men nsta send klumpas ihop till 3 st. enligt fljande d sendbuf = 256

Client:

recieve: 256;
recieve: 768 // = 256 *3

Detta r dock inte vad jag vill, jag vill kunna skicka tre olika bufferts p 256 bytes frn servern till clienten, frtydligande:

Client:

recieve: Hejsan // frsta buffern.
recieve: Ansluten // andra buffern.
recieve: Datum // tredje buffern

Allts, hur frhindrar jag buffrarna frn att klumpa ihop sig till en massiv buffer?

Sugmin vad fungerar inte? Kanske kan ge ngot frslag vi fr se
Citera
2009-02-26, 20:34
  #9
Medlem
dethalvabarnets avatar
En gissning, kan det ha ngot med http://en.wikipedia.org/wiki/TCP_window_scale_option att gra?
Citera
2009-02-26, 22:38
  #10
Medlem
Lich.queens avatar
Vore snll om ngon kunde skriva ett exempel p ett program som skickar tre buffrar till clienten
Citera
2009-02-26, 22:51
  #11
Medlem
Ubis avatar
Har inte lst igenom s bra men borde det inte g om programmet vntar lite mellan att den har skickat och ska skicka igen?
Kod:
send.......
Sleep(10);//Kanske behvs mer
//eller kanske cin.get() ?
send.......
Sleep(10);
osv.

Har inte hllit p med ntverksprogrammering s mycket s jag vet inte men jag tkr det borde fungera

Annars borde du kunna kolla hur mnga ord som finns i recvbuf(om det var s den hette) och dela upp dom med hjlp av en for/while loop

Lycka till!
__________________
Senast redigerad av Ubi 2009-02-26 kl. 22:54.
Citera
2009-02-26, 23:28
  #12
Medlem
Lich.queens avatar
Underbart, ska kolla om sleep fungerar nr jag kommer hem :d lter som en bra ide.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in