Sprachen / C / Netzwerk

Netzwerk

Client/Server Model

Die Netzwerkprogrammierung wird hier anhand des Client/Server Models wiki illustriert. Es ist ein einfaches Konzept: Der Server nimmt Anfragen von Clients entgegen, bearbeitet sie und schickt die Antwort an den Client zurück. Komplexere Interaktionen werden zunächst außen vor gelassen. Für die Kommunikation werden Sockets wiki verwendet.

Beispiel

Das folgende Beispiel stellt einen Server da, der die einzelnen Buchstaben der eingehenden Nachrichten gegebenenfalls in Großbuchstaben umwandelt (falls Kleinbuchstaben vorhanden sind).

Gemeinsame Header-Datei
Netzwerk/net
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAX_BUF  256
#define DEF_PORT 62341
#define DEF_HOST "localhost"

int sockfd, n_bytes;
char mess[256];
struct sockaddr_in serv_addr;

void error (char * message)
{
  perror(message);
  exit(1);
} 
      
Server
Netzwerk/server
#include "net.h"

int main(int argc, char *argv[])
{
  int newsockfd;
  socklen_t clie_len;
  struct sockaddr_in clie_addr;
     
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockfd < 0)
    error("ERROR opening socket");
  
  bzero((char *) &serv_addr, sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons(DEF_PORT);
  
  if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
    error("ERROR on binding");
  
  for (;;)
  { 
    listen(sockfd,5);
    clie_len = sizeof(clie_addr);
  
    newsockfd = accept(sockfd, (struct sockaddr *) &clie_addr, &clie_len);
    if (newsockfd < 0) 
      perror("ERROR on accept");
  
    bzero(mess,256);
    n_bytes = read(newsockfd,mess,255);
    if (n_bytes < 0) 
      perror("ERROR reading from socket");
    
    for (int i = 0; i < strlen(mess);i++)
      mess[i] = mess[i] > 96 && mess[i] < 123 ? mess[i] -32 : mess[i];
  
    n_bytes = write(newsockfd,mess,strlen(mess) + 1);
    if (n_bytes < 0) 
      perror("ERROR writing to socket");
  }
  
  close(newsockfd);
  close(sockfd);
  return 0; 
} 
      
Client
Netzwerk/client
#include  
#include "net.h"

int main(int argc, char *argv[])
{
  struct hostent *server;

  if (argc == 1)
  {
    fprintf(stderr,"Usage: ./client message\n");
    exit(1);
  }
  strcpy( mess,argv[1]);
    
  sockfd = socket(AF_INET, SOCK_STREAM, 0);  
  if (sockfd < 0) 
    error("ERROR opening socket");
    
  server = gethostbyname("localhost");
  if (server == NULL)
    error("ERROR, no such host");

  bzero((char *) &serv_addr, sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr,server->h_length);
  serv_addr.sin_port = htons(DEF_PORT);
  
  if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
    error("ERROR connecting");
  
  n_bytes = write(sockfd, mess,strlen( mess));
  if (n_bytes < 0) 
    error("ERROR writing to socket");
  
  bzero( mess,MAX_BUF);
  n_bytes = read(sockfd, mess,MAX_BUF - 1);
  if (n_bytes < 0) 
    error("ERROR reading from socket");
  
  printf("%s\n", mess);
  close(sockfd);
  return 0;
} 
      
Nutzung

./server
./client hallo
HALLO
./client HaLlO 123 Vier
HALLO 123 VIER
Autor: behalx
Erstellt am: 26.08.2011
Zuletzt modifiziert: 24.04.2010
Lizenz:
Creative Commons License