X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=network%2Fnetwork.c;h=c8022e59351b47ce8cb21c8c3b2e20102090345a;hb=195f89f8c46af637b38761cb0f7a76d58eaaaa05;hp=4cb539de8d0b9918476d5b41dae2d986cdca1d7d;hpb=ea939060d8c1df6b3de0b3204a0b5b06018ee8da;p=my-code%2Fapi.git diff --git a/network/network.c b/network/network.c index 4cb539d..c8022e5 100644 --- a/network/network.c +++ b/network/network.c @@ -6,16 +6,39 @@ #include "network.h" -int network_init(t_net *net) { - - struct sockaddr_in addr; - int true; - - fprintf(stderr,"[network] initializing network ...\n"); +int network_init(t_net *net,int outfd) { + + dprintf(net->outfd,"[network] initializing network api ...\n"); memset(net->connection,0,MAX_CONNECTIONS*sizeof(t_connection)); net->c_count=0; net->sendmask=0; + net->outfd=outfd; + + return N_SUCCESS; +} + +int network_set_timeout_chan(t_net *net,int chan,int read,int write) { + + struct timeval to; + socklen_t len; + + len=sizeof(struct timeval); + + to.tv_usec=0; + + to.tv_sec=read; + setsockopt(net->connection[chan].fd,SOL_SOCKET,SO_RCVTIMEO,&to,len); + to.tv_sec=write; + setsockopt(net->connection[chan].fd,SOL_SOCKET,SO_SNDTIMEO,&to,len); + + return N_SUCCESS; +} + +int network_listen(t_net *net) { + + struct sockaddr_in addr; + int true; if((net->l_fd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("[network] socket call"); @@ -35,7 +58,7 @@ int network_init(t_net *net) { perror("[network] setsockopt call"); return N_ERROR; } - fprintf(stderr,"[network] reused address\n"); + dprintf(net->outfd,"[network] reused address\n"); } if(listen(net->l_fd,MAX_LISTEN_QUEUE)==-1) { @@ -43,8 +66,8 @@ int network_init(t_net *net) { return N_ERROR; } - fprintf(stderr,"[network] listen on %s port %d\n",inet_ntoa(addr.sin_addr), - net->l_port); + dprintf(net->outfd,"[network] listen on %s port %d\n", + inet_ntoa(addr.sin_addr),net->l_port); return N_SUCCESS; } @@ -62,7 +85,7 @@ int network_shutdown(t_net *net) { return N_ERROR; } - fprintf(stderr,"[network] shutdown\n"); + dprintf(net->outfd,"[network] shutdown\n"); return N_SUCCESS; } @@ -88,7 +111,7 @@ int network_manage_connection(t_net *net) { perror("[network] close call"); return N_E_CLOSE; } - fprintf(stderr,"[network] connection %d closed\n",i); + dprintf(net->outfd,"[network] connection %d closed\n",i); net->connection[i].status=0; } @@ -119,9 +142,9 @@ int network_manage_connection(t_net *net) { return N_E_CONNECT; } - fprintf(stderr,"[network] established connection to "); - fprintf(stderr,"%s port %d on channel %d\n",net->connection[i].ip, - net->connection[i].port,i); + dprintf(net->outfd,"[network] established connection to "); + dprintf(net->outfd,"%s port %d on channel %d\n", + net->connection[i].ip,net->connection[i].port,i); net->connection[i].status|=C_ESTABL; } @@ -138,11 +161,13 @@ int network_manage_connection(t_net *net) { int network_connect(t_net *net,int channel) { if(net->connection[channel].status&C_IN_USE) { - fprintf(stderr,"[network] connect failed, channel %02d in use\n",channel); + dprintf(net->outfd,"[network] connect failed, channel %02d in use\n", + channel); return N_E_IN_USE; } if(!(net->connection[channel].status&C_INFO_A)) { - fprintf(stderr,"[network] connect failed, missing configuration for channel %02d\n",channel); + dprintf(net->outfd, + "[network] connect failed, missing config for chan %02d\n",channel); return N_E_NO_INFO; } @@ -154,7 +179,8 @@ int network_connect(t_net *net,int channel) { int network_close(t_net *net,int channel) { if(!(net->connection[channel].status&C_ESTABL)) { - fprintf(stderr,"[network] close failed, channel %02d not active\n",channel); + dprintf(net->outfd,"[network] close failed, channel %02d not active\n", + channel); return N_E_NC; } @@ -175,8 +201,8 @@ int network_close_all(t_net *net) { int network_set_connection_info(t_net *net,int channel,char *ip,int port) { if(net->connection[channel].status&C_IN_USE) { - fprintf(stderr,"[network] set connection failed, channel %02d in use\n", - channel); + dprintf(net->outfd, + "[network] set connection failed, channel %02d in use\n",channel); return N_E_IN_USE; } @@ -226,12 +252,15 @@ int network_manage_incoming(t_net *net) { strncpy(net->connection[channel].ip,inet_ntoa(addr.sin_addr),IP_DIGITS); net->connection[channel].port=ntohs(addr.sin_port); net->connection[channel].status=C_IN_USE|C_INFO_A|C_SOCKET|C_ESTABL; - fprintf(stderr,"[network] established connection from %s port %d on channel %d\n",net->connection[channel].ip,net->connection[channel].port,channel); + dprintf(net->outfd, + "[network] established connection from %s:%d, channel %d\n", + net->connection[channel].ip,net->connection[channel].port, + channel); return channel; } } - fprintf(stderr,"[network] maximum connections reached\n"); + dprintf(net->outfd,"[network] maximum connections reached\n"); return N_E_MAXC; } @@ -253,16 +282,32 @@ int network_send(int fd,unsigned char *data,int datasize) { return N_SUCCESS; } +int network_send_chan(t_net *net,int chan,unsigned char *data,int datasize) { + + return(network_send(net->connection[chan].fd,data,datasize)); +} + int network_receive(int fd,unsigned char *data,int datasize) { - int count; + int count,left; - if((count=read(fd,data,datasize))==-1) { - perror("[network] read call"); - return N_ERROR; + count=0; + left=datasize; + + while(left) { + if((count=read(fd,data,datasize))==-1) { + perror("[network] read call"); + return N_ERROR; + } + left-=count; } - return count; + return datasize; +} + +int network_receive_chan(t_net *net,int chan,unsigned char *data,int datasize) { + + return(network_receive(net->connection[chan].fd,data,datasize)); } int network_udp_listen_init(t_net *net) { @@ -287,10 +332,11 @@ int network_udp_listen_init(t_net *net) { perror("[network] setsockopt call (udp)"); return N_ERROR; } - fprintf(stderr,"[network] reused address (udp)\n"); + dprintf(net->outfd,"[network] reused address (udp)\n"); } - fprintf(stderr,"[network] listening on port %d (udp)\n",net->l_udp_port); + dprintf(net->outfd,"[network] listening on port %d (udp)\n", + net->l_udp_port); if((net->s_udp_fd=socket(AF_INET,SOCK_DGRAM,0))==-1) { perror("[network] socket call (udp-send)"); @@ -312,7 +358,7 @@ int network_udp_receive(t_net *net,int channel, unsigned char *data,int count) { } if(strncmp(net->connection[channel].ip,inet_ntoa(addr.sin_addr),IP_DIGITS)) { - fprintf(stderr,"[network] packet from unknown: %s\n", + dprintf(net->outfd,"[network] packet from unknown: %s\n", inet_ntoa(addr.sin_addr)); return N_UDP_WRONG_SENDER; }