Forum: PC-Programmierung C Socketprogrammierung. Was könnte man weglassen?


von Christian H. (christian_h52)


Lesenswert?

Für eine Übung müssen wir Sockets programmieren und daher haben wir 
einige Tutorials durchgelesen, leider sind diese recht unterschiedlich 
und daher würde ich euch um einige Hilfestellungen bitten.

Die aktuelle Grundstruktur (ohne Fehlermeldungen) schaut wie folgt aus
1
int sockfd, newsockfd;
2
  struct sockaddr_in serv_addr;
3
  char buffer[BUF];
4
  
5
  memset(buffer, 0, BUF * sizeof(*buffer));
6
7
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
8
  
9
  memset(&serv_addr, 0, sizeof(serv_addr));
10
  
11
  serv_addr.sin_family = AF_INET;
12
  serv_addr.sin_addr.s_addr = INADDR_ANY;
13
  serv_addr.sin_port = htons(PORT);
14
  
15
  bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
16
  
17
  listen(sockfd, 5);
18
  newsockfd = accept(sockfd, 0, 0);

Werden structs automatisch 0-initialisiert? Kann ich mir daher das 
zweite Memset sparen? - Weiters könnte ich ja auch
1
 serv_addr.sin_addr.s_addr = INADDR_ANY;
 weglassen, denn INADDR_ANY ist sowieso 0 - oder?


Dieser Server sollte eigentlich alle Anfragen annehmen und verarbeiten. 
Wichtig ist nur, dass er TCP/IP verwendet.

Weiters wäre das erste memset auch überflüssig, da der Inhalt ja 
überschrieben wird (außer im Fehlerfall) oder?

mfg
chris

von Udo S. (urschmitt)


Lesenswert?

C Grundlagen:
Welche Arten von Variablen werden initialisiert und welche nicht?
Stichwort: globale, statische, automatische, Stack, Heap, ...
Ein Struct ist nur eine Beschreibung einer Variablen keine Variable 
selbst. Insofern ist die Frage unsinnig:

Christian H. schrieb:
> Werden structs automatisch 0-initialisiert?

Wenn ich meine uralten Socketkenntnisse rauskrame:
Da fehlt die komplette Fehlerbehandlung

von Udo S. (urschmitt)


Lesenswert?

Ach so noch ein Tipp zu socket Programmierung:
Wenn man aus einem Socket liest darf man sich NIE darauf verlassen, daß 
wenn man als Beispiel 4 Bytes auf der einen Seite reinschreibt man auf 
der Empfangsseite auch direkt 4 Bytes mit einem read - Call lesen kann. 
Es kann immer passieren daß auch bei wenigen Bytes die Daten in Pakete 
getrennt werden und mit mehreren Calls einzeln empfangen und 
zusammengesetzt werden müssen.

von Christian H. (christian_h52)


Lesenswert?

Das heißt jetzt, dass ich sie einfach static setze? global wäre ja 
sicherheitstechnisch nicht so gut, da sie ja dann in jeder Datei sichbar 
wäre oder?

Daher: Wenn ich die Variablen static setze, spare ich mir das setzen von 
INADDR_ANY und die memsets - richtig?


ps: die fehlermeldungen habe ich absichtlich weggelassen, damit der 
beispielcode nicht zu lange wird.

von Udo S. (urschmitt)


Lesenswert?

Christian H. schrieb:
> Das heißt jetzt, dass ich sie einfach static setze? global wäre ja
> sicherheitstechnisch nicht so gut, da sie ja dann in jeder Datei sichbar
> wäre oder?
>
> Daher: Wenn ich die Variablen static setze, spare ich mir das setzen von
> INADDR_ANY und die memsets - richtig?

NEIN, das heisst daß man diese Grundlagen beim programmieren wissen 
sollte oder zumindest wissen wo es steht.
Wenn du eine Variable global oder statisch anlegst und du kommst das 2. 
Mal in die Funktion, die die Variable benutzt, ist sie auch nicht mehr 
auf 0 initialisiert, da dann noch der Wert vom 1. Funktionsdurchlauf 
drinsteht

Ob du deine Variablen lokal auf dem Stack oder als static oder global 
anlegst kommt auf dein Problem an und nicht auf die Faulheit ein memset 
zu sparen.

Es macht fast immer Sinn Variablen sauber zu initialisieren, denn 
schnell hat man etwas geändert und übersieht daß man sich auf eine 
Anfangsinitialisierung verlassen hat. Und schon sucht man stundenlang 
Fehler.

Merke: Optimierung macht man erst wenn das Programm läuft.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.