我正在使用Ubuntu 12.04 32位版本。我编写了一个程序,从TCP客户端接收XML文件。同样的程序也通过Unix域套接字从另一个进程接收数据。为此,我使用了poll()系统调用。
我的问题是,有时我无法正确地获取XML数据,或者有时它会丢失。但由于我正在使用TCP,如果有数据丢失,客户端将知道。但客户端没有显示任何错误。请问这是为什么?
我可以提供一些代码:
我的问题是,有时我无法正确地获取XML数据,或者有时它会丢失。但由于我正在使用TCP,如果有数据丢失,客户端将知道。但客户端没有显示任何错误。请问这是为什么?
我可以提供一些代码:
// 配置服务器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() 失败."); } else { 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() 失败."); } else { if (listen (sockfd, 8) == -1) { perror("listen() 失败."); } } } return sockfd; }
// 发送TCP消息到服务器 int send_to_tcp_server(unsigned char * message, int size, char * server_ip, int port) { int sockfd; struct sockaddr_in their_addr; int numbytes = -1; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket() 失败."); } else { 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() 失败."); } else { if ((numbytes=send(sockfd , message, size, 0)) == -1) { printf ("发送失败.\n"); } } close (sockfd); } return numbytes; }
// TCP处理函数,在循环中被调用 void process_tcp (int sock) { struct sockaddr_in their_addr; // 对方的地址信息 int received; 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() 失败."); } else { do { received = recv(clientfd, buffer, BUFF_SIZE, 0); // 接收数据 if (received == -1) { perror("recv() 失败."); break; } else { //做些什么 } } while (received != 0); close (clientfd); // 关闭客户端连接 } }
process_tcp 函数在循环中被调用。
//do something
替换了组装代码,而处理消息的代码必须放在while
循环结束后(因为关闭连接是表示应用程序级别消息结束的方式)。代码中最关键的两个部分都缺失了。 - David Schwartzif ((numbytes=send(sockfd , message, size, 0)) == -1) { printf ("发送失败。\n"); } close (sockfd);
- David Schwartz