2016-04-19 23 views
-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"); 

私はバインドのエラーを取得:要求されたアドレスを割り当てることができません。 最初の接続後にClientをコーディングする方法がわかりません。それを聞いて、接続を受け入れますが、私がクライアントのコードで行う場合

cli_addr.sin_family = AF_INET; 
cli_addr.sin_addr.s_addr = INADDR_ANY; 
cli_addr.sin_port = htons(port_client); 

IPアドレスは最初の接続と同じですか?

誰かが別の解決策以上を持っている場合は、それを共有してください。

+0

は、なぜあなたは 'まったく)('バインドを使用しているあなたは、 '')(接続したい場合は? – EOF

+0

sockfdをクライアントのIPアドレスとポートに関連付ける。 私はCのソケットについて学んでいますので、間違っているかもしれません。正しいこと – Danick

+0

'connect()'はすでに接続するリモートアドレスを指定する 'const struct sockaddr *' -argumentをとります。 – EOF

答えて

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 
関連する問題