我正在使用 Ubuntu 12.04 32 位版本我编写了一个程序来从 TCP 客户端接收 XML 文件。同一个程序也通过 unix 域套接字从另一个进程接收数据。为此,我正在使用 poll() 系统调用。
我的问题是,有时我没有正确获取 XML 数据,或者有时它也丢失了。但是由于我使用的是 TCP,如果有数据丢失客户端会知道。但客户端没有显示任何错误。有人可以告诉我为什么会这样吗?
我可以提供一些代码:
int config_server_tcp(int 端口) { int sockfd = -1; 结构 sockaddr_in my_addr; // 我的地址信息 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket() 失败。"); } 别的 { 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("绑定() 失败。"); } 别的 { if (听 (sockfd, 8) == -1) { perror("listen() 失败。"); } } } 返回 sockfd; } int send_to_tcp_server(unsigned char * message, int size, char * server_ip, int port) { int sockfd; 结构 sockaddr_in their_addr; 整数字节 = -1; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket() 失败。"); } 别的 { 他们的地址.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"); } } 关闭(sockfd); } 返回字节数; } void process_tcp (int sock) { 结构 sockaddr_in their_addr; // 说话者的地址信息 int 收到; socklen_t addr_len; 字符缓冲区[BUFF_SIZE]; addr_len = sizeof (their_addr); int clientfd = 接受 (sock, (struct sockaddr *)&their_addr, &addr_len); 如果 (clientfd == -1) { perror("accept() 失败。"); } 别的 { 做 { 收到 = recv(clientfd, 缓冲区, BUFF_SIZE, 0); 如果(收到 == -1) { perror("recv() 失败。"); 休息; } 别的 { //做一点事 } } 而(收到!= 0); 关闭(clientfd); } }
循环调用进程TCP函数