कनेक्शन ख़राब होने पर अमान्य तर्क समस्या आ रही है


नमस्ते,
मैं सॉकेट प्रोग्रामिंग के साथ पुनः प्रयास कर रहा हूं लेकिन मेरी चीज लंबी अवधि का कनेक्शन है जो खराब कनेक्शन है। लेकिन प्रत्येक 1 मिनट के बाद recv विफलता के कारण कनेक्शन रीसेट होने पर त्रुटि संख्या: 22 त्रुटि संदेश: अमान्य तर्क होता है। मैंने अधिकतम विश्लेषण करने की कोशिश की लेकिन मैं अपनी गलती का पता नहीं लगा सका। कृपया आगे की प्रक्रिया के लिए मेरी मदद करें।

नीचे दिया गया कोड केवल एक नमूना है, लेकिन मैं अपने प्रोजेक्ट में उसी सॉकेट प्रोग्रामिंग महत्वपूर्ण फ़ंक्शन का उपयोग कर रहा हूं।

#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();
	}

मैंने क्या प्रयास किया है:

कोशिश की गई लेकिन नेटवर्क से केवल त्रुटि कोड के रूप में अमान्य तर्क मिल रहा है: 22।

समाधान 1

सबसे पहले: अपनी सभी क्लोज़() कॉल लॉग करें। मुझे लगता है कि कोई ऐसा है जिसे आप निष्पादित नहीं करना चाहते।

लेकिन आम बोलचाल: आपको इसे डीबग करने की आवश्यकता है।
चूँकि आपने लिखा है कि यह समय संबंधी कुछ समस्या है, इसलिए आपको अपने डिबग लॉग में टाइमस्टैम्प जोड़ने की आवश्यकता है।
आप जिस सर्वर से संचार कर रहे हैं उसके कारण भी डिस्कनेक्ट शुरू हो सकता है। जांचें कि क्या कोई डिस्कनेक्ट टाइमर या निष्क्रियता सक्रिय नहीं है।

コメント

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