TCP Unix send()非常慢C

时间:2011-04-12 21:31:49

标签: c sockets tcp

编辑:原来我的嵌入式以太网适配器出了问题。现在运作良好。谢谢大家。

当我通过tcp套接字发送文件时,需要很长时间(1.5M字节约4秒)才能完成传输。同一文件几乎立即在tftp上传播。我知道tftp使用UDP,它应该更快,但我仍然认为我的传输方式太慢了。我通过交叉电缆连接100Mbps半双工。发件人是UNIX,接收者是Windows TcpClient上的.Net。

那么,每个人都在想什么?我需要更好的C代码吗?网络可能有问题吗?

这是我的C代码:

int main(void)
{
    //some initializing stuff
    int AcceptSocket, ClientRecvSocket;

    alen = sizeof(fsin);
    int AcceptSocket = passiveTCP("20075", 10);
    //Wait for client connections, and spawn a new thread to communicate with each one
    pszRecvBuf = malloc((size_t) BUFSIZE);
    while (1)
    {
        ClientRecvSocket = accept(AcceptSocket, &fsin, &alen);
        printf("\nDebug: Accepted Connection\n");
        if (ClientRecvSocket < 0)
        {
            sprintf(szStr, "Error accepting client connection : %d",
                    ClientRecvSocket);
            perror(szStr);
        }
        else
        {
            printf("\nDebug: Starting Thread\n");
            ThreadStatus = pthread_create(&ClientThread, NULL, ClientRecv,
                    (void *) &ClientRecvSocket);
            pthread_join(ClientThread, NULL);
        }
    }
}

void *ClientRecv(void *ClientSocket)
{
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
    int Socket = *(int *) ClientSocket;

    unsigned char *file_buffer;
    file_buffer = malloc(1572864 * sizeof(unsigned char));

    //set file data to something

    SendLen = send(Socket, file_buffer, 1572864 * sizeof(unsigned char), 0);
    shutdown(Socket, SHUT_RDWR);
    free(file_buffer);
}
int passiveTCP(char *service, int qlen)
{
     return passivesock(service, "tcp", qlen);
}

2 个答案:

答案 0 :(得分:1)

在您的函数ClientRecv中,一眼就看着它,你消耗了太多的资源......

unsigned char *file_buffer;
file_buffer = malloc(1572864 * sizeof(unsigned char));

你正在为此分配内存,但它去了哪里....应该尝试释放指向该缓冲区的指针....

作为服务和帮助他人的兴趣,是你正在使用的某种包装框架,请指明什么样的......因为我强烈怀疑它是你正在使用的非标准软件 - 也许该软件有某些“问题”?

答案 1 :(得分:0)

尝试连接全双工。

由于TCP要求(大致)确认每个传输的数据包,因此半双工链路必须停止传输以处理这些ACK的接收。这可能表现为冲突,导致数据包丢失并最终触发TCP的拥塞控制。