Author: suokko
Date: Tue May 20 12:15:17 2008
New Revision: 26729

URL: http://svn.gna.org/viewcvs/wesnoth?rev=26729&view=rev
Log:
Made networking code check system buffer size and limit send length

Modified:
    trunk/changelog
    trunk/src/network_worker.cpp

Modified: trunk/changelog
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/changelog?rev=26729&r1=26728&r2=26729&view=diff
==============================================================================
--- trunk/changelog (original)
+++ trunk/changelog Tue May 20 12:15:17 2008
@@ -72,6 +72,7 @@
    * fixed threading bug in upload_logs
    * dissallow_observers is on as default if side has controller=null
    * Fixed null-pointer reference in network code
+   * Made networking code check system buffer size and limit send length
    * Added possibility to use per fight EV statistics proposed by maboul
    * Added smoother FPS limit to server
    * Fixed a mememory leak in networking code

Modified: trunk/src/network_worker.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/network_worker.cpp?rev=26729&r1=26728&r2=26729&view=diff
==============================================================================
--- trunk/src/network_worker.cpp (original)
+++ trunk/src/network_worker.cpp Tue May 20 12:15:17 2008
@@ -162,6 +162,7 @@
 
 std::map<Uint32,threading::thread*> threads[NUM_SHARDS];
 std::vector<Uint32> to_clear[NUM_SHARDS];
+int system_send_buffer_size = 0;
 
 int receive_bytes(TCPsocket s, char* buf, size_t nbytes)
 {
@@ -177,6 +178,18 @@
 #else
        return SDLNet_TCP_Recv(s, buf, nbytes);
 #endif
+}
+
+
+void check_send_buffer_size(TCPsocket& s)
+{
+       if (system_send_buffer_size)
+               return;
+       _TCPsocket* sock = reinterpret_cast<_TCPsocket*>(s);
+       socklen_t len = sizeof(system_send_buffer_size);
+       getsockopt(sock->channel, SOL_SOCKET, 
SO_RCVBUF,&system_send_buffer_size, &len);
+       --system_send_buffer_size;
+       std::cerr << "send buffer size: " << system_send_buffer_size << "\n";
 }
 
 bool receive_with_timeout(TCPsocket s, char* buf, size_t nbytes,
@@ -281,8 +294,10 @@
 #ifdef __BEOS__
        int timeout = 15000;
 #endif
+       check_send_buffer_size(sock);
        size_t upto = 0;
        size_t size = buf.size();
+       int send_len = 0;
 
        if (!raw_data_only)
        {
@@ -301,7 +316,8 @@
                        if(sockets_locked[shard][sock] != SOCKET_LOCKED)
                                return SOCKET_ERRORED;
                }
-               const int res = SDLNet_TCP_Send(sock, &buf[upto], 
static_cast<int>(size - upto));
+               send_len = minimum<int>(system_send_buffer_size,  
static_cast<int>(size - upto));
+               const int res = SDLNet_TCP_Send(sock, &buf[upto],send_len);
 
                if(!raw_data_only && res == static_cast<int>(size - upto)) {
                        {


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to