为什么我们不在 TCP 程序中使用客户端地址?

why we don't use client address inside TCP programe?

我是 TCP 套接字编程的初学者。我想澄清一些关于 TCP 编程概念的疑问。我有一个客户端和服务器程序。这是我的 C 代码。 服务器代码:

 #define MYPORT 39937

 struct  sockaddr_in serveraddress,cliaddr;

 sd = socket( AF_INET, SOCK_STREAM, 0 );
 memset( &serveraddress, 0, sizeof(serveraddress) );
 serveraddress.sin_family = AF_INET;
 serveraddress.sin_port = htons(MYPORT);//PORT NO
 serveraddress.sin_addr.s_addr = htonl(INADDR_ANY);//ADDRESS
 retbind=bind(sd,(struct sockaddr*)&serveraddress,sizeof(serveraddress));

 connfd=accept(sd,(struct sockaddr*)&cliaddr,&len);

客户代码:

  struct  sockaddr_in serveraddress;

  sd = socket( AF_INET, SOCK_STREAM, 0 );
  argv[1]//for ip address
  argv[2]//for port
  argv[3]//for string to send

   memset( &serveraddress, 0, sizeof(serveraddress) );
   serveraddress.sin_family = AF_INET;
   serveraddress.sin_port = htons(atoi(V[2]));//PORT NO
   serveraddress.sin_addr.s_addr = inet_addr(V[1]);//ADDRESS

   if(connect(sd,(struct sockaddr*)&serveraddress,
               sizeof(serveraddress)) < 0)
    {
            printf("Cannot Connect to server");
            exit(1);
    }

    write(sd, V[3], strlen(V[3]));

我知道客户端程序初始化服务器的端口和IP地址。是真的吗?如果这是真的那么为什么我们在服务器程序中使用端口和 IP 地址? 我很迷惑 。另一个问题为什么我们不在客户端程序中使用客户端端口和 IP 地址?服务器如何识别客户端机器的这个端口和地址?请解释有关服务器和客户端的完整概念

  1. why we don't use client address inside TCP program?

因为我们通常不需要。见下文。

  1. I know that client program initialize the port and ipaddress of server. Is it true?

客户端需要知道服务器的IP地址和端口,并用它来初始化一个数据结构来连接它,但这样说是不准确的客户端以任何方式初始化服务器的任何内容。

  1. If it is true then why we use port and ipaddress inside server program? I am confused.

服务器需要初始化自己的IP地址和端口,才能监听。客户端需要在其自己的内存space中初始化另一个数据结构以连接到服务器。仅仅因为它具有相同的名称并不意味着它是同一块内存。

  1. another question why we don't use client port and ipaddress inside client program?

客户端不需要知道自己的地址和端口。

  1. how server identifies this port and address of client machine?

没有。它不需要知道。它有一个连接到客户端的套接字。在大多数情况下,这就是它所需要的。客户端发送连接请求;服务器通过同一连接回复。

  1. Please explain the entire concepts about server and client

范围太广。

I know that client program initialize the port and ipaddress of server . Is it true ?

客户端应用必须指定要连接的特定远程服务器IP/port,是的。

why we use port and ipaddress inside server program ?

服务器应用程序可以指定一个特定它想要监听的本地端口。如果未指定端口,OS 会随机选择一个可用端口。无论哪种方式,这都是客户端连接到的端口。

服务器机器可能有多个本地IP,如果它连接到多个网络,所以服务器应用程序可能指定一个具体 本地 IP 监听。如果未指定 IP,服务器将侦听 所有 个本地 IP。这用于控制允许客户端连接的网络。

why we don't use client port and ipaddress inside client program ?

如果需要,您可以。这是可选的

一台客户端机器可能有多个本地IP,如果它连接到多个网络。客户端可以指定一个特定本地IP进行连接,如果它知道特定网络连接到达服务器。如果未指定 IP,OS 使用其内部路由表确定要使用的网络,然后从该本地 IP 连接。

客户端应用程序可以指定它想要连接的本地端口。一些协议需要这个,或者 firewall/router 策略可能需要它。如果未指定端口,OS 会随机选择一个可用端口。无论哪种方式,这都是客户端连接的端口。

how server identifies this port and address of client machine ?

accept()getpeername() 报告正在与服务器通信的客户端的远程 IP/port。

Please Explain the entire concepts about server and client

有整本关于该主题的书籍。它超出了 Whosebug 的范围。