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関数がループで呼び出されます