Avatar billede mad_man Nybegynder
30. december 2003 - 13:37 Der er 27 kommentarer og
1 løsning

while(1) og recv(socket,buffer,bla,bal)

jeg har denne knap... som jeg vil have til og connecte og så derefter lave et loop der heletiden tjekker om der kommer noget fra den server man er connectet til... recv venter den ikke på at der kommer noget... eller hvis der ikke er noget når den tjekker køre den så bare vidre... ???

jeg har denne kode den virker hvis jeg fjerner alt fra while(1) og til slut

{
    int port = 12345;
    char host[32] = "madman";
    WORD sockversion;
    WSADATA wsadata;
    sockversion = MAKEWORD(1,1);
    WSAStartup(sockversion, &wsadata);
    LPHOSTENT hosten;
    hosten = gethostbyname(host);


    thesocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(thesocket == INVALID_SOCKET)
    {
        WSACleanup();
        return;
    }
    SOCKADDR_IN server;
    server.sin_family = AF_INET;
    server.sin_addr = *((LPIN_ADDR)*hosten->h_addr_list);
    server.sin_port = htons(port);
    int test;
    test = ::connect(thesocket,(LPSOCKADDR)&server,sizeof(struct sockaddr));
    if(test == INVALID_SOCKET)
    {
        WSACleanup();
        return;
    }
    char recvbuf[1024];
    char buf[10000] = "";
    while(1)
    {
        memset(recvbuf, 0, 1024);
        test = recv(thesocket,recvbuf,256,0);
        if(test == INVALID_SOCKET)
      {
            WSACleanup();
            return;
      }
        strcpy(buf,recvbuf);
        strcat(buf,"\r\n");
        strcat(buf,Memo1->Text.c_str());
        Memo1->Text = buf;
      }
}
Avatar billede arne_v Ekspert
30. december 2003 - 13:52 #1
Default vil recv vente.

På Unix kan man ændre det ved:

test = fcntl(thesocket,F_SETFL,O_NONBLOCK);
Avatar billede mad_man Nybegynder
30. december 2003 - 13:54 #2
når jeg starter programmet så fryser det bare... der kommer ingen fejl meddelse..
Avatar billede mad_man Nybegynder
30. december 2003 - 13:58 #3
det virker ikke i windows =S ...
sådan lige af nysgerrighed er der programmer som bcb6 til linux..
Avatar billede arne_v Ekspert
30. december 2003 - 14:04 #4
Prøv med:

int v = 1;
test = ioctlsocket(thesocket, FIONBIO, &v)
Avatar billede arne_v Ekspert
30. december 2003 - 14:06 #5
Borland Kylix skulle være BCB & Delphi til Linux !

http://www.borland.com/kylix/
Avatar billede mad_man Nybegynder
30. december 2003 - 14:14 #6
test = ioctlsocket(thesocket, FIONBIO, &v)
virker ikke.
den kommer med
Build
  [C++ Error] Unit1.cpp(58): E2034 Cannot convert 'int *' to 'unsigned long *'
  [C++ Error] Unit1.cpp(58): E2342 Type mismatch in parameter 'argp' (wanted 'unsigned long *', got 'int *')
  [C++ Warning] Unit1.cpp(69): W8004 'v' is assigned a value that is never used
Avatar billede arne_v Ekspert
30. december 2003 - 14:17 #7
unsigned long v = 1;
Avatar billede mad_man Nybegynder
30. december 2003 - 14:19 #8
det virker... men programmet fryser stadig og den kommer ik med en fejl ...
Avatar billede arne_v Ekspert
30. december 2003 - 14:22 #9
Det er jo en meget voldsom loop.

Har du overvejet at putte en Sleep(100) ind i den ?
Avatar billede arne_v Ekspert
30. december 2003 - 14:22 #10
Og hvad skulle der ske ? Skulle den modtage noget ?
Avatar billede arne_v Ekspert
30. december 2003 - 14:24 #11
Prøv evt. at put noget debug output ind i løkken, så du kan se hvad
der sker.
Avatar billede mad_man Nybegynder
30. december 2003 - 14:24 #12
den skal modtage fra den server som jeg har connectet til... og så skal den modtage heletiden og smide det til memo1
Avatar billede mad_man Nybegynder
30. december 2003 - 14:29 #13
den skal vente på at der kommer noget og så connecte
Avatar billede arne_v Ekspert
30. december 2003 - 14:31 #14
Jeg lavede lige en lille console app med non blocking sockets.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <windows.h>
#include <errno.h>

void get(char *hostname,int port,char *path,int noblock)
{
  int sd,status,len,ix,tmp;
  char cmd[512],resp[51200];
  struct sockaddr local,remote;
  struct hostent *hostinfo;
  time_t t;
  int one = 1;
  /* create socket */
  sd=socket(AF_INET,SOCK_STREAM,0);
  if(sd<0) {
      printf("Error creating socket: %s\n",strerror(errno));
      goto fin;
  }
  /* bind socket */
  local.sa_family=AF_INET;
  memset(local.sa_data,0,sizeof(local.sa_data));
  status=bind(sd,&local,sizeof(local));
  if(status<0) {
      printf("Error binding socket: %s\n",strerror(errno));
      goto fin;
  }
  /* lookup host */
  hostinfo=gethostbyname(hostname);
  if(!hostinfo) {
      printf("Error looking up host: %s\n",hostname);
      goto fin;
  }
  /* connect to host */
  remote.sa_family=hostinfo->h_addrtype;
  memcpy(remote.sa_data+2,hostinfo->h_addr_list[0],hostinfo->h_length);
  *((short *)remote.sa_data)=port;
  tmp=remote.sa_data[0];
  remote.sa_data[0]=remote.sa_data[1];
  remote.sa_data[1]=tmp;
  status=connect(sd,&remote,sizeof(remote));
  if(status!=0) {
      printf("Error connecting to host: %s port: %d\n",hostname,port);
      goto fin;
  }
  /* send GET request */
  sprintf(cmd,"GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",path,hostname);
  status=send(sd,cmd,strlen(cmd),0);
  if(status<0) {
      printf("Error sending POST request\n");
      goto fin;
  }
  /* read response */
  ix=0;
  if(noblock) {
      status=ioctlsocket(sd, FIONBIO, &one);
      if(status<0) {
        printf("Error setting socket nonblocked: %s\n",strerror(errno));
        goto fin;
      }
      t=time(NULL);
      while (time(NULL)<(t+10)) {
        len=recv(sd,resp+ix,sizeof(resp)-ix-1,0);
        if(len<0) len=0;
        ix = ix + len;
        printf("no blocking read %d bytes\n",len);
        Sleep(1000);
      }
  } else {
      while ((len=recv(sd,resp+ix,sizeof(resp)-ix-1,0))>0) {
        ix = ix + len;
        printf("blocking read %d bytes\n",len);
      }
  }
  resp[ix]='\0';
  /*printf("%s",resp);*/
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.dr.dk",80,"/",0);
  get("www.dr.dk",80,"/",1);
  WSACleanup();
}
Avatar billede arne_v Ekspert
30. december 2003 - 14:32 #15
"vente på" ?

Det er jo en client app du har lavet - den connecter til noget !
Avatar billede mad_man Nybegynder
30. december 2003 - 14:33 #16
jaja det er chat... så der er ikke heletiden data... så den skal vente på at der kommer data og så skrive det.
Avatar billede arne_v Ekspert
30. december 2003 - 14:34 #17
Du har iøvrigt ingen bind mellem socket create og connect - jeg ved ikke
om det er et problem.
Avatar billede arne_v Ekspert
30. december 2003 - 14:35 #18
Men du bliver nødt til at  få noget debug output lagt ind, så du kan se hvad der sker.
Avatar billede mad_man Nybegynder
30. december 2003 - 14:36 #19
hvordan laver jeg vindus programering når den ikke vil skirve noget i memo ??
Avatar billede mad_man Nybegynder
30. december 2003 - 14:50 #20
hvis jeg fjerner while(1) og {} så kan den godt hente det 1 gang.. skal jeg lave en ny (hvad hedder sådan en som main)
Avatar billede arne_v Ekspert
30. december 2003 - 14:53 #21
Hm.

Den burde køre inden i while også så.

Der er ikke tale om at det i den anden ende lukker socket ?
Avatar billede mad_man Nybegynder
30. december 2003 - 14:54 #22
nej ik før jeg trykker på min disconnect knap... det kan jeg se på serveren
Avatar billede arne_v Ekspert
30. december 2003 - 14:54 #23
Me dhensyn ti debug så skriv til en anden Memo felt elelr skriv til
en fil eller ...
Avatar billede mad_man Nybegynder
30. december 2003 - 14:56 #24
hmm når jeg skriver til den memobox når der er while(1) så gider den ik skrive noget der er i starten af den .. (før wihlen) og hvis jeg fjerner det så virker det hele vejen ned...
Avatar billede mad_man Nybegynder
30. december 2003 - 15:29 #25
kan det være fordi, den venter så meget at resten af pogrammet ik kan køre. altså recv den venter...
Avatar billede arne_v Ekspert
30. december 2003 - 15:58 #26
Må jeg se koden som den ser ud nu ?
Avatar billede mad_man Nybegynder
30. december 2003 - 15:58 #27
har lavet et nyt spm
Avatar billede mad_man Nybegynder
03. maj 2004 - 18:56 #28
lukker
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