2011-04-12 67 views
0

编辑:原来是我的嵌入式以太网适配器的问题。现在运作良好。感谢大家。TCP Unix send()很慢C

当我通过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

'passiveTCP','AcceptSocket'等都是非标准的。我们甚至无法开始解决这个问题。 – 2011-04-12 21:45:11

+0

AcceptSocket是一个int。我没有意识到被动TCP不是标准的。 – dunecat 2011-04-12 21:56:11

+1

在查看你的代码之前,你应该使用'netcat',甚至'ftp'来确保你的网络连接没有问题。半双工连接可能很难* – thkala 2011-04-12 22:03:46

回答

1

一目了然,看着它,你的函数ClientRecv内,你消耗太多的资源......

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

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

作为服务和帮助他人的利益的事情,是一种包装你正在使用的框架,并请指定什么样的....因为我强烈怀疑它是一个非标准的软件,你正在使用 - 也许该软件有一定的“问题”?

+0

我确实释放了内存,这是我的代码的简化版本。 我没有使用我知道的任何一种包装。 – dunecat 2011-04-12 21:54:03

+1

小心显示这些包装的内部结构,比如什么是'PassiveTCP',什么是AcceptSocket/ClientRecvSocket ......它们听起来有些复杂......并且不是标准的...... – t0mm13b 2011-04-12 21:58:02

+0

另外,在这种情况下,如果你说你确实释放了记忆,请修改你的问题来指出,以免误导别人浪费时间回答类似的问题......“我没有在那里看到自由......”等 – t0mm13b 2011-04-12 22:00:52

0

尝试连接全双工。由于TCP需要对每个传输数据包(大致)进行确认,因此您的半双工链路将不得不停止传输以处理接收到的这些ACK。这可能表现为冲突,导致数据包丢失并最终触发TCP的拥塞控制。

+0

我正在使用的uClinix与我的全双工需求不配合。 – dunecat 2011-04-12 21:59:05

+0

德国“全双工以太网”WP条目指出,如果连接的一端使用自动协商,而另一端使用全双工,则自动协商端将只检测半双工,导致大量碰撞。 – Philip 2011-04-12 22:20:12

+0

@DuneCat:在你的问题中应该说明uClinix,使它更清晰,并吸引对你的问题有了解uClinix知识的人...... – t0mm13b 2011-04-12 22:20:53