diff options
author | rubidium <rubidium@openttd.org> | 2007-01-02 19:19:48 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-01-02 19:19:48 +0000 |
commit | 66bbf336c6af7353ef0aeed58002c46543b30635 (patch) | |
tree | ad4a63860df2626b22f77e7dac712e958bea54cb /network/core/tcp.c | |
parent | ccc0a3f4dbf58c005b22341ac8874252924690cd (diff) | |
download | openttd-66bbf336c6af7353ef0aeed58002c46543b30635.tar.xz |
(svn r7759) -Merge: makefile rewrite. This merge features:
- A proper ./configure, so everything needs to be configured only once, not for every make.
- Usage of makedepend when available. This greatly reduces the time needed for generating the dependencies.
- A generator for all project files. There is a single file with sources, which is used to generate Makefiles and the project files for MSVC.
- Proper support for OSX universal binaries.
- Object files for non-MSVC compiles are also placed in separate directories, making is faster to switch between debug and release compiles and it does not touch the directory with the source files.
- Functionality to make a bundle of all needed files for for example a nightly or distribution of a binary with all needed GRFs and language files.
Note: as this merge moves almost all files, it is recommended to make a backup of your working copy before updating your working copy.
Diffstat (limited to 'network/core/tcp.c')
-rw-r--r-- | network/core/tcp.c | 227 |
1 files changed, 0 insertions, 227 deletions
diff --git a/network/core/tcp.c b/network/core/tcp.c deleted file mode 100644 index 493a97dff..000000000 --- a/network/core/tcp.c +++ /dev/null @@ -1,227 +0,0 @@ -/* $Id$ */ - -#ifdef ENABLE_NETWORK - -#include "../../stdafx.h" -#include "../../debug.h" -#include "../../openttd.h" -#include "../../variables.h" -#include "../../table/strings.h" -#include "../../functions.h" - -#include "os_abstraction.h" -#include "config.h" -#include "packet.h" -#include "../network_data.h" -#include "tcp.h" - -/** - * @file tcp.c Basic functions to receive and send TCP packets. - */ - -/** - * Functions to help NetworkRecv_Packet/NetworkSend_Packet a bit - * A socket can make errors. When that happens this handles what to do. - * For clients: close connection and drop back to main-menu - * For servers: close connection and that is it - * @param cs the client to close the connection of - * @return the new status - */ -NetworkRecvStatus CloseConnection(NetworkClientState *cs) -{ - NetworkCloseClient(cs); - - /* Clients drop back to the main menu */ - if (!_network_server && _networking) { - _switch_mode = SM_MENU; - _networking = false; - _switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION; - - return NETWORK_RECV_STATUS_CONN_LOST; - } - - return NETWORK_RECV_STATUS_OKAY; -} - -/** - * Whether the client has quit or not (used in packet.c) - * @param cs the client to check - * @return true if the client has quit - */ -bool HasClientQuit(NetworkClientState *cs) -{ - return cs->has_quit; -} - -/** - * This function puts the packet in the send-queue and it is send as - * soon as possible. This is the next tick, or maybe one tick later - * if the OS-network-buffer is full) - * @param packet the packet to send - * @param cs the client to send to - */ -void NetworkSend_Packet(Packet *packet, NetworkClientState *cs) -{ - Packet *p; - assert(packet != NULL); - - packet->pos = 0; - packet->next = NULL; - - NetworkSend_FillPacketSize(packet); - - /* Locate last packet buffered for the client */ - p = cs->packet_queue; - if (p == NULL) { - /* No packets yet */ - cs->packet_queue = packet; - } else { - /* Skip to the last packet */ - while (p->next != NULL) p = p->next; - p->next = packet; - } -} - -/** - * Sends all the buffered packets out for this client. It stops when: - * 1) all packets are send (queue is empty) - * 2) the OS reports back that it can not send any more - * data right now (full network-buffer, it happens ;)) - * 3) sending took too long - * @param cs the client to send the packets for - */ -bool NetworkSend_Packets(NetworkClientState *cs) -{ - ssize_t res; - Packet *p; - - /* We can not write to this socket!! */ - if (!cs->writable) return false; - if (cs->socket == INVALID_SOCKET) return false; - - p = cs->packet_queue; - while (p != NULL) { - res = send(cs->socket, p->buffer + p->pos, p->size - p->pos, 0); - if (res == -1) { - int err = GET_LAST_ERROR(); - if (err != EWOULDBLOCK) { - /* Something went wrong.. close client! */ - DEBUG(net, 0, "send failed with error %d", err); - CloseConnection(cs); - return false; - } - return true; - } - if (res == 0) { - /* Client/server has left us :( */ - CloseConnection(cs); - return false; - } - - p->pos += res; - - /* Is this packet sent? */ - if (p->pos == p->size) { - /* Go to the next packet */ - cs->packet_queue = p->next; - free(p); - p = cs->packet_queue; - } else { - return true; - } - } - - return true; -} - -/** - * Receives a packet for the given client - * @param cs the client to (try to) receive a packet for - * @param status the variable to store the status into - * @return the received packet (or NULL when it didn't receive one) - */ -Packet *NetworkRecv_Packet(NetworkClientState *cs, NetworkRecvStatus *status) -{ - ssize_t res; - Packet *p; - - *status = NETWORK_RECV_STATUS_OKAY; - - if (cs->socket == INVALID_SOCKET) return NULL; - - if (cs->packet_recv == NULL) { - cs->packet_recv = malloc(sizeof(Packet)); - if (cs->packet_recv == NULL) error("Failed to allocate packet"); - /* Set pos to zero! */ - cs->packet_recv->pos = 0; - cs->packet_recv->size = 0; // Can be ommited, just for safety reasons - } - - p = cs->packet_recv; - - /* Read packet size */ - if (p->pos < sizeof(PacketSize)) { - while (p->pos < sizeof(PacketSize)) { - /* Read the size of the packet */ - res = recv(cs->socket, p->buffer + p->pos, sizeof(PacketSize) - p->pos, 0); - if (res == -1) { - int err = GET_LAST_ERROR(); - if (err != EWOULDBLOCK) { - /* Something went wrong... (104 is connection reset by peer) */ - if (err != 104) DEBUG(net, 0, "recv failed with error %d", err); - *status = CloseConnection(cs); - return NULL; - } - /* Connection would block, so stop for now */ - return NULL; - } - if (res == 0) { - /* Client/server has left */ - *status = CloseConnection(cs); - return NULL; - } - p->pos += res; - } - - NetworkRecv_ReadPacketSize(p); - - if (p->size > SEND_MTU) { - *status = CloseConnection(cs); - return NULL; - } - } - - /* Read rest of packet */ - while (p->pos < p->size) { - res = recv(cs->socket, p->buffer + p->pos, p->size - p->pos, 0); - if (res == -1) { - int err = GET_LAST_ERROR(); - if (err != EWOULDBLOCK) { - /* Something went wrong... (104 is connection reset by peer) */ - if (err != 104) DEBUG(net, 0, "recv failed with error %d", err); - *status = CloseConnection(cs); - return NULL; - } - /* Connection would block */ - return NULL; - } - if (res == 0) { - /* Client/server has left */ - *status = CloseConnection(cs); - return NULL; - } - - p->pos += res; - } - - /* We have a complete packet, return it! */ - p->pos = 2; - p->next = NULL; // Should not be needed, but who knows... - - /* Prepare for receiving a new packet */ - cs->packet_recv = NULL; - - return p; -} - -#endif /* ENABLE_NETWORK */ |