Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP Unix send()非常慢_C_Sockets_Tcp - Fatal编程技术网

TCP Unix send()非常慢

TCP Unix send()非常慢,c,sockets,tcp,C,Sockets,Tcp,编辑:原来是我的嵌入式以太网适配器有问题。现在效果很好。谢谢大家 当我通过tcp套接字发送文件时,需要很长时间(1.5M字节约4秒)才能完成传输。同一个文件几乎立即在tftp上传输。我知道tftp使用UDP,这应该更快,但我仍然认为我的传输速度太慢了。我通过交叉电缆连接100Mbps半双工。发送方是UNIX,接收方是Windows TcpClient上的.Net 那么,大家怎么想?我需要一些更好的C代码吗?网络可能有问题吗 这是我的C代码: int main(void) { //some

编辑:原来是我的嵌入式以太网适配器有问题。现在效果很好。谢谢大家

当我通过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);
}
int main(无效)
{
//一些初始化的东西
int-AcceptSocket、ClientRecvSocket;
alen=sizeof(fsin);
int AcceptSocket=passiveetcp(“20075”,10);
//等待客户端连接,并生成一个新线程来与每个线程通信
pszRecvBuf=malloc((尺寸)BUFSIZE);
而(1)
{
ClientRecvSocket=accept(AcceptSocket,&fsin,&alen);
printf(“\nDebug:Accepted Connection\n”);
if(ClientRecvSocket<0)
{
sprintf(szStr,“接受客户端连接时出错:%d”,
ClientRecv插座);
佩罗(szStr);
}
其他的
{
printf(“\nDebug:开始线程\n”);
ThreadStatus=pthread\u创建(&ClientThread,NULL,ClientRecv,
(void*)和ClientRecvSocket);
pthread_join(ClientThread,NULL);
}
}
}
void*ClientRecv(void*ClientSocket)
{
pthread_setcanceltype(pthread_CANCEL_异步,NULL);
int Socket=*(int*)ClientSocket;
未签名字符*文件\u缓冲区;
file_buffer=malloc(1572864*sizeof(unsigned char));
//将文件数据设置为
SendLen=send(套接字,文件缓冲区,1572864*sizeof(无符号字符),0);
关闭(插座,关闭\RDWR);
空闲(文件缓冲区);
}
int-passiveTCP(字符*服务,int-qlen)
{
返回被动时钟(服务,“tcp”,qlen);
}

乍一看,在你的函数
clientrecov
中,你消耗了太多的资源

unsigned char *file_buffer;
file_buffer = malloc(1572864 * sizeof(unsigned char));
您正在为此分配内存,但它去了哪里。。。。应该尝试释放指向该缓冲区的指针


出于服务和帮助他人的兴趣,您使用的是某种包装器框架吗?请指定是哪种类型的。。。。由于我强烈怀疑您正在使用的是非标准软件-可能该软件存在某些“问题”?

请尝试连接全双工


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

passiveTCP
AcceptSocket
等都是非标准的。我们甚至不能开始解决这个问题。AcceptSocket是一个int。我没有意识到passiveTCP不是标准的。在查看代码之前,您可能应该使用类似于
netcat
,甚至
ftp
的方法来确保您的网络连接没有故障。半双工连接可能很困难……请注意,
sizeof(unsigned char)
保证为1,因此您不需要与它相乘。@Philip,我知道,但我喜欢保持这种习惯。我确实释放了内存,这是我代码的简化版本。我没有使用我所知道的任何类型的包装器。请展示一下这些包装器的内部结构,比如什么是
passiveetcp
,什么是AcceptSocket/ClientRecvSocket。。。它们听起来有点复杂。。。而且不是标准的……同样,如果你说你确实释放了内存,请修改你的问题,指出这样做是为了不误导他人浪费时间回答类似的问题。。。“我在那里看不到自由……”etcI做了这些更改,并添加了被动ETCP()的定义。谢谢你的意见,我尽力把它说清楚了,但现在好多了。@DuneCat:你现在掌握了窍门\0/哦,欢迎来到SO!:我使用的DuClinix不符合我对全双工的要求。德国“全双工以太网”的WP条目指出,如果连接的一端使用自动协商,而另一端强制全双工,则自动协商端将只检测半双工,导致大量冲突。@DuneCat:应该在你的问题中说明uClinix,使问题更清楚,并吸引了解uClinix的人来回答你的问题。@Philip,是的,没错。必须将两端都设置为“自动”,或将两端都设置为“固定100满”。