プッシュ通知付きのサーバー/クライアントを作成しようとしています。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");
私はバインドのエラーを取得:要求されたアドレスを割り当てることができません。 最初の接続後にClientをコーディングする方法がわかりません。それを聞いて、接続を受け入れますが、私がクライアントのコードで行う場合
cli_addr.sin_family = AF_INET;
cli_addr.sin_addr.s_addr = INADDR_ANY;
cli_addr.sin_port = htons(port_client);
IPアドレスは最初の接続と同じですか?
誰かが別の解決策以上を持っている場合は、それを共有してください。
は、なぜあなたは 'まったく)('バインドを使用しているあなたは、 '')(接続したい場合は? – EOF
sockfdをクライアントのIPアドレスとポートに関連付ける。 私はCのソケットについて学んでいますので、間違っているかもしれません。正しいこと – Danick
'connect()'はすでに接続するリモートアドレスを指定する 'const struct sockaddr *' -argumentをとります。 – EOF