Avatar billede sf Nybegynder
12. november 2004 - 12:38 Der er 2 kommentarer og
1 løsning

socket chat

<-------Client------->

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PORT 3553 // the port client will be connecting to

#define MAXDATASIZE 100

int main(int argc, char *argv[])
{
  int sockfd, numbytes;
  char buf[MAXDATASIZE];
  struct hostent *he;
  struct sockaddr_in their_addr;

if (argc != 2) {
            fprintf(stderr,"usage: client hostname\n");
            exit(1);
        }

        if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info
            perror("gethostbyname");
            exit(1);
        }

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("socket");
            exit(1);
        }

        their_addr.sin_family = AF_INET;    // host byte order
        their_addr.sin_port = htons(PORT);  // short, network byte order
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        memset(&(their_addr.sin_zero), '\0', 8);  // zero the rest of the struct

        if (connect(sockfd, (struct sockaddr *)&their_addr,
                                              sizeof(struct sockaddr)) == -1) {
            perror("connect");
            exit(1);
        }

        if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
            perror("recv");
            exit(1);
        }

        buf[numbytes] = '\0';
  send(sockfd,"hej \n",22,0); /* send to the client welcome message */
        printf("Received: %s",buf);

        close(sockfd);

        return 0;
    }
 

<------ Slut ---->

<------ server ---->

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define PORT 3553
#define BACKLOG 10
#define MAXDATASIZE 100

main()
{
  char buf[MAXDATASIZE];
  int fd, fd2, numbytes; /* file descriptors */

  struct sockaddr_in server; /* server's address information */
  struct sockaddr_in client; /* client's address information */

  int sin_size;


  if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  /* calls socket() */
    printf("socket() errorn");
    exit(-1);
  }

  server.sin_family = AF_INET;       
  server.sin_port = htons(PORT);  /* Remember htons() from "Conversions" section? =) */
  server.sin_addr.s_addr = INADDR_ANY;  /* INADDR_ANY puts your IP address automatically */ 
  bzero(&(server.sin_zero),8); /* zero the rest of the structure */

 
  if(bind(fd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1){ /* calls bind() */
      printf("bind() errorn");
      exit(-1);
  }   

  if(listen(fd,BACKLOG) == -1){  /* calls listen() */
      printf("listen() errorn");
      exit(-1);
  }

while(1){
  sin_size=sizeof(struct sockaddr_in);
  if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size))==-1){ /* calls accept() */
    printf("accept() errorn");
    exit(-1);
  }
 
  printf("You got a connection from %s \n",inet_ntoa(client.sin_addr) ); /* prints client's IP */
 
  send(fd2,"Welcome to my server \n",22,0); /* send to the client welcome message */
while (numbytes!=0)
{
if ((numbytes=recv(fd2, buf, MAXDATASIZE-1, 0)) == -1) {
            perror("recv");
            exit(1);
        }

}
        buf[numbytes] = '\0';

        printf("Received: %s",buf);
  printf("close \n");
  close(fd2); /*  close fd2 */
}
}

<---- slut --->

Koden virker godt nok men vil gerne have det sådan men få den besked velkommen til serveren og så sender clienten en besked til server og server sender en besked tilbage kan ikke helt få det til at virke..lidt hjælp? :)
Avatar billede stormy Nybegynder
13. november 2004 - 20:23 #1
Umiddelbart får jeg en besked tilbage til serveren, når jeg ændre din kode til følgende :

<-- Client -->

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PORT 3553 // the port client will be connecting to

#define MAXDATASIZE 100

const char * response = "And handshake from the client!\n";

int main(int argc, char *argv[])
{
  int sockfd, numbytes;
  char buf[MAXDATASIZE];
  struct hostent *he;
  struct sockaddr_in their_addr;

  if (argc != 2) {
    fprintf(stderr,"usage: client hostname\n");
    exit(1);
  }

  if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info
    perror("gethostbyname");
    exit(1);
  }

  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
  }

  their_addr.sin_family = AF_INET;    // host byte order
  their_addr.sin_port = htons(PORT);  // short, network byte order
  their_addr.sin_addr = *((struct in_addr *)he->h_addr);
  memset(&(their_addr.sin_zero), '\0', 8);  // zero the rest of the struct

  if (connect(sockfd, (struct sockaddr *)&their_addr,
              sizeof(struct sockaddr)) == -1) {
    perror("connect");
    exit(1);
  }

  if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
    perror("recv");
    exit(1);
  }

  buf[numbytes] = '\0';
  send(sockfd,response,strlen(response),0); /* send to the client welcome message */
  printf("Received: %s",buf);

  close(sockfd);

  return 0;
}

<-- client end -->

<-- server -->

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define PORT 3553
#define BACKLOG 10
#define MAXDATASIZE 100

const char * greeting = "Welcome to my server\n";

main()
{
  char buf[MAXDATASIZE];
  int fd, fd2, numbytes; /* file descriptors */

  struct sockaddr_in server; /* server's address information */
  struct sockaddr_in client; /* client's address information */

  int sin_size;


  if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  /* calls socket() */
    printf("socket() errorn");
    exit(-1);
  }

  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);  /* Remember htons() from "Conversions" section? =) */
  server.sin_addr.s_addr = INADDR_ANY;  /* INADDR_ANY puts your IP address automatically */
  bzero(&(server.sin_zero),8); /* zero the rest of the structure */


  if(bind(fd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1) { /* calls bind() */
      printf("bind() errorn");
      exit(-1);
  }

  if(listen(fd,BACKLOG) == -1){  /* calls listen() */
      printf("listen() errorn");
      exit(-1);
  }

  while(1)
  {
    sin_size=sizeof(struct sockaddr_in);
    if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size))==-1){ /* calls accept() */
      printf("accept() errorn");
      exit(-1);
    }

    printf("You got a connection from %s \n",inet_ntoa(client.sin_addr) ); /* prints client's IP */

    send(fd2,greeting,strlen(greeting),0); /* send to the client welcome message */
    numbytes = 0;
    while (numbytes==0)
    {
      if ((numbytes=recv(fd2, buf, MAXDATASIZE-1, 0)) == -1) {
        perror("recv");
        exit(1);
      }
    }

    buf[numbytes] = '\0';

    printf("Received: %s",buf);
    printf("close \n");
    close(fd2); /*  close fd2 */
  }
}

<-- server end -->

At blive ved med at læse, indtil du ikke modtager noget : while (numbytes!=0), er stedet hvor kæden hopper af !
Avatar billede stormy Nybegynder
14. november 2004 - 22:50 #2
Hvis du vil have et komplet handshake mellem server og client :

<-- client begin -->

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PORT 3553 // the port client will be connecting to

#define MAXDATASIZE 100

const char * response = "And handshake from the client!\n";

int main(int argc, char *argv[])
{
  int sockfd, numbytes;
  char buf[MAXDATASIZE];
  struct hostent *he;
  struct sockaddr_in their_addr;

  if (argc != 2) {
    fprintf(stderr,"usage: client hostname\n");
    exit(1);
  }

  if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info
    perror("gethostbyname");
    exit(1);
  }

  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
  }

  their_addr.sin_family = AF_INET;    // host byte order
  their_addr.sin_port = htons(PORT);  // short, network byte order
  their_addr.sin_addr = *((struct in_addr *)he->h_addr);
  memset(&(their_addr.sin_zero), '\0', 8);  // zero the rest of the struct

  if (connect(sockfd, (struct sockaddr *)&their_addr,
              sizeof(struct sockaddr)) == -1) {
    perror("connect");
    exit(1);
  }

  if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
    perror("recv");
    exit(1);
  }

  buf[numbytes] = '\0';
  printf("Received: %s",buf);

  send(sockfd,response,strlen(response),0); /* send to the client welcome message */

  if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
    perror("recv");
    exit(1);
  }

  buf[numbytes] = '\0';
  printf("Received (2nd time) : %s",buf);

  close(sockfd);

  return 0;
}

<-- client end -->

<-- server begin -->

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define PORT 3553
#define BACKLOG 10
#define MAXDATASIZE 100

const char * greeting  = "Welcome to my server\n";
const char * greeting2 = "Glad to see live clients\n";

main()
{
  char buf[MAXDATASIZE];
  int fd, fd2, numbytes; /* file descriptors */

  struct sockaddr_in server; /* server's address information */
  struct sockaddr_in client; /* client's address information */

  int sin_size;


  if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ){  /* calls socket() */
    printf("socket() errorn");
    exit(-1);
  }

  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);  /* Remember htons() from "Conversions" section? =) */
  server.sin_addr.s_addr = INADDR_ANY;  /* INADDR_ANY puts your IP address automatically */
  bzero(&(server.sin_zero),8); /* zero the rest of the structure */


  if(bind(fd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1) { /* calls bind() */
      printf("bind() errorn");
      exit(-1);
  }

  if(listen(fd,BACKLOG) == -1){  /* calls listen() */
      printf("listen() errorn");
      exit(-1);
  }

  while(1)
  {
    sin_size=sizeof(struct sockaddr_in);
    if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size))==-1){ /* calls accept() */
      printf("accept() errorn");
      exit(-1);
    }

    printf("You got a connection from %s \n",inet_ntoa(client.sin_addr) ); /* prints client's IP */

    send(fd2,greeting,strlen(greeting),0); /* send to the client welcome message */
    numbytes = 0;
    while (numbytes==0)
    {
      if ((numbytes=recv(fd2, buf, MAXDATASIZE-1, 0)) == -1) {
        perror("recv");
        exit(1);
      }
    }

    buf[numbytes] = '\0';

    printf("Received: %s",buf);
    printf("Sending second message\n");

    send(fd2,greeting2,strlen(greeting2),0); /* Final part of handshake */

    printf("close \n");
    close(fd2); /*  close fd2 */
  }
}

<-- server end -->
Avatar billede sf Nybegynder
18. november 2004 - 18:17 #3
takker
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