Obtention d’un problème d’argument invalide lors d’une connexion interrompue

la programmation


Salut,
J’essaie d’être pertinent avec la programmation de socket, mais mon truc est une connexion de longue durée qui est une connexion déciée. mais toutes les 1 minutes de connexion, réinitialisez la connexion en raison d’un échec de réception avec le numéro d’erreur : 22, message d’erreur : argument non valide. j’ai essayé une analyse maximale mais je n’arrive pas à découvrir mon erreur. s’il vous plaît, aidez-moi pour la suite du processus.

Le code ci-dessous n’est qu’un exemple, mais j’utilise la même fonction importante de programmation de socket dans mon projet.

#include<iostream>
using namesapce std;
int g_SocFd  = -1;
bool Connect(char *p_IpAddress, int p_Port)
{
   if (0 > (g_SocFd = socket(AF_INET, SOCK_STREAM, 0)))
   {
      g_Logger.log(LOG_LEVEL_NORMAL, "%s <Line:%d> Failed to Create client Socket. [ErrNo:%d,ErrMsg:%s]",
            __FUNCTION__, __LINE__, errno, strerror(errno));
      g_SocFd = -1;
      return false;
   }
   g_Logger.log(LOG_LEVEL_DEBUG, "%s <Line:%d> IP_ADDRESS:%s PORT_NUMBER: %d", __FUNCTION__, __LINE__, p_IpAddress, p_Port);

   struct sockaddr_in serv_addr;
   memset(&serv_addr, 0, sizeof(serv_addr));
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_addr.s_addr = inet_addr(p_IpAddress);
   serv_addr.sin_port = htons(p_Port);

   if (0 > connect(g_SocFd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)))
   {
      g_Logger.log(LOG_LEVEL_CRITICAL, "%s <Line:%d> Failed to Connect [SockFd:%d,ErrNo:%d,ErrMsg:%s]",
            __FUNCTION__, __LINE__, g_SocFd, errno, strerror(errno));
      close(g_SocFd);
      g_SocFd = -1;
      return false;
   }
   g_ConnectionFlag = true;
   return true;
}

int RecvAll(int &s, TEXT *buf, UINT32 len)
{
   unsigned long total = 0;
   int bytesleft = len;
   int n;
   int l_Count = 0;
   while(total < len)
   {
      if(0>s)
         return -1;

      n = recv(s, buf+total, bytesleft,0);
      int l_errno = errno;
      if (n <= 0)
      {
         if(EINTR == errno)
         {

            if((++l_Count) == 5)
            {
               
               close(s);
               return 0;
            }
            if(true == g_CloseConnection)
            {
               cout<<"failing recv for Graceful exit.\n";
				return 0;
            }
            continue;
         }
    
         close(s);
         return n;
      }
      total += n;
      bytesleft -= n;
	  }
   len = total; // return number actually sent here
   return len;
}


bool ReadMessage()
{
while(1)	{
	fd_set l_FdSet;
   int l_MaxFd = -1;
   struct timeval tv;

   FD_ZERO(&l_FdSet);
   
   if((true == g_ConnectionFlag))
   {
      FD_SET(g_SocFd, &l_FdSet);
      if(g_SocFd > l_MaxFd)
         l_MaxFd = g_SocFd;
   }

   if(-1 == l_MaxFd)
      return false;

   tv.tv_sec  = 5;
   tv.tv_usec = 0;
   if (-1 == select(l_MaxFd+1, &l_FdSet, 0, 0, &tv))
   {
      g_Logger.log(LOG_LEVEL_CRITICAL, "%s <Ln:%d> Error in select [ErrMsg:%s]", __FUNCTION__, __LINE__, strerror(errno));
      return false;
   }

	if(true == g-ConnectionFlag)
      {
         if(FD_ISSET(g_SocFd, &l_FdSet))
         {
            
            int num_charread;
            char l_LenStr[10];
            memset(l_LenStr, '\0', sizeof(l_LenStr));

            num_charread = RecvAll(g_SocFd, l_LenStr, 9);
			
            if (num_charread < 0)
            {
               close(g_SocFd);
               g_ConnectionFlag = false;
               return false;
            }
            else if (0 == num_charread)
            {
               close(g_SocFd);
               g_ConnectionFlag = false;
               return false;
            }
			else
			{
				cout<<"String : "<<l_LenStr<<endl;
			}

		}
		}		
}}

string g_ReqXml = "";
void SendMessage()
{
	while(1)
	{
	
	if(g_ReqXml.length() > 0)
	{
	
	if((g_ConnectionFlag == true) && (g_SocFd > 2))
                     {
                        if (-1 == send(g_SocFd, g_ReqXml.c_str(), g_ReqXml.length(), 0))
                        {
                           
                           g_Logger.log(LOG_LEVEL_WARNING, "%s <Ln:%d> Again pushed in Queue, due to sending failed.", __FUNCTION__, __LINE__);
                           usleep(2000000);
                           return false;
                        }
						}
}}}

int main()
{
	Connect("123.123.123.123", 8970);
	thread_t t1(SendMessage);
	thread_t t2(ReadMessage);
	sleep(2);
	g_ReqXml = "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
	
	sleep(2);
	g_ReqXml = "FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
	
	sleep(2);
	g_ReqXml = "EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
	
	sleep(2);
	g_ReqXml = "DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
	
	sleep(2);
	g_ReqXml = "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
	
	sleep(2);
	g_ReqXml = "BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
	sleep(2);
	getchar();
	}

Ce que j’ai essayé :

j’ai essayé mais je reçois seulement un argument invalide comme code d’erreur : 22 du réseau.

Solution 1

Dans un premier temps : enregistrez tous vos appels close(). Je suppose qu’il y en a un que vous ne voulez pas voir exécuté.

Mais en langage courant : vous devez le déboguer.
Parce que vous avez écrit qu’il s’agissait d’un problème de timing, vous devez ajouter des horodatages dans votre journal de débogage.
La déconnexion peut également être déclenchée par le serveur avec lequel vous communiquez. Vérifiez si une minuterie de déconnexion ou d’inactivité n’est pas activée.

コメント

タイトルとURLをコピーしました