[C++] Komunikacja sieciowa

0

Witajcie!

Chciałem w przyszłości zrobić sobie jakąś sieciową gierkę, ale wiadomo, że nie od razu Kraków zbudowano, więc na początek zacznę choćby od przesyłania wiadomości. Jakie biblioteki, funkcje i teorię potrzebuję znać, żeby zrobić programik, który:

  • przyjmowałby adres IP i port i łączył się z nim
  • przesyłał wiadomości tekstowe

Ewentualnie jeszcze przesyłanie obrazków. Jak się do tego krok po kroku zabrać?

Z góry dzięki za odpowiedź
Freewolny

0

SOCKET'y, a poza tym szukanie nie boli

0

Zreszta masz przyklad kodu, ktory przed chwila napisalem do wysylania pakietow arp, z wysylaniem normalnych danych jest podobnie, ale innych struktur uzywasz wtedy i jest prosciej.

#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/if.h>
#include <linux/if_arp.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <net/ethernet.h>
#include <arpa/inet.h>

#define DST_MAC "bb:bb:bb:bb:bb:bb"
#define SRC_MAC "aa:aa:aa:aa:aa:aa"
#define DST_IP "111.111.11.11"
#define SRC_IP "221.122.21.22"

// w /usr/include/linux/if_arp.h masz ta strukture, ale zmienilem jedna rzecz dlatego jest tutaj ;)
struct arphdr_t
{
        __be16          ar_hrd;         /* format of hardware address   */
        __be16          ar_pro;         /* format of protocol address   */
        unsigned char   ar_hln;         /* length of hardware address   */
        unsigned char   ar_pln;         /* length of protocol address   */
        __be16          ar_op;          /* ARP opcode (command)         */

        unsigned char           ar_sha[ETH_ALEN];       /* sender hardware address      */
        unsigned char           ar_sip[4];              /* sender IP address            */
        unsigned char           ar_tha[ETH_ALEN];       /* target hardware address      */
        unsigned char           ar_tip[4];              /* target IP address            */
};


int main(void)
{
	int sock;
	BYTE buff[1024] = {0};
	struct ethhdr *eth = (struct ethhdr*)buff;
	struct arphdr_t *arp = (struct arphdr_t*)(buff+sizeof(struct ethhdr));
	struct ifreq ifr;
	struct sockaddr_ll sll;
	in_addr_t tmp;

	sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP));
	if(sock == -1)
	{
		perror("socket");
		return -1;
	}

	memcpy(&eth->h_dest, (void*)DST_MAC, 6);
	memcpy(&eth->h_source, (void*)SRC_MAC, 6);
	eth->h_proto = htons(ETHERTYPE_ARP);

	arp->ar_hrd = htons(ARPHRD_ETHER);
	arp->ar_pro = htons(ETHERTYPE_IP);
	arp->ar_hln = 6;
	arp->ar_pln = 4;
	arp->ar_op = htons(ARPOP_REPLY);
	memcpy(&arp->ar_sha, (void*)SRC_MAC, 6);
	tmp = inet_addr(SRC_IP);
	memcpy(&arp->ar_sip, &tmp, 4);
	memcpy(&arp->ar_tha, (void*)DST_MAC, 6);
	tmp = inet_addr(DST_IP);
	memcpy(&arp->ar_tip, &tmp, 4);

	strncpy((char*)ifr.ifr_name, "wlan0", IFNAMSIZ);
	if(ioctl(sock, SIOCGIFINDEX, &ifr) == -1)
	{
		perror("ioctl");
		return -1;
	}

	sll.sll_family = PF_PACKET;
	sll.sll_protocol = htons(ETH_P_ARP);
	sll.sll_ifindex = ifr.ifr_ifindex;

	if(sendto(sock, buff, sizeof(struct ethhdr)+sizeof(struct arphdr_t), 0, (struct sockaddr*)&sll, sizeof(sll)) == -1)
	{
		perror("sendto");
		return -1;
	}

	close(sock);

	return 0;
}
0

@t0m_k-tmp
dał żeś mu kod :)
Surowe sockety w ogóle nie potrzebne ale rozumiem, że to za lenistwo (i słusznie !).

0

Wziąłem się teraz za szukanie, ale nie mogę znaleźć żadnego polskiego łopatologicznego tutoriala o WinSock... Chodzi mi od całkowitego początku: co to, do czego tego używać i przez początkowe łączenie i badanie, czy połączenie się udało aż po wysyłanie danych... Macie coś takiego może w zanadrzu?

0

Z mojej strony mogę podać to:

http://rudy.mif.pg.gda.pl/~reichel/dyd/down.php?id=32

na dole jest literatura - w tym polskie ksiazki ale lepiej naucz sie jaezyka

0
reichel napisał(a)

@t0m_k-tmp
dał żeś mu kod :)
Surowe sockety w ogóle nie potrzebne ale rozumiem, że to za lenistwo (i słusznie !).

Po czesci dalem ten za lenistwo, a po czesci dlatego, ze w tym dziale znajdzie moj kod do wysylania zapytan http, inny do wysylania zapytan dns, a w dziale hardware/software kod do rozpoznawania stron ukrytych pod skroconymi linkami tiny.org(czy cos takiego), wiec wystarczy opcji szukaj uzyc.
Majac juz te kody zaczyna szukac znaczen funkcji, a zapewniam ze jest od ch**a polskich opisow, o angielski nie mowiac.
Ten od dns'ow jest w winsock, wiec spojrzec na ten i na drugi znaleziony za pomoca szukaj i juz zna podstawy socketow ;)

0
Freewolny napisał(a)

Wziąłem się teraz za szukanie, ale nie mogę znaleźć żadnego polskiego łopatologicznego tutoriala o WinSock...

może to się przyda:
http://www.gamedev.pl/articles.php?x=view&id=274

0

@t0m_k-tmp
chyba zle mnie zrozumiales nie chodzilo o twoje lenistwo a o lenistwo autora postow. Nie trzeba nawet wiedziec nic o socketach wystarczy wpisac: "c++ internet", "c++ pobieranie strony", .... i milion innych.
1h szukania i masz kurs, ksiazke, ...

0
reichel napisał(a)

@t0m_k-tmp chyba zle mnie zrozumiales nie chodzilo o twoje lenistwo a o lenistwo autora postow.

Dobrze Cie zrozumialem ;) Przeczytaj jeszcze raz mojego posta, napisalem tam, ze "dalem za lenistwo", a nie z lenistwa

0

Jeśli zaczynać programowanie sieciowe to imo "Beej's guide by network programming" jest pozycją obowiązkową.

@Autor: Gdybyś wiedział ile skilli potrzeba żeby zrobić gierkę sieciową nie wiem czy byłbyś taki wyrywny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1