【问题标题】:why we don't use client address inside TCP programe?为什么我们不在 TCP 程序中使用客户端地址?
【发布时间】:2015-06-17 00:43:29
【问题描述】:

我是 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 地址?服务器如何识别客户端机器的这个端口和地址?请解释有关服务器和客户端的整个概念

【问题讨论】:

标签: c sockets tcp


【解决方案1】:
  1. 为什么我们不在 TCP 程序中使用客户端地址?

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

  1. 我知道客户端程序初始化服务器的端口和IP地址。是真的吗?

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

  1. 如果是真的那么为什么我们在服务器程序中使用端口和IP地址?我很困惑。

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

  1. 另一个问题,为什么我们不在客户端程序中使用客户端端口和 IP 地址?

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

  1. 服务器如何识别客户端机器的这个端口和地址?

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

  1. 请解释一下关于服务器和客户端的全部概念

太宽泛了。

【讨论】:

  • 这是不公平的。他的问题是好的,即使表述得不好。我希望拥有 139k 声誉的人会花时间编辑和改进问题,而不是讽刺性的回复。
  • @BrianWhite 我已经回答了他所有的好问题。你的评论让我完全困惑。
  • 这不是事实信息。那些批评性的评论后来被删掉了。但我认为您知道这一点,否则您不会进行编辑。
【解决方案2】:

我知道客户端程序初始化了服务器的端口和 IP 地址。是真的吗?

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

为什么我们在服务器程序中使用端口和 IP 地址?

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

服务器计算机可能有多个本地 IP,如果它连接到多个网络,那么服务器应用程序可能指定一个特定本地要收听的 IP。如果未指定 IP,则服务器将侦听 所有 本地 IP。这用于控制允许从哪些网络客户端进行连接。

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

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

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

客户端应用可以指定它想要连接的本地端口。一些协议需要这个,或者防火墙/路由器策略可能需要它。如果未指定端口,则操作系统会随机选择一个可用端口。无论哪种方式,这都是客户端连接的端口。

服务器如何识别客户端机器的这个端口和地址?

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

请解释服务器和客户端的全部概念

关于这个主题有整本书。它超出了 StackOverflow 的范围。

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 2014-09-08
    • 1970-01-01
    • 2011-01-30
    • 2017-01-11
    • 2015-02-16
    • 2012-09-27
    • 2015-10-22
    • 2010-11-08
    相关资源
    最近更新 更多