...
authoralex <[email protected]>
Sun, 6 Mar 2022 23:07:51 +0000 (15:07 -0800)
committeralex <[email protected]>
Sun, 6 Mar 2022 23:07:51 +0000 (15:07 -0800)
inc/net.h
inc/peer.h
inc/session.h
src/net/handler.c
src/net/loop.c
src/peer/handshake.c

index c530d1d75dfd559fc55d55e4321dd96174485f80..bdc33a45cb6049aebef53cc77bb824fc0d937bbd 100644 (file)
--- a/inc/net.h
+++ b/inc/net.h
@@ -2,6 +2,7 @@
 #define __NET_H_
 
 #include<opt.h>
+#include<peer.h>
 
 #include<fcntl.h>
 #include<netdb.h>
@@ -34,7 +35,7 @@ struct net_info {
        hints.ai_next = NULL; \
 }
 
-void net_handler();
+void net_handler(int,int,struct peer*);
 int net_listen_sock();
 void net_loop();
 int net_setup(struct net_info*);
index 038e3aba8a53d3c46e2a46b11d002ebceec18274..98ef92990e3ff2456c99fd7af409dbfde1b4534d 100644 (file)
@@ -1,6 +1,14 @@
 #ifndef __PEER_H_
 #define __PEER_H_
 
+struct peer {
+       unsigned int choked : 1;
+       unsigned int interested: 1;
+
+       uint8_t infohash[20];
+       unsigned char peer_id[20];
+};
+
 enum peer_message {
        PEER_MESSAGE_CHOKE = 0,
        PEER_MESSAGE_UNCHOKE = 1,
@@ -17,6 +25,7 @@ enum peer_message {
        PEER_MESSAGE_HASH_REJECT = 23
 };
 
-int peer_handshake(int,const uint8_t*,size_t,const uint8_t*,size_t);
+int peer_handshake(int,struct peer*);
+int peer_init(struct peer**);
 
 #endif
index 8054421383d56315ae4c3505a59e771b4091ecab..ebc3066880d9b7e981d5c162a71e92d00ffa90c7 100644 (file)
@@ -14,6 +14,7 @@ struct session_torrents {
 
 struct session {
        struct session_torrents torrents;
+       unsigned char peer_id[20];
 };
 
 extern struct session session;
index ae16468c4c4e31b455c35feb7b382685bfc2c64f..e2fe32a8cd756abb7bd402ab011ff219dc122e86 100644 (file)
@@ -1,18 +1,32 @@
 #include<net.h>
 
-void net_handler(int sock) {
-       char buf[5];
+void net_handler(int epoll_fd, int sock, struct peer *peer_info) {
+       struct epoll_event ev;
+       unsigned char buf[4];
        ssize_t i;
        unsigned int len;
 
-       i = recv(sock,buf,5,MSG_PEEK);
+       if(NULL==peer_info) {
+               if(peer_init(&peer_info)<0) { goto close; }
+               if(peer_handshake(sock,peer_info)<0) { goto close; }
+               goto epoll;
+       }
+
+       i = recv(sock,buf,4,MSG_PEEK);
        if(-1==i) {
                if(!((errno==EAGAIN)||(errno==EWOULDBLOCK))) {
                        perror("recv");
                        return;
                }
+               goto epoll;
        }
 
+       /*
+        * message should at least have 4 bytes (length prefix of
+        * the following message)
+        */
+       if(i<4) { goto epoll; }
+
        len = 0;
        for(size_t i=0;i<4;i++) {
                len <<= 1;
@@ -53,4 +67,17 @@ void net_handler(int sock) {
        }
 
        return;
+close:
+       if(peer_info!=NULL) { peer_free(peer_info); }
+       close(sock);
+       return;
+epoll:
+       ev.events = EPOLLIN | EPOLLET;
+       ev.data.ptr = peer_info;
+       ev.data.fd = sock;
+
+       if(-1==epoll_ctl(epoll_fd,EPOLL_CTL_ADD,sock,&ev)) {
+               perror("epoll_ctl");
+               return;
+       }
 }
index 7d8221f2ab0a093a9b372e47bd336f1a78f78f00..ee45b5332f4ab7a055595c55f653b7f73900d608 100644 (file)
@@ -32,6 +32,7 @@ static void net_await_epoll_event(struct net_info *info) {
                        setnonblocking(conn_sock);
 
                        ev.events = EPOLLIN | EPOLLET;
+                       ev.data.ptr = NULL;
                        ev.data.fd = conn_sock;
 
                        if(-1==epoll_ctl(info->epoll_fd,EPOLL_CTL_ADD,conn_sock,&ev)) {
@@ -39,7 +40,7 @@ static void net_await_epoll_event(struct net_info *info) {
                                return;
                        }
                } else {
-                       net_handler(events[n].data.fd);
+                       net_handler(info->epoll_fd,events[n].data.fd,events[n].data.ptr);
                }
        }
 }
index 6325b6214b8bcb5e5527df6409d43d4e35d6408d..d19063fec8b78cdfdae3f959ca05c87bbbec3ffa 100644 (file)
@@ -3,9 +3,12 @@
 #define HANDSHAKE_STRING "\x13" "BitTorrent protocol\0\0\0\0\0\0\0\0";
 #define HANDSHAKE_INFOHASH_SIZE 20
 
-int peer_handshake(int sock, const uint8_t *infohash, size_t infohash_size const uint8_t *peer_id, size_t peer_id_size) {
+int peer_handshake(int sock, struct peer **info) {
+       ssize_t i;
        const char header[64] = HANDSHAKE_STRING;
 
+       
+
        assert(HANDSHAKE_INFOHASH_SIZE==infohash_size);
        assert(PEER_ID_SIZE==peer_id_size);