C服务器连接到客户端

时间:2016-04-19 12:16:00

标签: c sockets server connection client

我尝试使用推送通知制作服务器/客户端。

首先,客户端与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地址是否与第一个连接相同?

如果某人有其他解决方案或更好的解决方案,请分享。

1 个答案:

答案 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