Avatar billede mad_man Nybegynder
12. august 2003 - 15:17 Der er 67 kommentarer og
1 løsning

winsock underlig

jeg har lavet et program i winsock. et chat prog.
nå mit problem er at jeg har en funktion der køere vidre til næste linje... send(socket,"\n \r,3,0");

den virker mildest AF LORDT til (undskyld mit sprog)... det er lidt op og ned om det kommer med... selv om det er den samme linje kode så er det ik sikket den virker hver gang...
er der alternertiver til denne måse at køre vidre til næste linje ???
/madman
Avatar billede arne_v Ekspert
12. august 2003 - 15:21 #1
Håndterer programmet i den anden ende det korrekt ?
Avatar billede mad_man Nybegynder
12. august 2003 - 15:22 #2
ja en gang i mellem
det er lidt op og ned.. det er meget mystisk... og det er også kun hvis man ik connecter fra localhost det kager..
Avatar billede mad_man Nybegynder
12. august 2003 - 15:23 #3
nåå ja og forresten er det muligt i en console at lave at man bruger den nederste linje til og skrive i (til en client) og den så bare skriver svarende fra serveren oppe i toppen
Avatar billede arne_v Ekspert
12. august 2003 - 15:25 #4
Jeg er bange for at vi skal se lidt kode for at kune hjælpe.

Umiddelbart undrer jeg mig lidt over "\n \r".

Normalt bruger man "\r\n".
Avatar billede mad_man Nybegynder
12. august 2003 - 15:26 #5
char Online7[] = "Online";
        if( strcmp(Online7,rcvbuf) ==0 )
        {
                    for(int count2 = 0; count2 < MAXCONN; count2++)
                    {
                            if(ibrug[count2])
                            {
                            send(sock1,"Online :",8,0);
                            send(sock1,navn[count2],20,0);
                            send(sock1,"\n \r",3,0);
                            }
                    }
        }
Avatar billede mad_man Nybegynder
12. august 2003 - 15:26 #6
det der virker en gang i mellem
Avatar billede mad_man Nybegynder
12. august 2003 - 15:28 #7
nåå ja er send(sock1,"\n \r",3,0); 3 eller 5 karektere den skal sende ???
Avatar billede mad_man Nybegynder
12. august 2003 - 15:28 #8
og kan man godt \r\n og er det så 4 karektere
Avatar billede arne_v Ekspert
12. august 2003 - 15:29 #9
"\n \r" er 5 og "\r\n" er 2.
Avatar billede arne_v Ekspert
12. august 2003 - 15:30 #10
Må jeg iøvrigt forslå brug af strlen ?

#define CRLF "\r\n"

send(sock1,CRLF,strlen(CRLF));

så tæller den selv.
Avatar billede mad_man Nybegynder
12. august 2003 - 15:31 #11
er det muligt at lave en linje i bunden af consolen som man skriver i ???
Avatar billede arne_v Ekspert
12. august 2003 - 15:32 #12
Hov der smuttede et argument.

#define ONLINE "Online:"
#define CRLF "\r\n"

send(sock1,ONLINE,strlen(ONLINE),0);
send(sock1,navn[count2],strlen(navn[count2]),0);
send(sock1,CRLF,strlen(CRLF),0);
Avatar billede arne_v Ekspert
12. august 2003 - 15:32 #13
Hvis du altid vil sende all tegn i navn, så:

send(sock1,navn[count2],sizeof(navn[count2]),0);
Avatar billede arne_v Ekspert
12. august 2003 - 15:33 #14
Du kan godt lade en applikation altid skrive i bunden.

Men hvordan afhænger lidt af hvilken type applikation & compiler.
Avatar billede mad_man Nybegynder
12. august 2003 - 15:39 #15
jeg mente nu sådan at jeg har den den får ind fra serveren det skriver den i toppen af skærmen og ned som normalt...
og det man så vil skrive (fra tasteturet) skriver den i bunden og når man trykker enter forsvinder det ???
Avatar billede arne_v Ekspert
12. august 2003 - 15:55 #16
Du kan positionere dig et bestemt sted på skærmen.

Funktionen afhænger lidt af hvordan du koder.

Mne til Win32 er der en SetConsoleCursorPosition !
Avatar billede mad_man Nybegynder
12. august 2003 - 16:17 #17
SetConsoleCursorPosition hvordan virker den... er der en hp der foklare hvordan den dur...
Avatar billede arne_v Ekspert
12. august 2003 - 16:22 #20
Læs evt. lidt mere her:
  http://p2p.wrox.com/archive/c_plus_plus_programming/2001-06/41.asp

Eller søg på eksperten. Der har været postet eksempler med den.
Avatar billede mad_man Nybegynder
12. august 2003 - 16:33 #21
ja det er jo meget godt men det er ik sådan jeg skal bruge den....
foklaring kommer lige...

her =P

Jeg vil gerne have en console som mere eller mindre er delt op i 2..
en linje som er i bunden af consolen, hvor man kan skrive i..
og en resten over hvor den skriver det der kommer fra serveren..

-----------------------------------------
|det her data kommer fra serveren        |
|det gør det her også                    |
|og mere data                            |
|det her data kom sidst                  |
|                                        |
|                                        |
------------------------------------------
|det her data skiver jeg på mit keyboard |
------------------------------------------

hvis i forstår det var en console
Avatar billede mad_man Nybegynder
12. august 2003 - 16:33 #22
alle de der sjove linjer, |, skulle være lige langt ude så det lignede en console
Avatar billede arne_v Ekspert
12. august 2003 - 16:36 #23
Det kan du godt opnå med absolut positionering.

Du skal bare altid positionere dig det rigtieg sted.

Du positionerer dig op i toppen når du vil skrive beskeder fra server.

Du positionerer dig nede i bunden når du skal læse input.

Det kræver lidt kode, men det kan gøres.
Avatar billede mad_man Nybegynder
12. august 2003 - 16:40 #24
jamen hvad så hvis jeg er midt i ok skrive en setning og så der kommer noget data ind så skriver den det bare mid i det hele
Avatar billede mad_man Nybegynder
12. august 2003 - 16:41 #25
kan man gøre det med bare SetConsoleCursorPosition() er der ik en der hedder ReadConsoleCursorPosition()
Avatar billede mad_man Nybegynder
12. august 2003 - 16:41 #26
eller er det den GetConsoleCursorInfo
Avatar billede arne_v Ekspert
12. august 2003 - 16:44 #27
Nej. Du gemmer hvor du var. Positionerer dig op og skriver det
modtagne data og så positionerer du dig tilbage hvor du var.
Avatar billede mad_man Nybegynder
12. august 2003 - 16:45 #28
ja så skal jeg også have en kommando der kan fortælle mig hvor jeg var...
kan det gøres sådan

char gtWhereX(void)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(HOutput, &csbi);
return csbi.dwCursorPosition.X;
}

char gtWhereY(void)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(HOutput, &csbi);
return csbi.dwCursorPosition.Y;
}

rent tyv stjålet fra et andet forum =)
Avatar billede arne_v Ekspert
12. august 2003 - 16:45 #29
Nej - det er GetConsoleScreenBufferInfo der kan fortælle dig hvor du er.
Avatar billede mad_man Nybegynder
12. august 2003 - 16:46 #30
det vil sige sådan som jeg lige gjorde =)
Avatar billede arne_v Ekspert
12. august 2003 - 16:46 #31
Ja. Selvom jeg nok ville hapse både X og Y med samme kald.

But who cares.

På en moderne maskine burde sådan noget jo være så hurtigt så det er
overstået inden man begyndte.
Avatar billede mad_man Nybegynder
12. august 2003 - 16:48 #32
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(HOutput, &csbi);
int x = csbi.dwCursorPosition.X; //<---- er X korridnaten
int y = csbi.dwCursorPosition.Y; //<---- er Y korridnaten

ville det du
Avatar billede arne_v Ekspert
12. august 2003 - 16:52 #33
Jep.

Men altså den slags var mere vigtig for 15 år siden.

:-)
Avatar billede mad_man Nybegynder
12. august 2003 - 16:53 #34
hehe ja nu har man jo masser af resurser =)
men men men al den fyld kodt tager også tid og skrive =)

nå ja hvordan får man den til og være i bunden af konsolen
Avatar billede arne_v Ekspert
12. august 2003 - 16:57 #35
Jeg tror at den der CONSOLE_SCREEN_BUFFER_INFO indeholder information
om skærmens størrelse.

Men normalt formodes det at et console vinduw er 24 x 80 tegn. Sådan har
det været i 30 år.

Og hvis du skriver i linie 24 så skulle du skrive i bunden.
Avatar billede mad_man Nybegynder
12. august 2003 - 16:57 #36
hehe ok =)
det gør jeg så til og starte med.... det kan jo altid laves om =)
Avatar billede mad_man Nybegynder
12. august 2003 - 20:33 #37
det virker ikke
den ænder ik på den når den når til bunden
Avatar billede mad_man Nybegynder
12. august 2003 - 20:34 #38
kommer lige lidt kode her... så du selv kan prøve at det tik dur

void recv(SOCKET jahererden)
{
    int test;
    char recvbuf[1024];
    char Online7[] = "Online :";
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    while(1)   
    { 
          memset(recvbuf, 0, 1024);
          test = recv(jahererden,recvbuf,256,0);
         
          CONSOLE_SCREEN_BUFFER_INFO csbi;
          GetConsoleScreenBufferInfo(hConsole, &csbi);
          Xsend = csbi.dwCursorPosition.X; //<---- er X korridnaten
          Ysend = csbi.dwCursorPosition.Y; //<---- er Y korridnaten
         
          COORD coord;
        coord.X = (Xmod);
        coord.Y = (Ymod);
        SetConsoleCursorPosition(hConsole, coord);
         
          if(test == INVALID_SOCKET)
          {
                WSACleanup();
                return;
          }
         
        if( strstr(recvbuf,Online7) != NULL )
          {
               
                SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
                cout << recvbuf;
                memset(recvbuf, 0, 1024);
                recv(jahererden,recvbuf,256,0);
                cout << recvbuf;
                SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
               

          }
         
          else
          {
          cout << recvbuf;
          }
          GetConsoleScreenBufferInfo(hConsole, &csbi);
          Xmod = csbi.dwCursorPosition.X; //<---- er X korridnaten
          Ymod = csbi.dwCursorPosition.Y; //<---- er Y korridnaten
         
        coord.X = (Xsend);
        coord.Y = (Ysend);
        SetConsoleCursorPosition(hConsole, coord);
      }
}

void send(SOCKET jahererden)
{
    int test;
    char exit[] = "exit";
    char sendbuf[1024];
    ZeroMemory(sendbuf, 256);
    do
    {
        CONSOLE_SCREEN_BUFFER_INFO csbi1;
        GetConsoleScreenBufferInfo(hConsole, &csbi1);
        int Ymax = csbi1.srWindow.Bottom-csbi1.srWindow.Top+1;

       
        COORD coord;
        coord.X = (0);
        coord.Y = (Ymax);        
       
        SetConsoleCursorPosition(hConsole, coord);
        cout << "________________________________________________________________________________";
        SetConsoleCursorPosition(hConsole, coord);
       
          cin.getline(sendbuf,256);
         
          SetConsoleCursorPosition(hConsole, coord);
          cout << "________________________________________________________________________________";
          SetConsoleCursorPosition(hConsole, coord);
         
          test = send(jahererden,sendbuf,strlen(sendbuf),0);
         
          if(test == INVALID_SOCKET)
          {
                WSACleanup();
                return;
          }
    }while( strcmp(exit,sendbuf) !=0);
   
      closesocket(jahererden);
    WSACleanup();
    return;
}
Avatar billede arne_v Ekspert
12. august 2003 - 20:58 #39
Hvad sker der og hvad skulle der ske ?

Jeg kan ikke lige køre den kode i hovedet og det er jo ikke
komplet kode jeg kan køre.
Avatar billede mad_man Nybegynder
12. august 2003 - 21:00 #40
ups
Avatar billede mad_man Nybegynder
12. august 2003 - 21:00 #41
#include <iostream>
#include <winsock.h>
#include <stdio.h>

using namespace std;

void recv(SOCKET jahererden);
void send(SOCKET jahererden);
DWORD WINAPI send1(void* sock_);
int Xsend = 0;
int Ysend = 0;
int Xmod = 0;
int Ymod = 0;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int main()
{
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
    WORD sockVersion;
    WSADATA wsaData;
    sockVersion = MAKEWORD(1, 1);
    WSAStartup(sockVersion, &wsaData);
    char host[40];
    int port;
    cout << "server: ";
    cin >> host;
    cout << "port: ";
    cin >> port;
    LPHOSTENT hostEntry;
    hostEntry = gethostbyname(host);
    if (!hostEntry)
    {
        WSACleanup();
        return 0;
    }
    SOCKET jahererden;
    jahererden = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(jahererden == INVALID_SOCKET)
    {
        WSACleanup();
        return 0;
    }
    SOCKADDR_IN server;
    server.sin_family = AF_INET;
    server.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
    server.sin_port = htons(port);
    int test;
    test = connect(jahererden,(LPSOCKADDR)&server,sizeof(struct sockaddr));
    if(test == INVALID_SOCKET)
    {
        WSACleanup();
        return 0;
    }
   
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hConsole, &csbi);
      Xmod = csbi.dwCursorPosition.X; //<---- er X korridnaten
      Ymod = csbi.dwCursorPosition.Y; //<---- er Y korridnaten
         
    DWORD nThreadID;
    CreateThread(0, 0, send1,(void*)jahererden, 0, &nThreadID);
    recv(jahererden);
   
}

DWORD WINAPI send1(void* sock_)
{
    SOCKET jahererden = (SOCKET)sock_;
    send(jahererden);
}

void recv(SOCKET jahererden)
{
    int test;
    char recvbuf[1024];
    char Online7[] = "Online :";
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    while(1)   
    { 
          memset(recvbuf, 0, 1024);
          test = recv(jahererden,recvbuf,256,0);
         
          CONSOLE_SCREEN_BUFFER_INFO csbi;
          GetConsoleScreenBufferInfo(hConsole, &csbi);
          Xsend = csbi.dwCursorPosition.X; //<---- er X korridnaten
          Ysend = csbi.dwCursorPosition.Y; //<---- er Y korridnaten
         
          COORD coord;
        coord.X = (Xmod);
        coord.Y = (Ymod);
        SetConsoleCursorPosition(hConsole, coord);
         
          if(test == INVALID_SOCKET)
          {
                WSACleanup();
                return;
          }
         
        if( strstr(recvbuf,Online7) != NULL )
          {
               
                SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
                cout << recvbuf;
                memset(recvbuf, 0, 1024);
                recv(jahererden,recvbuf,256,0);
                cout << recvbuf;
                SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
               

          }
         
          else
          {
          cout << recvbuf;
          }
          GetConsoleScreenBufferInfo(hConsole, &csbi);
          Xmod = csbi.dwCursorPosition.X; //<---- er X korridnaten
          Ymod = csbi.dwCursorPosition.Y; //<---- er Y korridnaten
         
        coord.X = (Xsend);
        coord.Y = (Ysend);
        SetConsoleCursorPosition(hConsole, coord);
      }
}

void send(SOCKET jahererden)
{
    int test;
    char exit[] = "exit";
    char sendbuf[1024];
    ZeroMemory(sendbuf, 256);
    do
    {
        CONSOLE_SCREEN_BUFFER_INFO csbi1;
        GetConsoleScreenBufferInfo(hConsole, &csbi1);
        int Ymax = csbi1.srWindow.Bottom-csbi1.srWindow.Top+1;

       
        COORD coord;
        coord.X = (0);
        coord.Y = (Ymax);        
       
        SetConsoleCursorPosition(hConsole, coord);
        cout << "________________________________________________________________________________";
        SetConsoleCursorPosition(hConsole, coord);
       
          cin.getline(sendbuf,256);
         
          SetConsoleCursorPosition(hConsole, coord);
          cout << "________________________________________________________________________________";
          SetConsoleCursorPosition(hConsole, coord);
         
          test = send(jahererden,sendbuf,strlen(sendbuf),0);
         
          if(test == INVALID_SOCKET)
          {
                WSACleanup();
                return;
          }
    }while( strcmp(exit,sendbuf) !=0);
   
      closesocket(jahererden);
    WSACleanup();
    return;
}
Avatar billede mad_man Nybegynder
12. august 2003 - 21:01 #42
der er en masse kode der ik skal være der JA DET VED JEG... men har ik lige fået ryddet op i det =)
Avatar billede mad_man Nybegynder
12. august 2003 - 21:13 #43
problmemet ligger nok i noget ligedne den der...

#include <windows.h>

#include <stdio.h>

int main()
{
  HANDLE h;
  CONSOLE_SCREEN_BUFFER_INFO info;
  h = GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleScreenBufferInfo(h,&info);
  while(1)
  {
  printf("buffer size %d x %d\n",info.dwSize.X,info.dwSize.Y);
  printf("screen size %d x %d\n",info.srWindow.Right-info.srWindow.Left+1,
          info.srWindow.Bottom-info.srWindow.Top+1);
  }
  return 0;
}
skulle den ik skrive nogle forskellige tal ???
Avatar billede arne_v Ekspert
12. august 2003 - 21:17 #44
Nej.

Den skulle kun ændre sig hvis du resizer vinduet.
Avatar billede mad_man Nybegynder
12. august 2003 - 21:18 #45
det gør den heller ikke :/
Avatar billede mad_man Nybegynder
12. august 2003 - 21:20 #46
så derfor er det det samme med det andet at den fatisk at den bare lavet det lige som hvis jeg skrev at det skulle være linje 24
Avatar billede arne_v Ekspert
12. august 2003 - 21:22 #47
Jeg tror at du vil bruge:

        coord.X = 0;
        coord.Y = info.srWindow.Bottom;
Avatar billede arne_v Ekspert
12. august 2003 - 21:24 #48
Eller:

int Ymax = csbi1.srWindow.Bottom;

fordi jeg tror at SetConsoleCursorPosition positionerer
i bufferen og ikke på skærmen.
Avatar billede arne_v Ekspert
12. august 2003 - 21:32 #49
Jeg er iøvrigt ved at forsøge at køre programmet. Det er et client
program ikke - hvad bruger du som server program ?
Avatar billede mad_man Nybegynder
12. august 2003 - 21:47 #50
hehe ja jeg skal nok lige smide den... nej jeg åbner lige en ftp
2 min
Avatar billede mad_man Nybegynder
12. august 2003 - 21:51 #51
ftp://madman.lir.dk
user 1
pass 1
Avatar billede arne_v Ekspert
12. august 2003 - 22:01 #52
Jeg har den.
Avatar billede mad_man Nybegynder
12. august 2003 - 22:01 #53
ok =)
Avatar billede arne_v Ekspert
12. august 2003 - 22:02 #54
Og med:

int Ymax = csbi1.srWindow.Bottom;

ser det ud til kun at være scroll det er galt med.
Avatar billede mad_man Nybegynder
12. august 2003 - 22:02 #55
hvis du så connecter med 2 klienter går det også galt med den
Avatar billede arne_v Ekspert
12. august 2003 - 22:08 #56
Ikke voldsomt med den her version:

void send(SOCKET jahererden)
{
    int test;
    char exit[] = "exit";
    char sendbuf[1024];
    ZeroMemory(sendbuf, 256);
    do
    {
        CONSOLE_SCREEN_BUFFER_INFO csbi1;
        GetConsoleScreenBufferInfo(hConsole, &csbi1);
        int Ymax = csbi1.srWindow.Bottom;

     
        COORD coord;
        coord.X = (0);
        coord.Y = (Ymax);       
     
        SetConsoleCursorPosition(hConsole, coord);
        cout << "________________________________________________________________________________";
        SetConsoleCursorPosition(hConsole, coord);
     
          cin.getline(sendbuf,256);
       
          SetConsoleCursorPosition(hConsole, coord);
          cout << "________________________________________________________________________________";
          SetConsoleCursorPosition(hConsole, coord);
          coord.Y = Ymax - 1;       
          cout << "                                                                                ";
          SetConsoleCursorPosition(hConsole, coord);
       
          test = send(jahererden,sendbuf,strlen(sendbuf),0);
       
          if(test == INVALID_SOCKET)
          {
                WSACleanup();
                return;
          }
    }while( strcmp(exit,sendbuf) !=0);
 
      closesocket(jahererden);
    WSACleanup();
    return;
}
Avatar billede arne_v Ekspert
12. august 2003 - 22:08 #57
Tricket er at jeg overskriver den underline der er blevet scrollet op af getline.
Avatar billede arne_v Ekspert
12. august 2003 - 22:09 #58
Den er ikke perfekt, men der må være noget at arbejde med.
Avatar billede mad_man Nybegynder
12. august 2003 - 22:12 #59
hmm nå det vil jeg kikke på i morgen en gang =) tak for hjælpen
Avatar billede arne_v Ekspert
12. august 2003 - 22:12 #60
Jeg tror iøvrigt at du kal helt droppe cin og coiut og bruge
ReadConsole og WriteConsoleOutput (eller andre af win32 console
rutinerne).

Det vil give bedre kontrol over IO.
Avatar billede arne_v Ekspert
12. august 2003 - 22:13 #61
Jeg tror iøvrigt at du helt skal droppe cin og cout og bruge
ReadConsole og WriteConsoleOutput (eller andre af win32 console
rutinerne).

Det vil give bedre kontrol over IO.
Avatar billede mad_man Nybegynder
12. august 2003 - 22:13 #62
ok
nu vil jeg sove på det =)
Avatar billede arne_v Ekspert
13. august 2003 - 17:07 #63
Er du kommet videre ?
Avatar billede arne_v Ekspert
13. august 2003 - 17:07 #64
Og et svar i fald du føler at du er på sporet.
Avatar billede mad_man Nybegynder
13. august 2003 - 17:08 #65
nej jeg kan ik få det til og du
Avatar billede mad_man Nybegynder
13. august 2003 - 17:09 #66
det kager hele tiden men jeg tror lige jeg lavet det hele om og så lavet det med en variabel til hver linje.... det tror jeg vil virke bedere...
eller er det muligt at vende retningen at teskten scroller i ???
Avatar billede arne_v Ekspert
13. august 2003 - 17:12 #67
Jeg tror at problemet er at cout scroller.

Hvis du brugte WriteConsoleOutput eller lignende og konsekvent overskrev
alt så kunne du jo styre det 100%.

Hvis du vil scrolle baglæns så skriver du jo bare de gamle linier
en linie længere nede og skriver den nye øverst.
Avatar billede mad_man Nybegynder
13. august 2003 - 17:12 #68
hmm det må jeg lige kikke på efter jeg har lavet lektier... :/
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester