Die TCP-API ist Vollduplex. Dies bedeutet, dass die TCP-API es ermöglicht, Daten von beiden Seiten der Verbindung gleichzeitig zu senden. Lassen Sie uns die Quelle Beweis sehen:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
void do_write(const char* who, int socket) {
const char hello[] = "hello!";
if(0 < write(socket, hello, strlen(hello)))
printf("%s: write done ok\n", who);
else
printf("%s: write error: %s\n", who, strerror(errno));
}
void do_read(const char* who, int socket) {
/* do parental things with this end, like reading the child's message */
char buf[1024];
int n = read(socket, buf, sizeof(buf));
if(0 < n)
printf("%s: received '%.*s' %db\n", who, n, buf, n);
else if(0 == n)
printf("%s: no data available\n", who);
else
printf("%s: read error: %s\n", who, strerror(errno));
}
int main() {
int fd[2];
static const int parent = 0;
static const int child = 1;
pid_t pid;
socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
pid = fork();
if (pid == 0) { /* child process */
close(fd[parent]);
do_write("child", fd[child]);
do_read("child", fd[child]);
/* sleep(1); */
do_write("child", fd[child]);
do_read("child", fd[child]);
} else { /* parent process */
close(fd[child]);
do_write("parent", fd[parent]);
do_read("parent", fd[parent]);
do_write("parent", fd[parent]);
do_read("parent", fd[parent]);
}
return 0;
}
Der Ausgang (auf FreeBSD) ist:
parent: write done ok
child: write done ok
child: received 'hello!' 6b
child: write done ok
parent: received 'hello!hello!' 12b
parent: write done ok
child: received 'hello!' 6b
parent: no data available
So TCP-API ist Vollduplex und Daten können von beiden Seiten an die sended gleiche Zeit. Ich denke, dass die Implementierung auch Vollduplex ist, aber es muss komplizierter zu erkennender Test geschrieben werden. Dies ist natürlich abhängig von der Implementierung. Und eine gute Implementierung kann sich nicht auswirken, wenn mindestens eine Transportkettenverbindung nicht Vollduplex ist.
Modernes Ethernet ist Vollduplex. –
@YuHao Danke, aber was ist, wenn in einer alten Halbduplex-Ethernet-Umgebung? Wie könnte TCP dort passen? – smwikipedia
TCP als 'Transport Layer Protocol' bietet einen bidirektionalen Kanal für die obere Schicht, ich denke, es sollte in diesem Kontext betrachtet werden. – sanjayk79