[ad_1]
Hai,
Saya mencoba yang relevan dengan pemrograman soket tetapi yang saya inginkan adalah koneksi berdurasi panjang yang merupakan koneksi yang rusak. tetapi setiap setelah 1 menit koneksi menyetel ulang koneksi karena kegagalan penerimaan dengan kesalahan no : 22 pesan kesalahan : argumen tidak valid. Saya mencoba analisis maksimal tetapi saya tidak dapat menemukan kesalahan saya. tolong bantu saya untuk proses selanjutnya.
Kode di bawah ini hanyalah contoh, tetapi saya menggunakan fungsi penting pemrograman soket yang sama dalam proyek saya.
#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(); }
Apa yang saya coba:
mencoba tetapi hanya mendapatkan argumen yang tidak valid sebagai kode kesalahan: 22 dari jaringan.
Solusi 1
Pada awalnya: Catat semua panggilan close() Anda. Saya kira ada satu yang Anda tidak ingin dieksekusi.
Namun secara umum: Anda perlu men-debugnya.
Karena Anda menulis bahwa ini adalah masalah waktu, Anda perlu menambahkan stempel waktu di log debug Anda.
Pemutusan sambungan mungkin juga dipicu oleh server yang Anda ajak berkomunikasi. Periksa apakah pengatur waktu pemutusan sambungan atau tidak ada aktivitas belum diaktifkan.
[ad_2]
コメント