我尝试使用推送通知制作服务器/客户端。
首先,客户端与Server连接,然后Server保存客户端的IP地址和端口。在某些时候服务器需要与客户端连接以发送通知。
这是服务器在接受第一个连接后保存客户端IP地址和端口的方式:
cli_addr.sin_family = AF_INET;
cli_addr.sin_addr.s_addr = INADDR_ANY;
cli_addr.sin_port = htons(port_client);
我收到绑定错误:无法分配请求的地址。 我不确定如何在第一次连接后编写客户端代码。它会听取并接受连接,但如果我使用客户端代码
transform
IP地址是否与第一个连接相同?
如果某人有其他解决方案或更好的解决方案,请分享。
答案 0 :(得分:0)
您正在尝试将服务器套接字绑定到客户端IP。那不行。您只能将套接字绑定到本地地址。您必须使用bind来进行连接,而不是传出连接。
如果您希望服务器响应来自客户端的请求,只需使用accept()
返回的套接字,然后使用此套接字send()
。
您的服务器代码应如下所示:
SOCKET sock_server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in sock_local_addr;
memset(&sock_local_addr, 0, sizeof(sock_local_addr));
sock_local_addr.sin_family = AF_INET;
sock_local_addr.sin_port = htons(SERVER_PORT);
sock_local_addr.sin_addr.s_addr = INADDR_ANY;
bind(sock_server, (const struct sockaddr *)&sock_local_addr, sizeof(sock_local_addr)); // bind server socket to any network interface of the server
listen(sock_server, 10);
struct sockaddr_in client_addr;
SOCKLEN_T client_addr_size = sizeof(client_addr);
SOCKET sock_client = accept(sock_server, (struct sockaddr *)&client_addr, &client_addr_size); // accept incomming connection; this will block until a client connects
recv_size = recv(sock_client, buf_in, sizeof(buf_in), 0); // receive data from client
send(sock_client, buf_out, sizeof(buf_out), 0); // send data back to client (buf_out is buffer containing the data to be sent)
shutdown(sock_client, SHUT_RDWR); // shutdown connection with client