有些关于本教程的内容我不明白。我希望有人可以向我解释。 http://www.tidytutorials.com/2009/12/c-winsock-example-using-client-server.html
在服务器程序中,它的端口初始化为1101(第14行)
13. //The port you want the server to listen on
14. int host_port= 1101;
在客户端程序中它的端口也是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_port是否与服务器程序中的int host_port相同?
为什么端口号具体为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; <<<<<<
答案 0 :(得分:1)
服务器端口号和客户端端口号必须匹配。端口号是服务器地址的一部分。如果客户端应用了错误的地址,即错误的端口号或错误的服务器地址,则该消息将被传递给错误的接收者。很像邮政地址。如果你写信给你的朋友,你必须提到街道号和城市。如果你输入了错误的街道号码,这封信就会到达其他地方。
然后你必须使用未使用的端口号。 80是众所周知的端口号;为HTTP保留。如果使用端口号,则无法将其分配给其他人。在您的机器上,端口80可能正在使用中。您不希望将您的家乡街道地址分配给其他人或其他人分配与您相同的房屋。那会很不方便。您可以想象如果计算机允许两个程序使用相同的端口号,会发生什么。
您总是可以从众所周知的端口号中驱逐某人。您可以关闭Web服务器(如果您的计算机上正在运行),然后编写客户端/服务器应用程序以使用端口80.
您可以使用192.xxx地址。前提是计算机上的防火墙未阻止它。因为虽然环回在计算机内循环,但192.xx寻址方案会导致数据包在LAN上运行并返回。在某些操作系统上,我可能错了。试验并告诉我们这是对还是错。
答案 1 :(得分:1)
主机端口是绑定服务器程序的端口,因此您必须在客户端中使用相同的端口连接到服务器。
端口号和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));
答案 2 :(得分:1)
您选择的端口#只是一个选择。
"Well known port#'s"(例如端口&#34; 80&#34;用于http,&#34; 25&#34;用于SMTP,&#34; 443&#34;用于HTTPS等)不应该使用。但其他一切都可以争夺。
服务器绑定到的端口号必须匹配客户端尝试连接的端口号 - 或者&#34; connect&#34;会失败。
最后,您可以使用任何可用的&#34;界面&#34;适用于您的客户或您的服务器。 "Loopback"(例如,&#34; 127.0.0.1&#34;)就是这样一个接口。 &#34; 192.x.x.x&#34。 (对于您的特定LAN)可能是另一个。
关键是客户端必须与服务器建立网络连接。这意味着物理连接以及可寻址性(两个IP位于同一个LAN上,或者两个主机之间存在可靠的"gateway"
如果您不熟悉,我强烈建议您查看Beej's Guide to Network Programming。它是对TCP / IP和套接字编程的简短而精彩的介绍。满意保证!
答案 3 :(得分:0)
客户端在connect()
方法中使用的IP地址和端口是服务器。不是客户的。客户端将连接到服务器,位于该IP:端口。
客户端自己的IP地址和端口是自动分配的,除非出于某种原因您在bind()
之前致电connect().