我正在查看一些通过数据报套接字发送和接收消息的简单示例。
服务器端代码。
sock = socket(AF_INET, SOCK_DGRAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5000);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr_len = sizeof(struct sockaddr);
if (bind(sock, (struct sockaddr*)&server_addr, addr_len) < 0)
exit(1);
printf("Receiving data ... \n");
bytes_read = recvfrom(sock, recv_data, 1024, 0, (struct sockaddr*)&client_addr, &addr_len);
printf("Server received: %s\n", recv_data);
printf("Sending data ... \n");
sendto(sock, send_data, strlen(send_data) + 1, 0, (struct sockaddr*)&client_addr, addr_len);
客户端代码。
sock = socket(AF_INET, SOCK_DGRAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5000);
server_addr.sin_addr.s_addr = inet_addr(serverIP);
addr_len = sizeof(struct sockaddr);
printf("Sending data ... \n");
sendto(sock, send_data, strlen(send_data) + 1, 0, (struct sockaddr*)&server_addr, addr_len);
printf("Receiving data ... \n");
bytes_read = recvfrom(sock, recv_data, 1024, 0, (struct sockaddr*)&client_addr, &addr_len);
printf("client received: %s\n", recv_data);
服务器将侦听消息,然后发送响应。
客户端将发送消息,然后侦听响应。
在服务器端,我将socket绑定到INADDR_ANY和端口5000,而在客户端,我根本不绑定socket。
如果绑定没有在服务器端完成,服务器套接字将不会收到任何消息。
而在另一边即使套接字绑定根本没有完成,客户端套接字也会接收到服务器发送的消息。
为什么我必须绑定服务器套接字,而不是客户端套接字?
1条答案
按热度按时间62lalag41#
客户端套接字
send
第一次出现时,操作系统会自动将套接字绑定到一个随机端口。服务器接收客户端的端口,作为发送方的端口,服务器的响应将发送到客户端套接字绑定的端口。在服务器端,你需要先将套接字显式绑定到一个特定的已知端口,将服务器套接字绑定到某个随机端口对于让客户端知道在哪里可以找到服务器没有多大帮助。