Originally Posted by
Salem
Use messages and a state machine then.
At the end of say disconnected, you set a state "DISCONNECTED" and you send a message to yourself to "CONNECT".
You can go round this all day and not eat stack space.
Am I getting warmer?
Code:
enum {
STATE_IDLE,
STATE_CONNECTING,
STATE_CONNECTED,
STATE_DISCONNECTING,
};
constructor:
m_state = STATE_IDLE;
connect:
m_state = STATE_CONNECTING
disconnect:
m_state = STATE_DISCONNECTING
int handle_socket:
// Returns 0 on idle (disconnected and waiting)
switch(m_state) {
case STATE_IDLE:
break;
case STATE_CONNECTING:
if (m_socket)
close(m_socket)
// Make m_socket
// Set non blocking
// connect socket
switch (errorno) {
case EALREADY:
// clock_gettime() check for timeout
if (timeout) {
m_state = STATE_DISCONNECTING;
// OnTimeout()
}
break;
case EISCONN:
m_state = STATE_CONNECTED;
// OnConnect()
break;
default:
m_state = STATE_DISCONNECTING;
// OnError(data)
}
case STATE_CONNECTED:
ret = recv(m_socket);
if (ret == -1) {
switch (errorno) {
case EAGAIN:
break;
case EWOULDBLOCK:
break;
case ECONNREFUSED:
m_state = STATE_DISCONNECTING;
// OnDisconnect()
break;
default:
m_state = STATE_DISCONNECTING;
// OnError(data)
}
} else if (ret == 0) {
m_state = STATE_DISCONNECTING;
// OnDisconnect()
} else {
// OnRecv(data)
}
case STATE_DISCONNECTING:
if (m_socket)
close(m_socket);
m_socket = 0;
m_state = STATE_IDLE;
}
return m_state;
socket.OnConnect() {
// dostuff
}
socket.OnDisconnect() {
// dostuff
socket.connect
}
socket.OnRecv(data) {
// showstuff
}
socket.OnError(data) {
// showstuff
socket.connect
}
socket.OnTimeout() {
// dostuff
socket.connect
}
Also, how will I be calling handle_socket without losing performance or using too much CPU time?