Ubuntu 12.0432ビット版を使用しています。TCPクライアントからXMLファイルを受信するプログラムを作成しました。同じプログラムが、UNIXドメインソケットによって別のプロセスからデータを受信しています。そのために、poll()システムコールを使用しています。
私の問題は、XMLデータが正しく取得されない場合や、XMLデータが欠落している場合があります。しかし、私はTCPを使用しているので、データ損失があるかどうかをクライアントが認識します。しかし、クライアントはエラーを表示していません。なぜこれが起こっているのか誰か教えてもらえますか?
私はいくつかのコードを提供することができます:
int config_server_tcp(int port) {{ int sockfd = -1; struct sockaddr_in my_addr; //私の住所情報 if((sockfd = socket(AF_INET、SOCK_STREAM、0))== -1) {{ perror( "socket()failed。"); } そうしないと {{ my_addr.sin_family = AF_INET; my_addr.sin_port = htons(port); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); //自動的に私のIPを入力します memset(&(my_addr.sin_zero)、0、8); //残りの構造体をゼロにします if(bind(sockfd、(struct sockaddr *)&my_addr、sizeof(struct sockaddr))== -1) {{ perror( "bind()が失敗しました。"); } そうしないと {{ if(listen(sockfd、8)== -1) {{ perror( "listen()が失敗しました。"); } } } sockfdを返します。 } int send_to_tcp_server(unsigned char *メッセージ、intサイズ、char * server_ip、intポート) {{ int sockfd; struct sockaddr_in their_addr; int numbytes = -1; if((sockfd = socket(AF_INET、SOCK_STREAM、0))== -1) {{ perror( "socket()failed。"); } そうしないと {{ their_addr.sin_family = AF_INET; their_addr.sin_port = htons(port); their_addr.sin_addr.s_addr = inet_addr(server_ip); memset(&(their_addr.sin_zero)、'\ 0'、8); //残りの構造体をゼロにします if(connect(sockfd、(struct sockaddr *)&their_addr、sizeof(their_addr))== -1) {{ perror( "connect()が失敗しました。"); } そうしないと {{ if((numbytes = send(sockfd、message、size、0))== -1) {{ printf("送信に失敗しました。\n"); } } close(sockfd); } numbytesを返します。 } void process_tcp(int sock) {{ struct sockaddr_in their_addr; //話者の住所情報 受け取ったint; socklen_t addr_len; char buffer [BUFF_SIZE]; addr_len = sizeof(their_addr); int clientfd = accept(sock、(struct sockaddr *)&their_addr、&addr_len); if(clientfd == -1) {{ perror( "accept()が失敗しました。"); } そうしないと {{ 行う {{ 受信=recv(clientfd、buffer、BUFF_SIZE、0); if(受信== -1) {{ perror( "recv()が失敗しました。"); 壊す; } そうしないと {{ //何かをする } } while(受信!= 0); close(clientfd); } }
プロセスTCP関数がループで呼び出されます