Edit: Il s'est avéré être un problème avec mon adaptateur Ethernet intégré. Fonctionne bien maintenant. Merci tout le monde.TCP Unix send() très lent C
Lorsque j'envoie un fichier via une socket tcp, le transfert prend beaucoup de temps (~ 4 secondes pour 1,5 m). Le même fichier se déplace presque instantanément sur tftp. Je sais que tftp utilise UDP, ce qui devrait être plus rapide, mais je pense toujours que mon transfert est trop lent. Je suis connecté 100Mbps en semi-duplex, à travers un câble croisé. L'expéditeur est UNIX et le destinataire est .Net sur Windows TcpClient.
Alors, qu'est-ce que tout le monde pense? Ai-je besoin d'un meilleur code C? Y at-il peut-être quelque chose qui ne va pas avec le réseau?
Voici mon code 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);
}
'passiveTCP',' AcceptSocket' etc sont tous non standard. Nous ne pouvons même pas commencer à aborder ce problème. –
AcceptSocket est un int. Je n'ai pas réalisé que passiveTCP n'est pas standard. – dunecat
Avant de regarder votre code, vous devriez probablement utiliser quelque chose comme 'netcat', ou même' ftp' pour vous assurer que votre connexion réseau n'est pas en cause. Les connexions semi-duplex peuvent être * difficiles * ... – thkala