Моя программа на C ++, которая является клиентом, соединяется с сервером Java. С момента установления соединения клиент C ++ отправляет блок данных размером ~ 1 МБ до 3 МБ с фиксированной частотой (скажем, 10 секунд).
Мой Java-сервер открывает сокет
Socket client = new ServerSocket(14001, 10).accept();//blocking
ReceiveThread st = new ReceiveThread(client);
и он получает данные от клиента, как показано ниже.
private String getDataFromSocket(BufferedReader reader) throws IOException
{
int byteLimit = 1024*1024*2; //2 MB
String output = "";
char[] charArray = null;
int availableSize = is.available();
if(availableSize < 1) // If available size is 0 just return empty
{
return output;
}
while(availableSize > byteLimit) // Reads 2MB max if available size is more than 2 MB
{
charArray = new char[byteLimit];
reader.read(charArray,0,charArray.length);
output += new String(charArray);
availableSize = is.available();
}
charArray = new char[availableSize];
reader.read(charArray,0,charArray.length);
output = output +new String(charArray);
return output;
}
Вышеупомянутый GetDataFromSocket продолжает проверять доступные данные, пока сокет не будет аккуратно закрыт.
C ++ соединяется с сервером Java
void CreateSocket()
{
int err, nRet = 0;
sockfd = 0;
WORD wVersionRequested;
WSADATA wsaData;//WSACleanup();// Is this needed?
wVersionRequested = MAKEWORD(1, 1);
while (1)
{
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
Sleep(50);
continue;
}
else
{
break;
}
}
while (1)
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1 || sockfd == INVALID_SOCKET)
{
Sleep(50);
continue;
}
else
{
nRet = 1;
break;
}
}
}
void ConnectWithServer()
{
int nRet = 0;
char myname[256] = { 0 };
int wsaErr = 0, portNum = 0, retryCount=0;
struct hostent *h = NULL;
struct sockaddr_in server_addr;
gethostname(myname, 256);
portNum = 1401;
while (1)
{
if ((h = gethostbyname(myname)) != NULL)
{
memset(&server_addr, 0, sizeof(struct sockaddr_in));
memcpy((char *)&server_addr.sin_addr, h->h_addr, h->h_length);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portNum);
server_addr.sin_addr = *((struct in_addr*) h->h_addr);
}
if (0 == connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)))
{
nRet = 1;
break;
}
else
{
}
Sleep(50);
}
}
Установление соединения с сервером осуществляется двумя вышеуказанными функциями, и оно возвращает успех. После этих шагов я отправляю буфер данных на сервер Java один раз каждые 10 секунд.
while(index<retryCount)
{
string toSend = wstring_to_utf8(sRequestData);
nRet = send(sockfd, toSend.c_str(), toSend.length(), 0);
if (nRet == SOCKET_ERROR)
{
wsaErr = WSAGetLastError();
Sleep(DEFAULT);
index++;
}
else if(nRet == toSend.length())
{
break;
}
else
{
index = 0;
}
}
Проблема здесь в том, что после нескольких часов отправки и получения с C ++ на Java-сервер отправка зависает на бесконечное время. Выполнение никогда не выходит из функции send (). Но после зависания, если я внезапно закрываю Java-сервер, отправка возвращает ошибку сокета и снова работает хорошо в течение нескольких часов, и зависание все еще происходит.
Как я уже упоминал, я продолжаю отправлять данные на сервер размером от 1 МБ до 3 МБ десять секунд один раз. В чем может быть проблема здесь? Как я могу разобраться в этом?
Задача ещё не решена.
Других решений пока нет …