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
Annonceindlæg fra FPT Software
12. august 2003 - 15:21
#1
Håndterer programmet i den anden ende det korrekt ?
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..
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
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".
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); } } }
12. august 2003 - 15:26
#6
det der virker en gang i mellem
12. august 2003 - 15:28
#7
nåå ja er send(sock1,"\n \r",3,0); 3 eller 5 karektere den skal sende ???
12. august 2003 - 15:28
#8
og kan man godt \r\n og er det så 4 karektere
12. august 2003 - 15:29
#9
"\n \r" er 5 og "\r\n" er 2.
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.
12. august 2003 - 15:31
#11
er det muligt at lave en linje i bunden af consolen som man skriver i ???
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);
12. august 2003 - 15:32
#13
Hvis du altid vil sende all tegn i navn, så: send(sock1,navn[count2],sizeof(navn[count2]),0);
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.
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 ???
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 !
12. august 2003 - 16:17
#17
SetConsoleCursorPosition hvordan virker den... er der en hp der foklare hvordan den dur...
12. august 2003 - 16:19
#18
12. august 2003 - 16:21
#19
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
12. august 2003 - 16:33
#22
alle de der sjove linjer, |, skulle være lige langt ude så det lignede en console
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.
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
12. august 2003 - 16:41
#25
kan man gøre det med bare SetConsoleCursorPosition() er der ik en der hedder ReadConsoleCursorPosition()
12. august 2003 - 16:41
#26
eller er det den GetConsoleCursorInfo
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.
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 =)
12. august 2003 - 16:45
#29
Nej - det er GetConsoleScreenBufferInfo der kan fortælle dig hvor du er.
12. august 2003 - 16:46
#30
det vil sige sådan som jeg lige gjorde =)
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.
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
12. august 2003 - 16:52
#33
Jep. Men altså den slags var mere vigtig for 15 år siden. :-)
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
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.
12. august 2003 - 16:57
#36
hehe ok =) det gør jeg så til og starte med.... det kan jo altid laves om =)
12. august 2003 - 20:33
#37
det virker ikke den ænder ik på den når den når til bunden
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; }
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.
12. august 2003 - 21:00
#40
ups
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; }
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 =)
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 ???
12. august 2003 - 21:17
#44
Nej. Den skulle kun ændre sig hvis du resizer vinduet.
12. august 2003 - 21:18
#45
det gør den heller ikke :/
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
12. august 2003 - 21:22
#47
Jeg tror at du vil bruge: coord.X = 0; coord.Y = info.srWindow.Bottom;
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.
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 ?
12. august 2003 - 21:47
#50
hehe ja jeg skal nok lige smide den... nej jeg åbner lige en ftp 2 min
12. august 2003 - 21:51
#51
12. august 2003 - 22:01
#52
Jeg har den.
12. august 2003 - 22:01
#53
ok =)
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.
12. august 2003 - 22:02
#55
hvis du så connecter med 2 klienter går det også galt med den
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; }
12. august 2003 - 22:08
#57
Tricket er at jeg overskriver den underline der er blevet scrollet op af getline.
12. august 2003 - 22:09
#58
Den er ikke perfekt, men der må være noget at arbejde med.
12. august 2003 - 22:12
#59
hmm nå det vil jeg kikke på i morgen en gang =) tak for hjælpen
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.
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.
12. august 2003 - 22:13
#62
ok nu vil jeg sove på det =)
13. august 2003 - 17:07
#63
Er du kommet videre ?
13. august 2003 - 17:07
#64
Og et svar i fald du føler at du er på sporet.
13. august 2003 - 17:08
#65
nej jeg kan ik få det til og du
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 ???
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.
13. august 2003 - 17:12
#68
hmm det må jeg lige kikke på efter jeg har lavet lektier... :/
Kurser inden for grundlæggende programmering