Gå til innhold

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


Anbefalte innlegg

  • 3 måneder senere...
Videoannonse
Annonse
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.

Lenke til kommentar
  • 2 uker senere...

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:

Lenke til kommentar

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;
};

Lenke til kommentar

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...