src/network/core/tcp.cpp
changeset 6149 44aedfd50791
parent 6115 c5bde03ec914
child 6153 2ecdbf81caa7
equal deleted inserted replaced
6148:a8cc2e7bf9b6 6149:44aedfd50791
    72 void NetworkSend_Packet(Packet *packet, NetworkTCPSocketHandler *cs)
    72 void NetworkSend_Packet(Packet *packet, NetworkTCPSocketHandler *cs)
    73 {
    73 {
    74 	Packet *p;
    74 	Packet *p;
    75 	assert(packet != NULL);
    75 	assert(packet != NULL);
    76 
    76 
    77 	packet->pos = 0;
    77 	packet->PrepareToSend();
    78 	packet->next = NULL;
       
    79 
       
    80 	NetworkSend_FillPacketSize(packet);
       
    81 
    78 
    82 	/* Locate last packet buffered for the client */
    79 	/* Locate last packet buffered for the client */
    83 	p = cs->packet_queue;
    80 	p = cs->packet_queue;
    84 	if (p == NULL) {
    81 	if (p == NULL) {
    85 		/* No packets yet */
    82 		/* No packets yet */
   131 
   128 
   132 		/* Is this packet sent? */
   129 		/* Is this packet sent? */
   133 		if (p->pos == p->size) {
   130 		if (p->pos == p->size) {
   134 			/* Go to the next packet */
   131 			/* Go to the next packet */
   135 			cs->packet_queue = p->next;
   132 			cs->packet_queue = p->next;
   136 			free(p);
   133 			delete p;
   137 			p = cs->packet_queue;
   134 			p = cs->packet_queue;
   138 		} else {
   135 		} else {
   139 			return true;
   136 			return true;
   140 		}
   137 		}
   141 	}
   138 	}
   157 	*status = NETWORK_RECV_STATUS_OKAY;
   154 	*status = NETWORK_RECV_STATUS_OKAY;
   158 
   155 
   159 	if (!cs->IsConnected()) return NULL;
   156 	if (!cs->IsConnected()) return NULL;
   160 
   157 
   161 	if (cs->packet_recv == NULL) {
   158 	if (cs->packet_recv == NULL) {
   162 		cs->packet_recv = MallocT<Packet>(1);
   159 		cs->packet_recv = new Packet(cs);
   163 		if (cs->packet_recv == NULL) error("Failed to allocate packet");
   160 		if (cs->packet_recv == NULL) error("Failed to allocate packet");
   164 		/* Set pos to zero! */
       
   165 		cs->packet_recv->pos = 0;
       
   166 		cs->packet_recv->size = 0; // Can be ommited, just for safety reasons
       
   167 	}
   161 	}
   168 
   162 
   169 	p = cs->packet_recv;
   163 	p = cs->packet_recv;
   170 
   164 
   171 	/* Read packet size */
   165 	/* Read packet size */
   190 				return NULL;
   184 				return NULL;
   191 			}
   185 			}
   192 			p->pos += res;
   186 			p->pos += res;
   193 		}
   187 		}
   194 
   188 
   195 		NetworkRecv_ReadPacketSize(p);
   189 		/* Read the packet size from the received packet */
       
   190 		p->ReadRawPacketSize();
   196 
   191 
   197 		if (p->size > SEND_MTU) {
   192 		if (p->size > SEND_MTU) {
   198 			*status = cs->CloseConnection();
   193 			*status = cs->CloseConnection();
   199 			return NULL;
   194 			return NULL;
   200 		}
   195 		}
   221 		}
   216 		}
   222 
   217 
   223 		p->pos += res;
   218 		p->pos += res;
   224 	}
   219 	}
   225 
   220 
   226 	/* We have a complete packet, return it! */
       
   227 	p->pos = 2;
       
   228 	p->next = NULL; // Should not be needed, but who knows...
       
   229 
       
   230 	/* Prepare for receiving a new packet */
   221 	/* Prepare for receiving a new packet */
   231 	cs->packet_recv = NULL;
   222 	cs->packet_recv = NULL;
   232 
   223 
       
   224 	p->PrepareToRead();
   233 	return p;
   225 	return p;
   234 }
   226 }
   235 
   227 
   236 #endif /* ENABLE_NETWORK */
   228 #endif /* ENABLE_NETWORK */