Hello together,
this is my first thread here, but i think there will be some more
Ok, here's my problem:
I've written a simple client programm, which sends data to a server every 5 minutes or so.
Because of this small amount of data, i always reopen a socket. But this socket doesn't close propertly, the connection stays in state TIME_WAIT.
Every time i reopen a Socket, the programm also allocates about 8-12 kB of memory, and never frees it again.
I will post my network code here, and i hope some of you guys are able to help me.
Code:
#include "stdafx.h"
#include "NetworkHandler.h"
#define NETWORK_ERROR -1
#define NETWORK_OK 0
#define SD_SEND 1
#define SD_RECEIVE 1
/* Prototypes */
void ReportError(int errorCode, const char *whichFunc);
char buffer[256]; //Buffer for the message
char errorMsg[92]; //Buffer for the errorMessage
WORD sockVersion;
WSADATA wsaData;
LPHOSTENT hostEntry;
SOCKADDR_IN serverInfo;
SOCKET theSocket;
LINGER theLinger;
int nret;
int connState;
/*
* Main function, calls the other functions.
*/
int connectToServer(void) {
connState = 0;
connState = initConnection();
connState = sendMessage();
closeConnection();
return connState;
}
/*
* Initialize the connection, by setting the server name and port
* Open the connection
*/
int initConnection(){
sockVersion = MAKEWORD(1, 1);
WSAStartup(sockVersion, &wsaData);
hostEntry = gethostbyname("127.0.0.1");
if (!hostEntry) {
nret = WSAGetLastError();
ReportError(nret, "gethostbyname()");
WSACleanup();
return NETWORK_ERROR;
}
theSocket = socket(AF_INET,
SOCK_STREAM,
IPPROTO_TCP);
theLinger.l_onoff = 1;
theLinger.l_linger = 0;
setsockopt(theSocket, SOL_SOCKET, SO_LINGER, (char *) &theLinger, sizeof(LINGER));
if (theSocket == INVALID_SOCKET) {
nret = WSAGetLastError();
ReportError(nret, "socket()");
WSACleanup();
return NETWORK_ERROR;
}
serverInfo.sin_family = AF_INET;
serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);
serverInfo.sin_port = htons(13);
nret = connect(theSocket,
(LPSOCKADDR)&serverInfo,
sizeof(struct sockaddr));
if (nret == SOCKET_ERROR) {
nret = WSAGetLastError();
ReportError(nret, "connect()");
closesocket(theSocket);
WSACleanup();
return NETWORK_ERROR;
}
return 0;
}
/*
* Send data method
*/
int sendMessage(){
ZeroMemory(buffer, 256);
wsprintf(buffer, "Some message");
nret = send(theSocket,
buffer,
strlen(buffer),
0);
if (nret == SOCKET_ERROR) {
closeConnection();
return NETWORK_ERROR;
}
return 0;
}
/*
* Close Socket
*/
void closeConnection(){
int b;
char buf[256];
WSACancelBlockingCall();
shutdown(theSocket, SD_SEND);
while ((b = recv(theSocket, buf, 256, 0)) != 0)
if (b == SOCKET_ERROR)
break;
shutdown(theSocket, SD_RECEIVE);
closesocket(theSocket);
WSACleanup();
}
void ReportError(int errorCode, const char *whichFunc) {
ZeroMemory(errorMsg, 92);
sprintf(errorMsg, "Call to %s returned error %d!", (char *)whichFunc, errorCode);
MessageBox(NULL, errorMsg, "NetworkError", MB_OK);
}
I have this problem since a few days so i hope somebody has a solution for this. Thank you.