-1
我正在嘗試使服務器/客戶端與推送通知。C服務器連接到客戶端
首先客戶端連接服務器,然後服務器保存客戶端的IP地址和端口。在某些時候,服務器需要連接客戶端發送通知。
這是服務器後接受第一個連接的是如何保存客戶端的IP地址和端口:
char client_ip[INET_ADDRSTRLEN];
int port_c;
// Socket, ..., bind, listen, accept
// Gets Client IP address
struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&cli_addr;
struct in_addr ipAddr = pV4Addr->sin_addr;
inet_ntop(AF_INET, &ipAddr, client_ip, INET_ADDRSTRLEN);
printf("Client ip: %s\n", client_ip);
// Gets Client Port Number
port_c = (int) ntohs(cli_addr.sin_port);
printf("Client port is: %d\n", (int) ntohs(cli_addr.sin_port));
// [ ... ]
// Time to send notification to client
bzero((char *) &cli_addr, sizeof(cli_addr));
// Setting IP address and port
cli_addr.sin_family = AF_INET;
bcopy(client_ip, (char *)&cli_addr.sin_addr.s_addr, strlen(client_ip));
cli_addr.sin_port = htons(port_c);
// Create socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// Bind socket to the local address
if(bind(sockfd, (struct sockaddr *) &cli_addr, sizeof(cli_addr)) < 0)
error("Error bind");
if (connect(sockfd, (struct sockaddr *)&cli_addr, sizeof(cli_addr)) < 0)
error("ERROR connecting");
我獲得綁定錯誤:無法分配請求的地址。 我不確定如何在第一次連接後編寫客戶端。這將是傾聽和接受連接,但如果我在客戶端的代碼
cli_addr.sin_family = AF_INET;
cli_addr.sin_addr.s_addr = INADDR_ANY;
cli_addr.sin_port = htons(port_client);
將IP地址是否與第一個連接相同?
如果有人有另一種解決方案或者更好的,請分享。
爲什麼你使用'bind()的'如果你想在所有連接'()'? – EOF
將sockfd與客戶端的IP地址和端口相關聯。 我學習在C插口,所以也許我錯了,糾正我 – Danick
'連接()'已經採取了'常量結構sockaddr *'-argument指定與連接遠程地址。 – EOF