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:
> continue; // Some sleep here perhaps?
It would hang when the other side terminates a connection.
Ah, right. I've assumed that "send" returns "0" (as "recv" does in such case) without actually checking it. Guess I was wrong, thanks :)
Gratuluję ciekawego liba, prosto i porządnie.
Popraw to :P
Add a comment: