Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 套接字编程端口号_C_Sockets - Fatal编程技术网

C 套接字编程端口号

C 套接字编程端口号,c,sockets,C,Sockets,关于这个教程有一些我不明白的地方。我希望有人能给我解释一下。 在服务器程序中,它的端口被初始化为1101(第14行) 在客户端程序中,它的端口也是1101 12. //The port and address you want to connect to 13. int host_port= 1101; 14. char* host_name="127.0.0.1"; 现在问题来了 客户端程序中的int host_端口是否与服务器程序中的int host_端口相同 为

关于这个教程有一些我不明白的地方。我希望有人能给我解释一下。

在服务器程序中,它的端口被初始化为1101(第14行)

在客户端程序中,它的端口也是1101

12.     //The port and address you want to connect to
13.     int host_port= 1101;
14.     char* host_name="127.0.0.1";
现在问题来了

客户端程序中的int host_端口是否与服务器程序中的int host_端口相同

为什么端口号是1101?(当我将端口号更改为80或其他数字(如1234)时,出现错误111)

isnt char*host_name=“127.0.0.1”;应该是指客户端ip地址吗?为什么我必须特别使用环回地址而不是192.x.x.x

多谢各位

我意识到我的错误,我在服务器程序之前运行我的客户机。。。。。。。。。在客户端程序中,我没有

serv_addr.sin_addr.s_addr = INADDR_ANY; <<<<<<

serv_addr.sin_addr.s_addr=INADDR\u ANY 服务器和客户端端口号必须匹配。端口号是服务器地址的一部分。如果客户端应用了错误的地址,即错误的端口号或错误的服务器地址,则消息将传递给错误的收件人。很像邮政地址。如果你写信给你的朋友,你必须提到街道号码和城市。如果你输入了错误的街道号码,这封信就会到达其他地方

然后必须使用未使用的端口号。80是一个众所周知的端口号;为HTTP保留。如果使用了端口号,则无法将其分配给其他人。在您的机器上,端口80可能正在使用中。您不希望您的家庭街道地址被分配给其他人,或者其他人分配给与您相同的房子。那会很不方便。你可以想象如果计算机允许两个程序使用相同的端口号会发生什么

您总是可以将某人从其众所周知的端口号中驱逐出去。您可以关闭web服务器(如果您的计算机上正在运行),然后编写客户端/服务器应用程序以使用端口80


您可以使用192.xxx地址。前提是计算机上的防火墙没有阻止它。因为当环回在计算机内循环时,192.xx寻址方案将导致数据包在LAN上传出并返回。在这一点上,在某些操作系统上,我可能是错的。进行实验,让我们知道这是对还是错

客户端在
connect()
方法中使用的IP地址和端口是服务器的。不是客户的。客户端正在该IP:端口连接到服务器


客户端自己的IP地址和端口是自动分配的,除非出于某种原因在
connect()之前调用
bind()

主机端口是绑定服务器程序的端口,因此您也必须在客户端中使用相同的端口来连接到服务器

端口号和IP地址一起构成传输地址。如果您希望服务器上的任何IP地址都能正常工作,那么可以使用INADDR_any将服务器绑定到计算机上的所有有效IP

sockfd = socket(AF_INET, SOCK_STREAM, 0);

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY; <<<<<<
serv_addr.sin_port = htons(2000);

bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
sockfd=socket(AF_INET,SOCK_STREAM,0);
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=INADDR_ANY;
  • 你对港口的选择只是一种选择

    (例如端口“80”表示http,端口“25”表示SMTP,端口“443”表示HTTPS等)不应使用。但其他一切都可以抢夺

  • 服务器绑定到的端口号必须与客户端尝试连接的端口匹配,否则“连接”将失败

  • 最后,您可以为您的客户机或服务器使用任何可用的“接口”。(例如,“127.0.0.1”)就是这样一个接口。“192.x.x.x.”(适用于您的特定局域网)可能是另一种情况

    关键是客户端必须与服务器具有网络连接。这意味着物理连接和可寻址性(两个IP要么在同一个LAN上,要么在两个主机之间存在可靠的连接)

  • 如果你不熟悉的话,我强烈建议你去看看。这是一篇简短但优秀的TCP/IP和套接字编程介绍。保证满意


  • 没有人强迫你使用任何东西,选择你想要的任何东西。只要不要谎称端口是你的,如果它们显然不是(80)。如果使用80或1234,则不应出现任何错误。80用于HTTP。但是,当服务器端口号和客户端端口号不同时,将无法建立连接。我无法相信您会出现编译器错误(111)当你只更改端口号时。这是一个套接字错误吗?这显然是一个套接字错误,111被拒绝连接。如果你尝试打开端口80并且web服务器已经运行,你肯定会被拒绝请求。哈哈,谢谢大家。我实际上用我的错误更新了我的初始帖子。这是一个愚蠢的错误,我忘记了首先运行服务器。再次感谢您的帮助。您肯定可以将不同的套接字绑定到同一个端口号,这就是
    SO\u REUSEADDR
    要做的。好的。我并不特别知道。但是,知道SO\u REUSEADDR的人难道不知道不写已编写的问题吗?重用不是很简单吗复杂?除了端口号和地址外,还强迫您使用某种寻址方案?
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY; <<<<<<
    serv_addr.sin_port = htons(2000);
    
    bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));