未使用C从TCP套接字正确接收数据
我正在使用Ubuntu 12.04 32位版本我编写了一个程序来从TCP客户端接收XML文件。 同一个程序也是通过unix域套接字从另一个进程接收数据。 为此,我正在使用poll()系统调用。
我的问题是,有些时候我没有正确地获取XML数据,或者有些时候它缺少了。 但是由于我使用的是TCP,如果有客户端会知道数据丢失。 但客户端不显示任何错误。 任何人都可以告诉我为什么会发生这种情况?
我可以提供一些代码:
int config_server_tcp(int port) { int sockfd = -1; struct sockaddr_in my_addr; // my address information if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket() failed."); } else { my_addr.sin_family = AF_INET; my_addr.sin_port = htons(port); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // automatically fill with my IP memset(&(my_addr.sin_zero), 0, 8); // zero the rest of the struct if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind() failed."); } else { if (listen (sockfd, 8) == -1) { perror("listen() failed."); } } } return sockfd; } 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() failed."); } 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), ' ', 8); // zero the rest of the struct if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof (their_addr)) == -1) { perror("connect() failed."); } else { if ((numbytes=send(sockfd , message, size, 0)) == -1) { printf ("Sending failed.n"); } } close (sockfd); } return numbytes; } void process_tcp (int sock) { struct sockaddr_in their_addr; // talker's address information 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() failed."); } else { do { received = recv(clientfd, buffer, BUFF_SIZE, 0); if (received == -1) { perror("recv() failed."); break; } else { //do something } } while (received != 0); close (clientfd); } }
进程TCP功能在循环中被调用
这个错误几乎肯定存在于你未显示的代码中,这些代码根据XML-over-TCP协议来组装应用程序级消息。 以下是一种方法:
void process_tcp (int sock)
{
struct sockaddr_in their_addr;
int received, total_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() failed.");
}
else
{
total_received = 0;
do
{
received = recv(clientfd, buffer + total_received,
BUFF_SIZE - total_received, 0);
if (received == -1)
{
perror("recv() failed.");
break;
}
if (received > 0)
total_received += received;
}
while (received != 0);
buffer[total_received] = 0;
// here we can do something with 'buffer'
close (clientfd);
}
}
请注意,缺少很多错误检查。
链接地址: http://www.djcxy.com/p/61343.html