NetSock to lib/wrapper ułatwiający obsługę socketów w C++, który stworzyłem 4 lata temu (albo 5, przyznaję, że nie pamiętam dokładnie) i update'uje od czasu do czasu. W sumie można było go ściągnąć z innymi moimi projektami (np. ostatnio opublikowanym PiXiEServ), ale nigdy nie miał swojej własnej oficjalnej premiery.

Update: Wrzuciłem poniżej wersję 2011.10.13 które naprawia błąd w funkcji WriteAll (thx . za wskazanie błędu; więcej w pliku CHANGELOG).

Download: NetSock-2011.10.13.zip (5kb, src C++)
Licencja: Apache License, Version 2.0 (open source)

Z biblioteki z powodzeniem korzystam pod Windowsem oraz GNU/Linux (być może działa również pod innymi; nie wiem, nie sprawdzałem).

Features:
- podstawowe wsparcie TCP (Connect, Listen, ListenAll, Accept, Read, Write, WriteAll, etc)
- podstawowe wsparcie UDP (WriteUDP, BroadcastUDP, ReadUDP, etc)
- wsparcie dla socketów asynchronicznych/non-blocking (SetMode, WriteAll)
- nie trzeba się "bawić" w inicjalizacje WinSock (InitNetworking), czy resolvovanie host name na IP

Natomiast NetSock nie nadaje się do programów które chcą korzystać z sieci w bardziej zaawansowany sposób (ustawianie innych opcji socketów, inne protokoły (IrDA), etc).

Nie planowałem również stworzyć uniwersalnego liba, tj. ficzery narastały raczej organicznie (tj. jak czegoś potrzebowałem, to to dopisywałem do liba), więc pewnych rzeczy może brakować (np. odpowiednika WriteAll do odczytu), a inne mogą być irytujące (np. typ "unsigned char *" w argumentach Write/WriteAll/Read/etc, ale to pewnie zmienię w przyszłej wersji).

Niemniej jednak może komuś się przyda :)

I na koniec przykładowy kod z użyciem NetSock:
// Windows  : g++ test.cpp NetSock.cpp -lws2_32
// GNU/Linux: g++ test.cpp
#include <stdio.h>
#include "NetSock.h"

int main() {
 NetSock::InitNetworking(); // Initialize WinSock
 
 NetSock s;
 int ret;
 unsigned char buffer[8] = {0};
 
 if (!s.Connect("127.0.0.1", 1333))
   return 1; // Some error handling.
 
 // Write some ASCII string.
 ret = s.Write((unsigned char*)"asdf", 4);
 if (ret != 4)
   return 2; // Some error handling.

 // Read some ASCII string.
 ret = s.Read(buffer, sizeof(buffer) - 1);
 if (ret <= 0)
   return 3; // Some error handling.

 // Write out the string.
 puts((char*)buffer);  
 
 s.Disconnect();
 
 return 0;
}

I tyle.

Comments:

2011-10-13 13:23:07 = .
{
> else if(ret == -1)
> continue; // Some sleep here perhaps?
It would hang when the other side terminates a connection.
}
2011-10-13 13:28:01 = Gynvael Coldwind
{
@.
Ah, right. I've assumed that "send" returns "0" (as "recv" does in such case) without actually checking it. Guess I was wrong, thanks :)
}
2011-10-15 20:42:44 = jep
{
Nie mam pojęcia dlaczego, ale przykładowy kod nie działa u mnie niestety najlepiej. Zwraca 1, więc jak łatwo wywnioskować nie może się połączyć z localhostem. Korzystam z Ubuntu 10.10.
Gratuluję ciekawego liba, prosto i porządnie.
}
2011-10-17 08:16:44 = Pafi
{
@jep: Wyręczę autora i odpowiem. Żeby zadziałał ci przykład, coś musi słuchać na localhoście na porcie 1333 ;-) Spróbuj na początek pobawić się poleceniem nc np. nc -l -p 1333. Pozdrawiam.
}
2011-10-17 19:50:57 = Assa
{
Czemu 1333, a nie 1337?
Popraw to :P
}
2016-10-30 11:33:22 = bartolinciu
{
W funkcji ListenAll() brakuje "this->socket=ret;" i funcja zawsze zwaca false
}

Add a comment:

Nick:
URL (optional):
Math captcha: 4 ∗ 3 + 7 =