Gå til innhold

Alá winsock for linux? Kun Sockets? Eller ferdige?


Anbefalte innlegg

  • 3 måneder senere...
Videoannonse
Annonse
Skrevet
Hei!

 

Finnes det noen ferdige alá winsock headerfiler, eller må jeg jobbe mot sockets.h?

 

Takk.

8671087[/snapback]

 

Dårlig med svar her, men det er ikke så rart kanskje.

 

Du skriver ikke hva slags programmeringsspråk du ønsker å bruke, men jeg antar at du bruker C.

Winsock er i utgangspunktet et API som er designet for å ligne på den originale BSD socket implementasjonen (som Linux også ligner veldig på). Slik at eventuell winsock kode er svært enkel å migrere til Linux/Unix, men du må dra inn andre header filer.

 

Se man socket(2), og les NOTES seksjonen. Ellers finnes det drøssevis av exempler.

Skrevet

Man kan si at jeg har ventet lenge på svar?!

Hehe, takk til deg.

 

Akkurat nå drar jeg meg igjennom Sixth edition: How to program C++.

Håper den drar opp noe nettverksprogrammering, ellers har jo jeg nettet og man filene på linux å ty til ;)

Skrevet

Tviler på at en finner socket programmering in en C++ bok, men det finnes et par gode bøker der ute. Best kjent er vel Stevens' "UNIX network programming (vol 1)". Denne går grundig til verks...

  • 2 uker senere...
Skrevet

Du kan f.eks bruke nettverksklassene som finnes i Trolltech's QT. Hvis du skal være hardcore, bruker du lowlevel kallene som socket, fcntl, read, write, send, recv, bind osv... Event. så kan du prøve å lage en socketklasse selv, som wrapper inn disse kallene. :)

Skrevet

Ja, men low-level er greit til noen ting.

Som å designe "knock-knock" tjeneste til servere, som åpner porter etter så mange forsøk. Eneste stedet hvor jeg har sett praktis nytte av low-level, også sniffing.

Ja, en wrapper hadde vært greit. Får se hva jeg får tid til, jeg bruker forsovidt nett altfor ofte til å ikke skrive en pen liten wrapper sak. Mulig implementere en helt enkel kryptering også. :hmm:

Skrevet

Her er en 5-minutters naiv socket klasse. Den støtter blokkerende tcp sockets for både IPv4 og IPv6.

Feilhåndtering finnes vel mer eller mindre ikke... vel den kaster exceptions :)

 

class Socket {

Socket(const char* host, uint16_t port, bool ipv6) : fd(-1)
{
 memset(&addr, 0, sizeof(addr));
 
 
 if (ipv6)
 {
 	struct sockaddr_in6* addr6 = (sockaddr_in6*) &addr;
 	addr_len = sizeof(struct sockaddr_in6);
 	addr6.sin6_family = AF_INET6;
 	inet_pton(AF_INET6, host, &addr6.sin6_addr);
 	addr6.sin6_port = htons(port);
 	fd = socket(PF_INET6, SOCK_STREAM, 0);
 }
 else
 {
 	struct sockaddr_in* addr4 = (sockaddr_in*) &addr;
 	addr_len = sizeof(struct sockaddr_in);
 	addr4.sin_family = AF_INET;
 	inet_pton(AF_INET, host, &addr4.sin_addr);
 	addr4.sin_port = htons(port);
 	fd = socket(PF_INET, SOCK_STREAM, 0);
 }

 if (fd == -1)
 	throw -1; /* error */
}

~Socket()
{
 disconnect();
}

void connect()
{
 int ret = ::connect(fd, &addr, addr_len);
 if (ret == -1)
 	throw -2; /* error connecting */
}


void disconnect()
{
 if (fd != -1)
 {
 	close(fd);
 }
}

ssize_t read(char* buffer, size_t max)
{
 ssize_t ret = recv(fd, buffer, max, 0);
 if (ret == -1)
 	throw -3; /* read error */

 return ret;
}

ssize_t write(const char* buffer, size_t max)
{
 ssize_t ret = send(fd, buffer, max, 0);
 if (ret == -1)
 	throw -4; /* write error */

 return ret;
}


private:
 int fd;
 struct sockaddr_storage addr;
 socklen_t addr_len;
};

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...