Avatar billede thomas_fogh Nybegynder
26. juli 2007 - 11:29 Der er 7 kommentarer og
1 løsning

Problem med linux sockets

Jeg har skrevet et program som gør brug af sockets og nu vil jeg gerne have det testet.
Jeg har skrevet et lille test-program som opretter en connection til "127.0.0.1" og sender to beskeder.

Program:
1. socket()
2. bind()
3. listen()
4. accept()
5. recv() loop.

Test-program:
1. socket()
2. connect()
3. send(msg1)
4. send(msg2)

accept/connect går fint, men recv() returnerer 0 inden jeg får sendt min først besked. Så vidt jeg har forstået betyder det at den har disconnected.
Begge mine send() returnerer -1.

Kan jeg ikke have mit program og test-program på samme maskine, eller skal jeg bare gøre det på en anden måde?
Avatar billede arne_v Ekspert
26. juli 2007 - 13:44 #1
Check på retur værdier og udskriv fejl !
Avatar billede arne_v Ekspert
26. juli 2007 - 13:46 #2
eksmepel:

  sd=socket(AF_INET,SOCK_STREAM,0);
  if(sd<0)
  {
      printf("Error creating socket: %s\n",strerror(errno));
      goto fin;
  }
  local.sin_family=AF_INET;
  local.sin_port = htons(1234);
  local.sin_addr.s_addr = INADDR_ANY;
  status=bind(sd,(struct sockaddr *)&local,sizeof(local));
  if(status<0)
  {
      printf("Error binding socket: %s\n",strerror(errno));
      goto fin;
  }
  status=listen(sd,5);
  if(status<0)
  {
      printf("Error listening socket: %s\n",strerror(errno));
      goto fin;
  }
  sd2=accept(sd,0,0);
  if(sd2<0)
  {
      printf("Error accepting socket: %s\n",strerror(errno));
      goto fin;
  }
Avatar billede thomas_fogh Nybegynder
26. juli 2007 - 13:53 #3
Det har jeg gjort. Som sagt er det først mens programmet venter med recv() at socket'en disconnecter.
Dvs. Programmet's step 1-4 går fint, samt test programmet's step 1-2.

min recv() er som følger:
bytes_read = recv(connection_fd, buffer, 3, 0); //Vent på 3 bytes
Og den først send() i test programmet er:
if (send(connected_fd, msg1, 3, 0) == -1) printf("Error send Msg1!\n");

recv() returnerer med bytes_read = 0. Hvilket så vidt jeg har forstået betyder at den er disconnectet.
Avatar billede thomas_fogh Nybegynder
26. juli 2007 - 14:26 #4
Brugte strerror(errno) og fandt fejlen. Tak!
Troede connection() returnerede en ny socket ligesom accept(). Ups!!
Skriv lige et svar, så du kan få point.
Avatar billede thomas_fogh Nybegynder
26. juli 2007 - 14:49 #5
BTW:
Jeg har en struct:
typedef struct {
char msg_id;
long length;
} msg_t;
sizeof(msg_t.msg_id) = 1
sizeof(msg_t.length) = 4
sizeof(msg_t) = 8
Det er vel fordi mit OS er 32 bit, men kan jeg (nemt) undgå at sende de 8 bytes, og i stedet bare de 5 jeg skal bruge?
(Uden at skulle lave en send-funktion for hver eneste message struct jeg har.)
Avatar billede arne_v Ekspert
26. juli 2007 - 14:59 #6
Svar.

Det er normalt at C/C++ compilere aligner struct members paa natural boundaries.

Du kan formentligt fortaelle din compiler at den skal lave struct som packed eller
med alignment 1.
Avatar billede arne_v Ekspert
26. juli 2007 - 15:03 #7
I GCC er det:

__attribute__((packed))

siger noget oldgammelt kode jeg har liggende.
Avatar billede thomas_fogh Nybegynder
26. juli 2007 - 15:13 #8
Ok. Tak!
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