• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Socketprogrammierung unter C (TCP/IP)

Status
Für weitere Antworten geschlossen.

daryY

Neues Mitglied
Hallo =)

ich möchte ein TCP-Socket programmieren (mit Red Hat Enterprise).
Es sollte möglichst einfach und verständlich sein.
Habe schon im WWW sämtliche Seiten durchforstet, allerdings gibt es relativ wenige gute Erklärungen.

Weiß vllt jemand eine gute Seite, wo man leicht verständlich Socket-Tutorials durchlesen kann?

ich habe es auch schon selbst versucht. Es wird auch alles gemacht, das Socket wird erstellt, gebunden, der Client kann darauf zugreifen nur wird die Nachricht nicht gesant.

Hier der Quelltext:


Client:
Code:
#include <sys/types.h>
#include <sys/socket.h>
#define SERVER_PORT 52000
#define BUF 1024

#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

main()
{
  int sock=0, cn=0, size=0;
  struct sockaddr_in address;
  //char buffer[BUF];
  char buffer[] = "Hello World";
  // char *buffer = malloc (BUF);

  /*Socket anlegen*/
  printf("\nClient Socket gestartet\n");
  sock=socket(AF_INET, SOCK_STREAM, 0);
  if (sock==-1)
    printf("Socket Anlegen fehlgeschlagen\n");
  else
    printf("Socket angelegt\n");

  /*Connect*/
  /*Zieladresse festlegen*/
  address.sin_addr.s_addr = inet_addr("127.0.0.1"); //IP- addr.sin_addr.s_addr
  address.sin_family = AF_INET; //Internet oder Lokal? Adressfamily
  address.sin_port = htons (SERVER_PORT); //Port
  /*"Connect"*/
  cn=connect(sock, (struct sockaddr*) &address, sizeof(address));
         if (cn==-1)
            printf("Verbinden fehlgeschlagen\n");
         else
            printf("Verbindung hergestellt - verbunden mit Server\n");

  /*Send*/

  //printf("Bitte Nachricht zum Versenden eingeben:\n");
  //gets(buffer);
  //fgets(buffer, BUF, stdin);
  size = send(sock, buffer, strlen(buffer), 0);
  if (cn==-1)
    printf("Senden felgeschlagen");
  else
    printf("Nachricht gesendet");
    /*close(sock);
      return EXIT_SUCCESS;*/
}

Server:
Code:
#include <sys/types.h>
#include <sys/socket.h>
#define SERVER_PORT 52000
#define BUF 1024

#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

main()
{
  int sock=0, bnd=0, lsn=0, acc=0, size=0;
  struct sockaddr_in address;
  char buffer[BUF]; //malloc?
  //char *buffer = malloc (BUF);
  int address_size;

  /*Socket anlegen*/
  printf("\nServer Socket gestartet\n");
  sock=socket(AF_INET, SOCK_STREAM, 0);
  if (sock==-1)
    printf("Socket Anlegen fehlgeschlagen\n");
  else
    printf("Socket angelegt\n");

  /*Binden*/
  address.sin_family = AF_INET;
  address.sin_addr.s_addr = INADDR_ANY; //Von überall erreichbar
  address.sin_port = htons (SERVER_PORT);
  bnd=bind(sock, (struct sockaddr*) &address,sizeof (address));
    if (bnd==-1)
      printf("Binden fehlgeschlagen\n");
    else
      printf("Binden erfolgreich\n");

  /*Listen*/
  lsn=listen(sock, 5);
  if (lsn==-1)
    printf("Listen fehlgeschlagen\n");
  else
    printf("Listen ...\n");
  /*Accept*/
  address_size=sizeof(address);
  acc=accept(sock, (struct sockaddr*) &address, &address_size); //address oder sockaddr_in?  
  //bei while -> sizeof nicht in der Schleife

  if (acc==-1)
    printf("Verbinden fehlgeschlagen\n");
  else
    printf("Verbindung hergestellt - ein Client ist verbunden\n");

  /*recv*/
  size = recv(sock, buffer, sizeof(buffer)-1, 0);
    if (size>0) {
    buffer[size]='\0';
    printf("Nachricht emfangen: %s\n", buffer);
    }
  
       /*close(sock);
    return EXIT_SUCCESS;*/
}
 
Werbung:
du recvst auf dem lisentning sock auf dem die verbindungen einlaufen,
du erstellst aber beim accepten einen sock für DIESEN clienten.


Also etwas bildlicher:

der listening sock ist eine art Tor

der accept sock ist die Konkrete verbindung, also das händereichen beim eintritt ins tor! darüber wird versandt
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben