3

我正在使用 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函数

4

1 回答 1

5

几乎可以肯定,错误出现在您未显示的代码中,该代码根据您的 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);
    }
}

请注意,缺少许多错误检查。

于 2012-10-12T11:39:30.853 回答