TCP C:客户端未使用您输入的IP地址连接?

TCP C:客户端未使用您输入的IP地址连接?,c,tcp,C,Tcp,这只是一个简单的聊天程序,echoclient将数据发送到echoserver。在给我们的示例代码中,为什么如果我使用ip地址xxx.xxx.xxx.xxx(其中xxx的范围为0-255,例如123.124.12.1),客户端不会连接,但如果我输入随机数,例如12312或23423,客户端会连接?在本例中,当我打印网络订购的ip时,它给出 我了解到127.0.0.1是本地主机的环回ip地址。但我的问题是,为什么客户端只与该地址连接 当我运行/echoclient12312时, 客户端连接,程序正

这只是一个简单的聊天程序,echoclient将数据发送到echoserver。在给我们的示例代码中,为什么如果我使用ip地址xxx.xxx.xxx.xxx(其中xxx的范围为0-255,例如123.124.12.1),客户端不会连接,但如果我输入随机数,例如12312或23423,客户端会连接?在本例中,当我打印网络订购的ip时,它给出

我了解到127.0.0.1是本地主机的环回ip地址。但我的问题是,为什么客户端只与该地址连接

当我运行
/echoclient12312
时, 客户端连接,程序正常运行。但是如果我运行
/echoclient 123.123.12.1
,客户端将无法连接

还是我接错了

代码如下:

echoserver.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>



int main(int argc, char **argv)
{
  int listenfd,connfd;
  struct sockaddr_in servaddr,cliaddr;
  socklen_t len = sizeof(cliaddr);
  char cli_ip[32];
  char mesg[1024];

  listenfd = socket(PF_INET,SOCK_STREAM,0);
  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(54322);
  if ( bind( listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr) ) < 0 ){
      perror(NULL);
      exit(-1);
  }

  //not present in udp server
  listen(listenfd,2);

  while(1){
      //not present in udp server
    connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&len);
    inet_ntop(AF_INET,(struct in_addr *) &cliaddr.sin_addr, cli_ip, sizeof(cli_ip) );
    printf("Client %s connected. \n",cli_ip);     
    while(1){
      memset(mesg,0,sizeof(mesg));
      if( recvfrom(connfd,mesg,sizeof(mesg),0,(const struct sockaddr *)&cliaddr,&len) > 0 ){
            printf("From %s port %d: %s",cli_ip,ntohs(cliaddr.sin_port),mesg);
      }
      else {
        printf("Client %s disconnected. \n",cli_ip);      
        break;
      }
    }
    close(connfd);
  }
  close(listenfd);
  return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int listenfd,connfd;
servaddr、cliaddr中的结构sockaddr\u;
socklen_t len=sizeof(cliaddr);
char cli_ip[32];
char-mesg[1024];
listenfd=套接字(PF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
servaddr.sinu port=htons(54322);
if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0{
perror(空);
出口(-1);
}
//udp服务器中不存在
听(listenfd,2);
而(1){
//udp服务器中不存在
connfd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);
inet_ntop(AF_inet,(struct in_addr*)和cliaddr.sin_addr、cli_ip、sizeof(cli_ip));
printf(“客户端%s已连接。\n”,cli\u ip);
而(1){
memset(mesg,0,sizeof(mesg));
if(recvfrom(connfd,mesg,sizeof(mesg),0,(const struct sockaddr*)和cliaddr,&len)>0){
printf(“从%s端口%d:%s”,cli_ip,ntohs(cliaddr.sin_端口),mesg);
}
否则{
printf(“客户端%s已断开连接。\n”,cli\u ip);
打破
}
}
关闭(connfd);
}
关闭(listenfd);
返回0;
}
echoclient.c

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>



int main(int argc, char **argv)
{
  int sockfd;
  struct sockaddr_in servaddr;
  socklen_t len = sizeof(servaddr);
  char mesg[1024];

  if(argc!=2){ 
      printf("Usage: %s <ip_addr>\n",argv[0]);
      exit(1);
  }

  sockfd = socket(PF_INET,SOCK_STREAM,0);
  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(54322);
  inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
  //printf("Network ordered ip: %08x\n",servaddr.sin_addr.s_addr);

  //not present in udp clients
  connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

  while(1){
    fgets(mesg,sizeof(mesg),stdin);
    sendto(sockfd,mesg,strlen(mesg),0,(const struct sockaddr *)&servaddr,len);
  }
  close(sockfd);
  return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int-sockfd;
servaddr中的结构sockaddr_;
socklen_t len=sizeof(servaddr);
char-mesg[1024];
如果(argc!=2){
printf(“用法:%s\n”,argv[0]);
出口(1);
}
sockfd=套接字(PF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sinu port=htons(54322);
inet\u pton(AF\u inet,argv[1],&servaddr.sin\u addr);
//printf(“网络订购ip:%08x\n”,servaddr.sin\u addr.s\u addr);
//udp客户端中不存在
connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
而(1){
fgets(mesg、sizeof(mesg)、标准DIN);
发送到(sockfd,mesg,strlen(mesg),0,(const struct sockaddr*)和servaddr,len);
}
关闭(sockfd);
返回0;
}

提前谢谢你

当您输入无效地址时,例如
12312
,inet\u pton将失败。当您在
servaddr
中将地址归零后,ip地址为0.0.0.0。0.0.0.0将被解释为“此主机”。并且您的服务器被设置为侦听它运行的主机上的任何地址

如果您在与客户机相同的主机上运行服务器,那么当您的客户机连接到您运行客户机的主机时,他们可以建立连接

如果您输入了一个有效地址,例如123.123.12.1,那么它自然无法成功连接到该主机-除非您在该主机上运行服务器,或者该主机上的端口54322上发生了其他侦听事件


(0.0.0.0通常会被路由到主机上的环回地址-您可以尝试,例如,
ping 0.0.0
以查看哪个地址做出响应)

多个问题属于多个问题,每个问题都有自己的相关示例代码等。通常,你的任何给定问题越容易阅读和回答,你就越有可能得到答案。(而且,我真的不知道你最后一段的其余部分是什么意思。)编辑了我的问题对不起,如果最后一段引起了混乱。我只需要回答我的第一个问题。老实说,我不知道我是否完全正确地理解了TCP客户端。我真的需要一些启发。谢谢你的回复!=)但接下来的问题是:“在该主机的54322端口上发生了其他侦听事件”是什么意思?例如,如果我想让这段代码接受多个客户机,如何使每个客户机的ip地址彼此不同?还是我必须?(基本上我只是想区分一个客户机和另一个客户机)我只需要大致的想法,还是需要为此发布一个单独的线程?再次感谢!=))@ingenieria您不需要使每个IP地址都不同。5个属性定义TCP套接字:源IP地址、目标IP地址、源端口、目标端口和协议(TCP)。如果要将客户端从本地主机连接到本地主机上的服务器,请连接到目标端口54322。TCP堆栈将为客户端选择一个随机源端口。但您需要同时处理连接,例如,在单独的线程中,或通过使用select()或poll()复用连接,我所说的“端口54322上发生了其他侦听”,是指您试图连接到IP 123.123.12.1,这可能是某个人的某台计算机,也许他们也在端口54322上运行了一些东西,在这种情况下,连接可能会成功。
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>



int main(int argc, char **argv)
{
  int sockfd;
  struct sockaddr_in servaddr;
  socklen_t len = sizeof(servaddr);
  char mesg[1024];

  if(argc!=2){ 
      printf("Usage: %s <ip_addr>\n",argv[0]);
      exit(1);
  }

  sockfd = socket(PF_INET,SOCK_STREAM,0);
  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(54322);
  inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
  //printf("Network ordered ip: %08x\n",servaddr.sin_addr.s_addr);

  //not present in udp clients
  connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

  while(1){
    fgets(mesg,sizeof(mesg),stdin);
    sendto(sockfd,mesg,strlen(mesg),0,(const struct sockaddr *)&servaddr,len);
  }
  close(sockfd);
  return 0;
}