# Ağ Seçenekleri, Sınırları ve Hataları

- **İngilizce aslı:** https://wiki.facepunch.com/gmod/Networking_Usage
- **Çeviri tarihi:** 2025-09-08

Bu sayfa, mevcut Ağ Seçeneklerini ve nasıl çalıştıklarını, tüm Ağ Sınırlarını ve bulunan tüm Ağ Hatalarını ve bunların nasıl çözüleceğini listeler

## Gezgin

Bu, sayfada daha kolay gezinebilmeniz için bu Sayfanın tüm bölümlerini içeren bir listedir.

- [Ağ Seçenekleri](https://gmod.tr/wiki/Networking_Usage#networkingoptions)

  - [umsg (ESKİ)](https://gmod.tr/wiki/Networking_Usage#umsgdeprecated)
  - [net](https://gmod.tr/wiki/Networking_Usage#net)
  - [NW](https://gmod.tr/wiki/Networking_Usage#nw)
  - [NW2](https://gmod.tr/wiki/Networking_Usage#nw2)
  - [DataTable](https://gmod.tr/wiki/Networking_Usage#datatable)
- [Ağ Sınırları](https://gmod.tr/wiki/Networking_Usage#networkinglimits)

  - [umsg](https://gmod.tr/wiki/Networking_Usage#umsglimits)
  - [net](https://gmod.tr/wiki/Networking_Usage#netlimits)

    - [net bant genişliği](https://gmod.tr/wiki/Networking_Usage#netbandwidth)
  - [NW](https://gmod.tr/wiki/Networking_Usage#nwlimits)
  - [NW2](https://gmod.tr/wiki/Networking_Usage#nw2limits)
  - [DataTable](https://gmod.tr/wiki/Networking_Usage#datatablelimits)
- [Ağ Optimizasyonu](https://gmod.tr/wiki/Networking_Usage#networkingoptimization)

  - [sv_playerforcedupdate sorunu](https://gmod.tr/wiki/Networking_Usage#svplayerforcedupdateissue)
- [Ağ Hataları](https://gmod.tr/wiki/Networking_Usage#networkingerrors)

  - [umsg](https://gmod.tr/wiki/Networking_Usage#umsgerrors)
  - [net](https://gmod.tr/wiki/Networking_Usage#neterrors)
  - [NW](https://gmod.tr/wiki/Networking_Usage#nwerrors)
  - [NW2](https://gmod.tr/wiki/Networking_Usage#nw2errors)

## Ağ Seçenekleri

### umsg (ESKİ)

[umsg](https://gmod.tr/wiki/umsg) kütüphanesi, sunucudan istemciye bilgi göndermenin en yaygın yolu olan, artık kullanılmayan sunucu taraflı bir ağ kütüphanesidir. İstemcilerin bir umsg alabilmesi için, istemci ve sunucu için paylaşılan [usermessage](https://gmod.tr/wiki/usermessage) kütüphanesini kullanması gerekir.

Bu kütüphane, istemciye metin gibi bir mesaj göndermek ve ardından görüntülemek için bazı fonksiyonlarda kullanılıyordu ve hala [PrintMessage](https://gmod.tr/wiki/Global.PrintMessage), [Player:PrintMessage](https://gmod.tr/wiki/Player:PrintMessage) ve [Player:ChatPrint](https://gmod.tr/wiki/Player:ChatPrint) gibi bazı eski fonksiyonlarda kullanılmaktadır. Ayrıca NW Sistemi tarafından NW Değişkenlerini ağa aktarmak için de kullanılır.

> **NOT:** Motor tarafından bir istemciye gönderilen umsg, net arabelleği taşmış olsa / herhangi bir net mesajı alıp gönderemese bile alınabilir.

[umsg](https://gmod.tr/wiki/umsg) ve [usermessage](https://gmod.tr/wiki/usermessage) kütüphanesi ile Merhaba Dünya örneği.

```lua
if SERVER then
	local filter = RecipientFilter()
	filter:AddAllPlayers()
	umsg.Start( "Example" )
		umsg.String( "Hello World" )
	umsg.End()
else
	usermessage.Hook( "Example", function( msg )
		print( msg:ReadString() )
	end)
end
```

---

### net

[net](https://gmod.tr/wiki/net) kütüphanesi, istemci ve sunucu arasında veri göndermenin yollarından biridir. Net kütüphanesinin en büyük avantajlarından biri, verileri geriye doğru - istemciden sunucuya - gönderme yeteneğidir.

Bu kütüphane genellikle değerlerin yalnızca belirli bir istemciye ağ üzerinden aktarılmasında veya String'ler ([net.WriteString](https://gmod.tr/wiki/net.WriteString)) veya Int'ler ([net.WriteInt](https://gmod.tr/wiki/net.WriteInt)) gibi daha büyük değerlerin ağa aktarılmasında kullanılır.
Bu kütüphane hakkında daha fazla bilgiyi buradan okuyabilirsiniz: [Net_Library_Usage](https://gmod.tr/wiki/Net_Library_Usage) ve [Net_Library_Example](https://gmod.tr/wiki/Net_Library_Example)

> **NOT:** `OnRequestFullUpdate` [Game_Events](https://wiki.facepunch.com/gmod/Game_Events) ilk kez çağrıldığında, [net](https://gmod.tr/wiki/net) mesajları güvenilir bir şekilde alınacaktır

> **NOT:** AutoRefresh Sistemi, değişiklikleri ağa aktarmak için net kütüphanesini kullanır. Bu nedenle, 65536 bayt ile sınırlıdır.
> Sınırı aşarsanız, bir hata fırlatır.

[net](https://gmod.tr/wiki/net) kütüphanesi ile Merhaba Dünya Örneği

```lua
if SERVER then
	util.AddNetworkString( "Example" )
	net.Start( "Example" )
		net.WriteString( "Hello World" )
	net.Broadcast()
else
	net.Receive( "Example", function()
		print( net.ReadString() )
	end)
end
```

---

### NW

NW sistemi, bir varlık üzerindeki bir değerin [Entity:SetNWString](https://gmod.tr/wiki/Entity:SetNWString) gibi SetNW fonksiyonları ile tüm istemcilere ağ üzerinden aktarılmasına olanak tanır ve değer, [Entity:GetNWString](https://gmod.tr/wiki/Entity:GetNWString) gibi GetNW fonksiyonları kullanılarak döndürülebilir.
Ayrıca, [SetGlobalString](https://gmod.tr/wiki/Global.SetGlobalString) gibi SetGlobal* fonksiyonlarını kullanarak genel değerler ayarlamaya olanak tanır ve değer, [GetGlobalString](https://gmod.tr/wiki/Global.GetGlobalString) gibi GetGlobal* fonksiyonları kullanılarak döndürülebilir

> **NOT:** değer, istemci tarafından değiştirilmediği sürece tüm istemcilerde aynı olacaktır.
> Tüm SetNW* ve SetGlobal* fonksiyonları, ayarlandıktan sonra her 10 saniyede bir değeri ağa aktarır.
> (Bu nedenle, çok sayıda NW değişkeni kullanırsanız büyük miktarda ağ trafiğine neden olabilir.)
> Tüm NW değerleri, [GM:InitPostEntity](https://gmod.tr/wiki/GM:InitPostEntity) kancası çağrıldığında istemci tarafında erişilebilir olacaktır
>
> SetGlobal* dahili olarak `Entity(0):SetNW*` gibi çalışır ve bu nedenle, SetGlobal* fonksiyonları ile ayarlanan değerlere `Entity(0):GetNW*` ile erişilebilir

NW sistemi ile Merhaba Dünya Örneği

```lua
if SERVER then
	Entity( 1 ):SetNWString( "Example", "Hello World" )
else
	Entity( 1 ):SetNWVarProxy( "Example", function(_, _, _, value )
		print( value )
	end)
end
```

NW sistemi ile bir tabloyu ağa aktarmak isterseniz, onu bir string'e dönüştürmek için [util.TableToJSON](https://gmod.tr/wiki/util.TableToJSON) kullanabilir ve ardından onu [Entity:SetNWString](https://gmod.tr/wiki/Entity:SetNWString) veya [SetGlobalString](https://gmod.tr/wiki/Global.SetGlobalString) ile gönderip [Entity:GetNWString](https://gmod.tr/wiki/Entity:GetNWString) veya [GetGlobalString](https://gmod.tr/wiki/Global.GetGlobalString) ile döndürebilirsiniz

> **NOT:** [util.TableToJSON](https://gmod.tr/wiki/util.TableToJSON) tarafından döndürülen string 255 karakterden büyük olmamalıdır. 511 karaktere kadar kullanmak için NW2 sistemini kullanabilirsiniz.

### Örnek: Bir tabloyu ağa aktarmak için NW kullanma

Merhaba Dünya içeren bir tabloyu ağa aktarma

```lua
if SERVER then
	local table = { "Hello World" }
	SetGlobalString( "Example", util.TableToJSON( table ) )
else
	PrintTable( util.JSONToTable( GetGlobalString( "Example" ) ) )
end
```

**Çıktı:**

```lua
1	=	Hello World
```

---

### NW2

NW2 sistemi, NW sisteminin halefidir, ancak resmi olarak tamamlanmamıştır. Varlık üzerindeki değerlerin, varlığın [PVS (Potansiyel Görünürlük Seti)](https://developer.valvesoftware.com/wiki/PVS) içindeki tüm istemcilere, [Entity:SetNW2String](https://gmod.tr/wiki/Entity:SetNW2String) gibi SetNW2* fonksiyonları ile verilen değerle ağ üzerinden aktarılmasına olanak tanır ve değer, [Entity:GetNW2String](https://gmod.tr/wiki/Entity:GetNW2String) gibi GetNW2* fonksiyonları kullanılarak döndürülebilir.

> **NOT:** Değer, yalnızca varlık istemcinin [PVS (Potansiyel Görünürlük Seti)](https://developer.valvesoftware.com/wiki/PVS) içindeyse veya PVS'ine girerse istemci tarafında güncellenir.
> Değer, yalnızca mevcut değerle aynı değilse ağa aktarılır ve SetNW*'den farklı olarak değer, her 10 saniyede bir değil, yalnızca bir kez ağa aktarılır.
> Tüm NW2 değerleri, [GM:InitPostEntity](https://gmod.tr/wiki/GM:InitPostEntity) kancası çağrıldığında istemci tarafında erişilebilir olacaktır
>
> SetGlobal2* dahili olarak `Entity(0):SetNW2*` gibi çalışır ve bu nedenle, SetGlobal2* fonksiyonlarıyla ayarlanan değerlere `Entity(0):GetNW2*` ile erişilebilir
>
> Bir Oyuncu üzerinde ayarlanan tüm NW2Vars değişkenleri, [sv_playerforcedupdate](https://gmod.tr/wiki/Networking_Usage#svplayerforcedupdateissue) nedeniyle her 10 saniyede bir güncellenir

Ayrıca, [SetGlobal2String](https://gmod.tr/wiki/Global.SetGlobal2String) gibi SetGlobal2* fonksiyonlarını kullanarak genel değerler ayarlamaya olanak tanır ve değer, [GetGlobal2String](https://gmod.tr/wiki/Global.GetGlobal2String) gibi GetGlobal2* fonksiyonları kullanılarak döndürülebilir. Tüm SetGlobal2* fonksiyonları, değeri istemci tarafında günceller ve PVS'yi yok sayar.

NW2 sistemi ile Merhaba Dünya Örneği

```lua
if SERVER then
	Entity( 1 ):SetNW2String( "Example", "Hello World" )
else
	Entity( 1 ):SetNW2VarProxy( "Example", function( _, _, _, value )
		print( value )
	end)
end
```

veya

```lua
if SERVER then
	Entity( 1 ):SetNW2String( "Example", "Hello World" )
else
	hook.Add( "EntityNetworkedVarChanged", "Example", function( _, _, _, value )
		print( value )
	end)
end
```

NW2 sistemi ile bir tabloyu ağa aktarmak isterseniz, onu bir string'e dönüştürmek için [util.TableToJSON](https://gmod.tr/wiki/util.TableToJSON) kullanabilir ve ardından onu [Entity:SetNW2String](https://gmod.tr/wiki/Entity:SetNW2String) veya [SetGlobal2String](https://gmod.tr/wiki/Global.SetGlobal2String) ile gönderip [Entity:GetNW2String](https://gmod.tr/wiki/Entity:GetNW2String) veya [GetGlobal2String](https://gmod.tr/wiki/Global.GetGlobal2String) ile döndürebilirsiniz

> **NOT:** [util.TableToJSON](https://gmod.tr/wiki/util.TableToJSON) tarafından döndürülen string 511 karakterden büyük olmamalıdır.

### Örnek: Bir tabloyu ağa aktarmak için NW2 kullanma

Merhaba Dünya içeren bir Tabloyu ağa aktarma

```lua
if SERVER then
	local table = { "Hello World" }
	SetGlobal2String( "Example", util.TableToJSON( table ) )
else
	PrintTable( util.JSONToTable( GetGlobal2String( "Example" ) ) )
end
```

**Çıktı:**

```lua
1	=	Hello World
```

#### NW2 Sistemi hakkında bazı ek bilgiler

Eğer [Entity:SetPreventTransmit](https://gmod.tr/wiki/Entity:SetPreventTransmit) `true` olarak ayarlanırsa, istemcinin PVS'sinden çıkar ve NW2Vars ağa aktarılmaz.
Varlık, tekrar false olarak ayarlanana kadar hiçbir koşulda istemcinin PVS'sine tekrar girmez.

Bir NW2Var, `entmessage` (Varlık Mesajı) olarak ağa aktarılır.

> **DOĞRULAMA:** [Entity:NetworkVar](https://gmod.tr/wiki/Entity:NetworkVar) dahili olarak NW2 Sistemini kullanıyor gibi görünüyor, bu nedenle aynı limitleri paylaşıyorlar.

[Entity:UpdateTransmitState](https://gmod.tr/wiki/ENTITY:UpdateTransmitState), [Entity:NetworkVar](https://gmod.tr/wiki/Entity:NetworkVar)'ı etkiler ancak `SetNW2*` ile ayarlanan NW2Vars'ı etkilemez

Varlığı her istemcinin PVS'sine zorlamak için [EFL_IN_SKYBOX](https://gmod.tr/wiki/Enums/EFL) Motor Bayrağını kullanabilirsiniz. (Bu, istemciler için çalışmaz. İstemcileri PVS'ye eklemek isterseniz, [AddOriginToPVS](https://gmod.tr/wiki/Global.AddOriginToPVS) kullanmanız gerekir)

### Örnek: Bir Varlığı zorla ağa aktarma

Varlığı PVS'ye girmeye zorlama

```lua
local ent = Entity( 93 ) -- PVS'nizin dışındaki bir Prop
if SERVER then
	ent:SetNW2String( "Hello", "World" )
	ent:AddEFlags( EFL_IN_SKYBOX )
else
	hook.Add( "EntityNetworkedVarChanged", "Example", print )
end
```

**Çıktı:**

```lua
Entity [93][prop_physics]	Hello	nil	World
```

NW2 Sistemi için [BuildNetworkedVarsTable](https://gmod.tr/wiki/Global.BuildNetworkedVarsTable) gibi resmi bir fonksiyon yoktur, ancak bunun gibi bir fonksiyon kullanabilirsiniz.

### Örnek: BuildNetworked2VarsTable

```lua
-- Bu en hızlı yol değildir ve daha fazla varlık mevcut olduğunda yavaşlayabilir, ancak bu fonksiyonu çok sık çağırmamalısınız.
function BuildNetworked2VarsTable()
	local vars = {}
	for _, ent in ipairs(ents.GetAll()) do
		for key, tbl in pairs(ent:GetNW2VarTable()) do
			if !tbl.value then continue end -- GetNW2VarTable nil değerli anahtarlar döndürebilir.

			if !vars[ent] then -- bunu yapıyoruz, çünkü sadece NW2 Değişkenlerine sahip varlıkları eklemek istiyoruz.
				vars[ent] = {}
			end

			vars[ent][key] = tbl.value -- NW2 Değişkenini ekler.
		end
	end

	return vars
end
```

---

### DataTable

DataTable ya da kısaca DT, oyunun derleme zamanında tanımlanan ve bu nedenle oyuna sabit kodlanmış veri tablosu alanlarıdır.
Bu DataTable sistemi, kaynak motorundaki tüm motor varlıkları tarafından kullanılan ana ağ sistemidir.
Alanları ağa aktarmak için NW2 gibi [PVS (Potansiyel Görünürlük Seti)](https://developer.valvesoftware.com/wiki/PVS) kullanır.
Birçok Data Table alanına [Entity:GetSaveTable](https://gmod.tr/wiki/Entity:GetSaveTable) ve [Entity:GetInternalVariable](https://gmod.tr/wiki/Entity:GetInternalVariable) kullanılarak erişilebilir ve [Entity:SetSaveValue](https://gmod.tr/wiki/Entity.SetSaveValue) kullanılarak değiştirilebilir
[Entity:NetworkVar](https://gmod.tr/wiki/Entity:NetworkVar)'ın çalışması için, Gmod birkaç Dizi alanı tanımlamıştır:

- `m_GMOD_bool`, [Entity:GetDTBool](https://gmod.tr/wiki/Entity:GetDTBool) kullanılarak erişilen `32` yuvaya sahip bir boolean dizisi.
- `m_GMOD_float`, [Entity:GetDTFloat](https://gmod.tr/wiki/Entity:GetDTFloat) kullanılarak erişilen `32` yuvaya sahip bir float dizisi.
- `m_GMOD_int`, [Entity:GetDTInt](https://gmod.tr/wiki/Entity:GetDTInt) kullanılarak erişilen `32` yuvaya sahip bir integer dizisi.
- `m_GMOD_Vector`, [Entity:GetDTVector](https://gmod.tr/wiki/Entity:GetDTVector) kullanılarak erişilen `32` yuvaya sahip bir [Vector](https://gmod.tr/wiki/Vector) dizisi.
- `m_GMOD_QAngle`, [Entity:GetDTAngle](https://gmod.tr/wiki/Entity:GetDTAngle) kullanılarak erişilen `32` yuvaya sahip bir [Angle](https://gmod.tr/wiki/Angle) dizisi.
- `m_GMOD_EHANDLE`, [Entity:GetDTEntity](https://gmod.tr/wiki/Entity:GetDTEntity) kullanılarak erişilen `32` yuvaya sahip bir [Entity](https://gmod.tr/wiki/Entity) dizisi.

`m_GMOD_String` alanları, her biri `511` karakter uzunluğunda olan ve [Entity:GetDTString](https://gmod.tr/wiki/Entity:GetDTString) kullanılarak erişilen `4` alana bölünmüştür.

- `m_GMOD_String0`
- `m_GMOD_String1`
- `m_GMOD_String2`
- `m_GMOD_String3`

> **NOT:** Tüm `m_GMOD_String` alanlarına, `CBaseEntity` `DATADESC` tanımında eksik göründükleri için bahsedilen [Entity:GetSaveTable](https://gmod.tr/wiki/Entity:GetSaveTable) ve [Entity:GetInternalVariable](https://gmod.tr/wiki/Entity:GetInternalVariable) fonksiyonları kullanılarak erişilemez.

## Ağ Sınırları

### umsg sınırları

[umsg](https://gmod.tr/wiki/umsg) kütüphanesinin mesaj başına 256 bayt sınırı vardır.
Baytlar aşağıdaki gibi kullanılır:

> 2 Bayt Dahili olarak kullanılır
> x Bayt umsg Adı için kullanılır (her karakter için 1 Bayt.)
> kalan Baytlar gerçek umsg tarafından kullanılır.

> **NOT:** Veri göndermek için umsg arabelleği sınırlı değildir. Bu nedenle, belleğiniz bitene kadar istediğiniz kadar umsg gönderebilirsiniz.
> Belleğiniz biterse, oyununuz basitçe çöker.

Varsayılan olarak, tek bir tick'te bir istemciye 1024 bayt umsg ağ üzerinden gönderebilirsiniz.
Bir şeyi hızlandırmak için veya sadece daha fazla kapasiteye ihtiyaç duyarsanız,
`sv_usermessage_maxsize (varsayılan 1024 bayt)` ConVar'ını gereken bayt miktarına yükseltebilirsiniz.

---

### net sınırları

[net](https://gmod.tr/wiki/net) kütüphanesinin mesaj başına 64kb (65535 bayt - 3 bayt dahili olarak kullanılır) sınırı vardır. Kütüphanenin taşmadan önce yaklaşık 256kb (2048kbit) sınırı olan dahili bir arabelleği vardır ve taşarsa, net mesajını alan istemcilerin bağlantısının kesilmesine neden olur. Bu yüzden arabelleği **DOLDURMAYIN**.
Ayrıca istemci tarafında, çok fazla net mesajı kuyruğa alınırsa ve tüm net mesajlarının toplam boyutu 256kb'ı (2048bit) aşarsa taşacak güvenilir bir akışa sahiptir.

### Örnek: net mesaj sınırı

Maksimum boyutu kullanan bir net mesajı oluşturma

```lua
local string = ""
for k=1, 65532 do
	string = string .. "a"
end
net.Start( "test" )
	net.WriteString( string )
net.Broadcast()
```

**Çıktı:**

```lua
65536	524288
```

### net bant genişliği

Biraz açıklama zamanı.
Her net kanalının toplam `8` alt kanalı vardır, her iletimde tek bir tane kullanılır.
Bir alt kanal kullanıldığında, istemci yanıt verene ve sunucuya alt kanalın alındığını bildirene kadar engellenmiş olarak işaretlenir, ardından serbest olarak işaretlenir ve tekrar kullanılabilir.
Kullanılabilir bir alt kanal yoksa, sunucu biri tekrar serbest kalana kadar hiçbir şeyi ağa aktarmaz.
Sunucu -> istemci -> sunucu arasındaki bu gidiş geliş zaman alır ve muhtemelen bant genişliğini sınırlar.
Daha yüksek bir pinge sahip olmak daha fazla alt kanalın kullanılmasına neden olur ve hepsi engellendiğinde bant genişliğini etkilemeye başlar.

Ek olarak, şu anda her iletimde yalnızca `7`'ye kadar parça iletilebilir ve tek bir parça şu anda `256` bayt büyüklüğündedir.
Varsayılan olarak, motor `4` parça kullanır, ancak `net_maxfragments`'ı `1792`'ye yükseltmek, motorun tam `7` parçayı kullanmasına neden olur.
Bu küçük parça boyutu ve sayısı, bant genişliğini büyük ölçüde sınırlar.

Bant genişliğini iyileştirmek için ağ limitlerini artırmaya yönelik açık bir istek var: [https://github.com/Facepunch/garrysmod-requests/issues/2632](https://github.com/Facepunch/garrysmod-requests/issues/2632)

> **NOT:** Gmod'un kasıtlı bir bant genişliği sınırı yoktur / bilerek sınırlandırılmamıştır - Rubat.

#### güvenilir kanal

güvenilir kanal için bant genişliği yaklaşık 120kb/s'dir ancak her istemci için değişebilir.

#### güvenilmez kanal

güvenilmez kanal için bant genişliği sınırsız gibi görünmektedir ve yalnızca net mesajını göndermek için gereken süreden etkileniyor gibi görünmektedir. Net mesajı çoğu zaman alınmaz çünkü arabellek dolu olur ve net mesajını atlar.

##### istemci tarafı hataları (güvenilmez kanal)

Yaklaşık 12kb/s civarında bir yerde net arabelleği aşırı yüklenmiş gibi görünüyor ve yerinizde donacaksınız çünkü arabellek aşırı yüklenmişken istemciniz sunucudan herhangi bir net mesajı alamayacak, ancak yine de sunucuya net mesajları gönderebileceksiniz.
Arabellek normal durumuna döner dönmez, arabellek aşırı yüklendiği için geciken tüm güvenilir net mesajlarını almaya başlayacaksınız.

##### sunucu tarafı hataları (güvenilmez kanal)

Yaklaşık 12kb/s civarında bir yerde net arabelleği aşırı yüklenmiş gibi görünüyor ve sunucu herhangi bir bağlantı sorunu veya paket kaybı olmadan gecikmeye başlayacaktır. Tüm girdiler gecikiyor ve zıplama gibi bazıları düzgün çalışmıyor.
Net arabelleği normal durumuna döndüğünde sunucu normal durumuna dönecektir.

---

### NW sınırları

NW sistemi, 4095 yuvaya sahip olan ve tüm SetGlobal*, SetNW* fonksiyonları ve [util.AddNetworkString](https://gmod.tr/wiki/util.AddNetworkString) fonksiyonu tarafından kullanılan bir stringtable kullanır.
Varsayılan olarak 95 yuva kullanılır. Her yeni anahtar bir yuva kullanır, bu nedenle tüm varlıklarda aynı anahtarı kullanırsanız, yalnızca 1 yuva kullanır.
Bir NWVar Adı için maksimum uzunluk 49 karakterdir.

> **UYARI:** NW Sistemi, Değişkenleri ağa aktarmak için [kullanıcı mesajları](https://gmod.tr/wiki/umsg) kullanır. Bu nedenle, bir NWVar'ın maksimum boyutu 255 bayt olabilir.

### Örnek: kullanılan networkstrings yuvalarını alma

Kullanılan yuva miktarını ve son anahtarı döndürme

```lua
for k = 1, 4096 do
	if !util.NetworkIDToString( k ) then
		print( k - 1, util.NetworkIDToString( k - 1 ) )
		break
	end
end
```

**Çıktı:**

```lua
95	ServerName
```

---

### NW2 sınırları

NW2 sistemi, 4095 yuvaya sahip ayrı bir stringtable kullanır, bu nedenle NW stringtable'dan etkilenmez.
NW2 stringtable, tüm SetNW2* ve SetGlobal2* fonksiyonları tarafından kullanılır. Varsayılan olarak, stringtable tamamen boştur.
Her yeni anahtar bir yuva kullanır, bu nedenle tüm varlıklarda aynı anahtarı kullanırsanız, yalnızca 1 yuva kullanır.
Şu anda, NW2 string tablosunun kullanımını kontrol etmenin bir yolu yoktur.
Bir NW2Var anahtarı için maksimum uzunluk 1023 karakterdir.
(neden bir değerden daha fazla bir anahtar için veri ağa aktarabilirsiniz? (SetNW2String yalnızca 511 karakter ağa aktarabilir.) Güncelleme: Anahtar uzunluğu stringtable/motor tarafından sınırlandırılmıştır ve değer gmod tarafından konulan bir sınırdır)
1023 karakterden küçük ancak 511 karakterden büyük bir string'i ağa aktarmanız gerekiyorsa, [Entity:SetNW2String](https://gmod.tr/wiki/Entity:SetNW2String) için örneğe bakın

---

### DataTable sınırları

DataTable alanları oyuna sabit kodlanmıştır ve bunlarda yapılacak herhangi bir değişiklik büyük olasılıkla ağ uyumluluğunu bozarak bunları yapmayı daha zahmetli hale getirir.
DataTable'a sahip Motor varlıkları eklemek de büyük olasılıkla ağ uyumluluğunu bozar, bu yüzden genellikle bir net-compat güncellemesi yapılana kadar ertelenirler.

## Ağ Optimizasyonu

### sv_playerforcedupdate sorunu

Daha büyük bir sunucu çalıştırıyorsanız, oyuncuların her 10 saniyede bir zorla güncellendiğini fark etmiş olabilirsiniz.
Bunun nedeni, bir oyuncuyu tekrar güncellemeden önce beklenecek saniye miktarını tanımlayan `sv_playerforcedupdate (varsayılan 10)`'dur.
Oyuncuyu bir tick için PVS'ye ekleyip bir sonraki tick'te kaldırarak günceller.
Bu aynı zamanda NW2Vars'ın oyuncular için her 10 saniyede bir güncellenmesinin nedenidir (Eğer senkronize değillerse).
Bu sorun, istemci için büyük miktarda ağ trafiğine neden olabilir ve kısa süreli kare düşüşlerine yol açabilir.

Eğer `sv_playerforcedupdate`'ı `1000` gibi bir sayıya ayarlayıp sonra tekrar `1`'e değiştirirsek,
bu değişiklik yalnızca bir sonraki güncellemeden sonra uygulanır. Bu durumda 1000 saniye sonra
Eğer `0`'a ayarlarsanız, tüm oyuncular her karede güncellenir!

Ağdaki ani yükselmelere bir örneği [burada](https://files.facepunch.com/wiki/files/ab571/8dc3895fed46af3.png) görebilirsiniz.

### Örnek: tam güncellemelerde oyuncuları ağa aktarma

Bu, bu Sorunu çözmenin yollarından biridir.
Bu çözüm mükemmel değil çünkü sadece Oyuncuyu değil, tüm konumu PVS'ye ekliyoruz.
Bunu bu şekilde yapıyoruz çünkü şu anda PVS'ye tek bir varlık eklemenin bir yolu yok.

```lua
-- Bu İstemci tarafı kısmıdır.

if CLIENT then
	local cooldown = 0 -- Bu olay iki kez çağrılır. Bu nedenle, iki kez istememek için bir gecikme ekliyoruz.
	hook.Add( "InitPostEntity", "RequestFullPlayerUpdate", function()
		gameevent.Listen( "OnRequestFullUpdate" ) -- Bunu istemci tarafında yapıyoruz çünkü bu olay Güncelleme alındıktan sonra çağrılır.
		hook.Add( "OnRequestFullUpdate", "RequestFullPlayerUpdate", function( data )
			if data.userid != LocalPlayer():UserID() then return end -- Diğer oyuncularla ilgili olayları alabiliriz, bu yüzden onları filtrelememiz gerekiyor.
			if cooldown > CurTime() then return end

			net.Start( "RequestFullPlayerUpdate" )
			net.SendToServer()

			cooldown = CurTime() + 5
		end)

		net.Start( "RequestFullPlayerUpdate" ) -- Sadece istemcinin her şeye sahip olduğundan emin olmak için.
		net.SendToServer()
	end)

	return
end

-- İstemci tarafı kısmı yukarıdadır. Geri kalanı sadece sunucu tarafıdır.

-- Bu, PVS'nin içindeki tüm oyuncuları döndürür.
local function player_FindInPVS( viewPoint )
	local plys = {}
	for _, ent in ipairs( ents.FindInPVS( viewPoint ) ) do
		if ent:IsPlayer() then
			table.insert( plys, ent )
		end
	end

	return plys
end

-- Bu, PVS'nin dışındaki tüm oyuncuları döndürür.
local function player_FindOutsidePVS( viewPoint )
	local plys = {}
	local pvs_plys = player_FindInPVS( viewPoint )
	for _, ply in ipairs( player.GetAll() ) do
		if !pvs_plys[ ply ] then -- Oyuncunun PVS içinde olup olmadığını kontrol ediyoruz. PVS içinde değilse, onu Tabloya ekliyoruz.
			table.insert( plys, ply )
		end
	end

	return plys
end

local query = {}
local query_size = 0
local function RemovePlayer( query, id, ply )
	query[ id ] = nil

	if #query == 0 then
		query[ ply ] = nil
		query_size = query_size - 1

		if query_size == 0 then
			hook.Remove( "SetupPlayerVisibility", "Player_Query" ) -- Gerekli değilse kancayı kaldırıyoruz.
		end
	end
end

local function SetupPlayerVisibility( ply )
	local left_plys = query[ ply ]
	if !left_plys then return end -- Oyuncu kalmadıysa atla.

	local id
	local next_ply
	for k, v in pairs( left_plys ) do -- ipairs bozulduğu için pairs kullanmalıyız.
		id = k
		next_ply = v
		break
	end

	if next_ply:TestPVS( ply ) then -- Oyuncunun PVS içinde olup olmadığını kontrol ediyoruz. Eğer öyleyse, onu listeden çıkarıyoruz.
		RemovePlayer( left_plys, id, ply )
		return
	end

	AddOriginToPVS( next_ply:GetPos() )
	RemovePlayer( left_plys, id, ply )

	--[[
		Çoğu oyuncunun aynı yerde olduğu kalabalık bir sunucumuz varsa, diğer oyuncuların da sorguda olup olmadığını kontrol edebiliriz.
		Sadece birkaç oyuncunuz varsa veya hepsi haritanın her yerine dağılmışsa aşağıdaki kodu devre dışı bırakabilirsiniz, ancak bunu önermiyorum.
		Aşağıdaki kod, ağa aktarılmış başka bir oyuncunun PVS'sinde olan oyuncular kaldırıldığı için bir sürü ağ trafiği tasarrufu sağlar.
	]]

	local pvs_plys = {}
	for _, pvs_ply in ipairs( player_FindInPVS( next_ply ) ) do -- Bu performans tasarrufu sağladığı için tabloyu ters çeviriyoruz.
		pvs_plys[ pvs_ply ] = true
	end

	for key, left_ply in pairs( left_plys ) do
		if pvs_plys[ left_ply ] then
			RemovePlayer( left_plys, key, ply )
		end
	end
end

util.AddNetworkString( "RequestFullPlayerUpdate" )
net.Receive( "RequestFullPlayerUpdate", function( _, ply )
	query[ ply ] = player_FindOutsidePVS( ply ) -- PVS'ye eklemek istediğimiz tüm oyuncuları içeren bir tablo ekliyoruz

	if query_size == 0 then
		hook.Add( "SetupPlayerVisibility", "Player_Query", SetupPlayerVisibility ) -- İhtiyaç duyulduğunda kancayı ekliyoruz.
	end

	query_size = query_size + 1
end )
```

## Ağ Hataları

### umsg hataları

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
Error sending usermessage - too large ([name])
```

Bu hata, 256 baytlık [umsg](https://gmod.tr/wiki/umsg) sınırını aştığınızda sunucu tarafında oluşturulur. Bu hatayı çözmek için umsg'nizin boyutunu azaltın.

---

![realm](https://gmod.tr/api/uploads/wiki/c01de488cc91a14f7b05.png)

```lua
Warning: Unhandled usermessage '[name]'
```

Bu hata, doğru anahtarla [usermessage.Hook](https://gmod.tr/wiki/usermessage.Hook) kullanmayı unuttuğunuzda istemci tarafında oluşturulur.

> **NOT:** [umsg](https://gmod.tr/wiki/umsg) eskidir ve bunun yerine [net](https://gmod.tr/wiki/net) kütüphanesini kullanmalısınız.

### Örnek: umsg örneği

umsg kütüphanesi nasıl doğru kullanılır

```lua
if SERVER then
	local filter = RecipientFilter()
	filter:AddAllPlayers()
	umsg.Start( "Example" )
		umsg.String( "Hello World" )
	umsg.End()
else
	usermessage.Hook( "Example", function( msg )
		print( msg:ReadString() )
	end)
end
```

---

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
Warning: [number] global queued usermessages!
```

Bu Uyarı, aynı anda 5000'den fazla [umsg](https://gmod.tr/wiki/umsg) gönderildiğinde ortaya çıkar. Bu uyarı hiçbir şeyi etkilemeyeceği için tamamen göz ardı edilebilir. Bu Uyarı, daha az [umsg](https://gmod.tr/wiki/umsg) göndererek veya bunları bir zaman aralığına yayarak düzeltilebilir.

---

### net hataları

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
[addon] Trying to send an overflowed net message!
```

Bu hata, 64kb (65536 bayt) net sınırını aştığınızda sunucu tarafında oluşturulur. Bu hatayı çözmek için net mesajınızın boyutunu azaltın.

---

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png) ![](https://gmod.tr/api/uploads/wiki/bfe445c160303e649faa.png) Bu hata, 256kb (2048kbit) sınırı olan [net](https://gmod.tr/wiki/net) güvenilir arabelleğini taşırdığınızda istemci tarafında oluşturulur ve bir istemcinin veya tüm istemcilerin bağlantısının kesilmesine neden olur.
Bu hatayı düzeltmek için, gönderdiğiniz net mesajlarının miktarını veya boyutunu azaltmalısınız, böylece net arabelleğini taşırmazlar.
Net mesajlarını küçük bir süreye yayabilirsiniz, böylece net arabelleğinin tüm net mesajlarını göndermek için yeterli zamanı olur.

Ayrıca, bir İstemciyi atmayacak güvenilmez net mesajları da gönderebilirsiniz, ancak bunun yerine arabelleğe sığmayan tüm güvenilmez net mesajlarını görmezden gelecektir.

### Örnek: net arabelleğini taşırma

İstemcinin atılmaması için güvenilmez net mesajları kullanırken güvenilir arabelleği taşırma.

```lua
local string = ""
for k = 1, 65532 do
	string = string .. "a"
end
util.AddNetworkString( "Example" )
for k = 1, 4 do
	net.Start( "Example", true )
		net.WriteString( string )
	net.Broadcast()
end
```

**Çıktı:** İstemciyi atmak yerine, tüm güvenilmez net mesajları alınmayacak ve geliştirici hatası:

```lua
Netchannel: failed reading message clc_GMod_ClientToServer from loopback.
```

oluşturulacaktır.

---

![realm](https://gmod.tr/api/uploads/wiki/c01de488cc91a14f7b05.png)

```lua
loopback:send reliable stream overflow
```

Bu Hata, istemci tarafındaki net güvenilir akışını taşırdığınızda gösterilir. Bu hata oluştuğunda istemci sunucuya herhangi bir net mesajı gönderemez ve bir süre sonra sunucu istemcinin zaman aşımına uğradığını düşündüğü için istemci atılır.
Bunu düzeltmek için, sunucuya göndermek istediğiniz net mesajlarının miktarını azaltın ve bunları küçük bir süreye yayın, böylece akışın her şeyi göndermek için yeterli zamanı olur.

---

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
[Addon] Warning! A net message ([name]) is already started! Discarding in favor of the new message! (function origin of the net message)
```

Bu hata, önceki bir net mesajında bir hata oluştuğunda [net](https://gmod.tr/wiki/net) kütüphanesi tarafından oluşturulur. Bu, ondan önceki net mesajında oluşturulan hatayı düzelterek giderilebilir.

---

![realm](https://gmod.tr/api/uploads/wiki/c01de488cc91a14f7b05.png)

```lua
Netchannel: failed reading message svc_GMod_ServerToClient from loopback.
```

Bu Uyarı, `developer` ConVar'ını 1 veya daha yükseğe ayarladığınızda ve güvenilmez bir net mesajı alındığında ve net arabelleğine sığmadığında gösterilir. Bu, gönderilen net mesajlarının miktarını azaltarak ve bunları küçük bir süreye yayarak düzeltilebilir.

---

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
Netchannel: failed reading message clc_GMod_ClientToServer from loopback.
```

Bu Uyarı, `developer` ConVar'ını 1 veya daha yükseğe ayarladığınızda ve güvenilmez bir net mesajı alındığında ve net arabelleğine sığmadığında gösterilir. Bu, gönderilen net mesajlarının miktarını azaltarak ve bunları küçük bir süreye yayarak düzeltilebilir.

---

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
Warning! Trying to net.Broadcast a message '[name]' with no players on server!
```

Bu Uyarı, `developer` ConVar'ını 1 veya daha yükseğe ayarladığınızda ve sunucu boşken bir net mesajı yayınlamaya çalıştığınızda gösterilir. Bu Uyarı hiçbir şeyi etkilemeyeceği için tamamen göz ardı edilebilir.

---

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
AUTOREFRESH: Not adding [file here] to datatable, its too large! ([file size] vs 65536)
Refusing to send autorefreshed Lua file [file here], its too large! ([file size] vs 65536 max)
```

Bu Hata, 65536'dan fazla karakter içeren bir dosyayı Otomatik Yenilemeye çalıştığınızda ve bir miktar sıkıştırmadan sonra bile hala 65536 bayttan büyük olduğunda oluşturulur. Bu hatayı çözmek için Dosyanızın boyutunu küçültmeniz gerekir.

---

### NW hataları

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
DLL_MessageEnd:  Refusing to send user message NetworkedVar of 256 bytes to client, user message size limit is 255 bytes
```

Bu Hata, anahtar ve değerin toplam uzunluğunun 255 bayttan büyük olduğu bir [NWString](https://gmod.tr/wiki/Entity:SetNWString)'i ağa aktarmaya çalıştığınızda oluşturulur.
Bu Hata, o andan itibaren her 10 saniyede bir meydana gelir, çünkü NW Sistemi tüm NW Değişkenlerini her 10 saniyede bir yeniden ağa aktarır.
Bu hatayı düzeltmek için, NWVar adınızın boyutunu azaltmalısınız.

---

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
Too many NWVar names, could not add name [key]
```

Bu hata, şu anda 4095 yuvada olan NWVar sınırını aştığınızda oluşturulur. Bu hatayı çözmek için NWVar miktarını azaltın veya [net](https://gmod.tr/wiki/net) kütüphanesini kullanmayı düşünün.

---

### NW2 hataları

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
Host_Error: SV_PackEntity: SendTable_Encode returned false (ent 1).
```

Bu hata, aynı anda çok fazla NW2Var'ı ağa aktarmaya çalıştığınızda oluşturulur. Bu hata oluştuğunda, sunucuyu kapatır ve gmod'u yeniden başlatmadan yeni bir oyun başlatmaya çalıştığınızda oyununuz çöker.
Bu hatayı alırsanız, aynı anda ağa aktarmaya çalıştığınız NW2Vars miktarını azaltmalısınız

---

![realm](https://gmod.tr/api/uploads/wiki/c8e51ef9a540768ff6b3.png)

```lua
Warning:  Table networkstring is full, can't add [key]
```

Bu hata, şu anda 4095 yuvada olan NWVar sınırını aştığınızda oluşturulur. Bu hatayı çözmek için NWVar miktarını azaltın veya [net](https://gmod.tr/wiki/net) kütüphanesini veya SetNW* fonksiyonlarını kullanmayı düşünün.

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/Networking_Usage
