Wie stoße ich einen Socket in C?

9

Ich habe Client-Code geschrieben, der einige Daten über einen Socket senden und eine Antwort vom Remote-Server zurücklesen soll.

Ich möchte diesen Code testen. Die Signatur der Funktion ist etwas in der Art von:

%Vor%

Dabei ist fd der Dateideskriptor des Sockets für den Remote-Server.

Nun blockiert die Funktion call_remote nach dem Senden der Daten beim Lesen der Antwort vom Server. Wie kann ich einen solchen Remote-Server für Unit-Tests des Codes stubben?

Idealerweise möchte ich etwas wie:

%Vor%

Ich möchte, dass stub_behavior aufgerufen wird und den 42.0 -Wert in den Stubed File Descriptor zurücksendet.

Kann ich das ganz einfach?

    
lindelof 12.07.2011, 20:08
quelle

4 Antworten

3

Wenn dies ein POSIX-System ist, können Sie fork() und socketpair() :

verwenden %Vor%

... Sie werden wahrscheinlich eine Fehlerüberprüfung hinzufügen und die Logik ändern, die die Anfrage liest.

Der Dateideskriptor, der von socketpair() erstellt wurde, ist ein normaler Socket und daher funktionieren Socket-Aufrufe wie send() und recv() problemlos.

    
caf 13.07.2011, 09:27
quelle
1

Sie können alles verwenden, auf das mit einem Dateideskriptor zugegriffen werden kann. Eine Datei oder, wenn Sie das Sperrverhalten simulieren möchten, eine Pipe.

Hinweis: Offensichtliche Socket-spezifische Aufrufe (Setsockopt, fcntl, ioctl, ...) funktionieren nicht.

    
Karoly Horvath 12.07.2011 20:11
quelle
0

Ich bin der gleichen Situation begegnet und teile meine Herangehensweise. Ich habe Netzwerk-Dumps erstellt, genau, was der Client senden sollte und wie die Server-Antwort lauten sollte. Ich führte dann einen Byte-für-Byte-Vergleich der Client-Anfrage durch, um sicherzustellen, dass sie übereinstimmte. Wenn die Anfrage gültig ist, lese ich aus der Antwortdatei und sende sie zurück an den Client.

Ich freue mich, weitere Details zur Verfügung zu stellen (wenn ich an einer Maschine mit Zugriff auf diesen Code bin)

    
Michael Mior 12.07.2011 20:15
quelle
0

Hier ist eine C ++ - Implementierung (ich weiß, die ursprüngliche Frage war für C, aber es ist einfach, wenn gewünscht, zurück in C zu konvertieren). Es funktioniert wahrscheinlich nicht für sehr große Strings, da der Socket wahrscheinlich blockiert, wenn der String nicht gepuffert werden kann. Aber es funktioniert für kleine Unit Tests.

%Vor%     
Mark Lakata 26.09.2016 21:18
quelle

Tags und Links