Esempio n. 1
0
// open socket and file, return 0 if there's an error with any of them
bool
NetDCC::dcc_send_start (c_char file)
{
    static char errorfile[] = "Error in DCC Send: can't open file.";
    static char errorbind[] = "Error in DCC Send: can't bind socket.";
    filename = file;
    dfd = fopen (filename, "r");
    if (dfd == NULL)
    {
        if (dcc_from_index == -1)
            s->irc_privmsg (nick, "%s", errorfile);
        else
            s->dccs[dcc_from_index]->dcc_chat_write (errorfile);
        return 0;
    }
    if (!bindsock (s->dcc_port))
    {
        fclose (dfd);
        dfd = NULL;
        if (dcc_from_index == -1)
            s->irc_privmsg (nick, "%s", errorbind);
        else
            s->dccs[dcc_from_index]->dcc_chat_write (errorbind);
        return 0;
    }
    socklocal = sock;
    filesize = lseek (fileno (dfd), 0, SEEK_END);
    fseek (dfd, 0, SEEK_SET);
    status = DCC_SEND_INIT;
    last_time = s->time_now;
    return 1;
}
Esempio n. 2
0
// open the socket, return 0 on error
bool
NetDCC::dcc_chat_start (void)
{
    if (!bindsock (s->dcc_port))
    {
        s->irc_privmsg (nick, "Error in DCC Chat: can't bind socket, try again later.");
        return 0;
    }
    socklocal = sock;
    status = DCC_CHAT_INIT;
    last_time = s->time_now;
    return 1;
}
Esempio n. 3
0
int main(int argc, char *argv[]) {
  char *port;                     	/* Port to host proxy at */
  struct sockaddr_in c_addr;      	/* From address of client */
  int sock;                       	/* Server listening socket */
  int connection;			/* Connection socket */
  unsigned int alen;			/* From address length */
  char remoteIP[INET6_ADDRSTRLEN];

  switch(argc) {
    case 2:
      port = argv[1];
      break;
    default:
      fprintf(stderr, "Usage: %s [port]\n", argv[0]);
      exit(1);
  }

  // Create and connect listening socket
  sock = bindsock(port, QLEN);

  while(1) {
      // Handle new connection
      alen = sizeof(c_addr);
      connection = accept(sock, (struct sockaddr *)&c_addr, &alen);
      if (connection < 0)
        errexit("accept: %s\n", strerror(errno));

      printf("New connection from %s on socket %d\n",
        inet_ntop(c_addr.sin_family,
          &(c_addr.sin_addr),
          remoteIP, INET6_ADDRSTRLEN),
        connection);

      // Start receiving data from connection
      if (!fork()) {
        close(sock);
        if (interpret(connection) == 0) {
	  printf("closing connection\n");
          close(connection);
	}
        exit(0);
      }
      close(connection);
    }
  }
Esempio n. 4
0
/*创建tcp服务*/
int cretcpser(const char *ip, const int port, const int backlog)
{
	int domain = AF_INET;//AF_INET6 目前没有使用IPV6
	int socktype = SOCK_STREAM;
	int protocol = 0;
	
	int sockid = sock(domain, socktype, protocol);
	if (sockid < 0)
	{
		debuginfo("cretcpser->socket failed");
		return -1;
	}

	int flags = 1;
	struct linger linger = {0, 0};
	setsocketopt(sockid, SOL_SOCKET, SO_KEEPALIVE, (void *)&flags, sizeof(flags));
	setsocketopt(sockid, SOL_SOCKET, SO_LINGER, (void *)&linger, sizeof(linger));
	setsocketopt(sockid, SOL_SOCKET, SO_REUSEADDR, (void *)&flags, sizeof(flags));
//	setsocketopt(sockid, IPPROTO_IP, TCP_NODELAY, (void *)&flags, sizeof(flags));
	
	struct sockaddr_in sockaddr;
	memset(&sockaddr, 0, sizeof(struct sockaddr_in));
	setsockaddrin(&sockaddr, domain, port, ip);
	if (bindsock(sockid, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr_in)) != 0)
	{
		debuginfo("cretcpser->bindsock failed %d", errno);
		closesock(sockid);
		return -1;
	}
	
	if (listensock(sockid, backlog) == -1)
	{
		debuginfo("cretcpser->listensock failed");
		closesock(sockid);
		return -1;
	}
	
	return sockid;
}
Esempio n. 5
0
void main(int argc,char *argv[])
{
	int port = 1235;
	fd_set read_fds,master_fds;
	int fdmax;
	int ssocket;
	struct sockaddr_in remoteaddr;

	//zeroing fds
	FD_ZERO(&read_fds);
	FD_ZERO(&master_fds);

	//getting socket
	ssocket = gettcpsock();
	fdmax = ssocket;
	//declaring server address
	struct sockaddr_in serveraddr;
	memset(&serveraddr,0,sizeof(serveraddr));
	serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(port);

	//binding the peer to address
	bindsock(ssocket,serveraddr);
	
	//adding listener 
	FD_SET(ssocket,&master_fds);

	//setting rtt and window size
	int window,rtt;
	printf("enter window size: ");
	scanf("%d",&window);
	printf("enter rtt: ");
	scanf("%d",&rtt);

	char str[30];
	printf("enter the file to be sent: ");
	scanf("%s",str);

	//open the file
	FILE *p;
	p = fopen(str,"r+");

	//packets and ackbuffer
	struct pack *datato;
	datato = malloc(100*sizeof(struct pack));
	struct pack *datafrom;
	datafrom = malloc(100*sizeof(struct pack));

	//make packets invalid
	makeinvalid(datato);
	makeinvalid(datafrom);

	//makepackets
	makepackets(datato,p);
	//print(datato);

	int sendbase = -1;
	int nextseq = 0;
	//litsening to port
	startlisten(ssocket,10);
	int res;

	int i;
	int sendsocket=-1;

	struct timeval tout;
	tout.tv_sec = 1;
	tout.tv_usec = 0;
	int z = 0;
	while(1)
	{
		read_fds = master_fds;
		//printf("was here\n");
		for(z=0;z<window*3;z++)
		{	
		if (select(fdmax+1, &read_fds, NULL, NULL, &tout) == -1) 
			errorrep("select");

		//printf("after select\n");

			for(i=0; i <= fdmax; i++)
			{
				//printf("checking socket %d\n",i);
				if(FD_ISSET(i,&read_fds))	
				{
					//printf("%d socket is set\n",i);
					if(i == ssocket)
					{
						//printf("incomming connection\n");
						struct sockaddr_in remote;
						int addrlen = sizeof(remote);
						int newfd = accept(ssocket,(struct sockaddr *)&remote,&addrlen);
						sendsocket = newfd;
						if(newfd < 0)
							errorrep("accept");
						else
						{
							FD_SET(newfd,&master_fds);
							if(newfd > fdmax)
							fdmax = newfd;
							printf("selectserver: new connection on socket %d\n",newfd);
						}
							
					}
					else
					{
						//printf("incomming packet\n");
						struct pack incomming;
						res = recv(i,&incomming,sizeof(incomming),0);
						if(res == 0)
						{
							printf("connection closed by socket: %d\n",i);
							FD_CLR(i,&master_fds);
						}
						if(res < 0)
							errorrep("reciving packet failed:");
						if(incomming.sno == -1)
							ackprocess(&incomming,datato,&sendbase);
						if(incomming.ackno == -1)
						{
							dataprocess(&incomming,datafrom);
							struct pack ackpacket;
							ackpacket.sno = -1;
							ackpacket.ackno = incomming.sno;
							printf("sending acknoledgement: %d",ackpacket.ackno);
							send(sendsocket,&ackpacket,sizeof(ackpacket),0);
						}	
								

					}
				}
			}
		}
			if(sendsocket != -1)
			{
				sendpacket(datato,&window,&sendbase,&nextseq,sendsocket);
				int ti = time(NULL);
				while((time(NULL)) < ti+rtt)
				{
					int a=0;
					a++; //does nothing
				}
				//print(datafrom);
			}

	}
	
	
}
Esempio n. 6
0
void main(int argc,char *argv[])
{
	if(argc != 2)
	errorrep("invalid number of arguments\n");
	
	//getting port number
	int port = atoi(argv[1]);

	fd_set master;
	fd_set read_fds;
	fd_set write_fds;
	int fdmax;
	int lispeer;
	int newpeer;
	struct sockaddr_in remoteaddr;

	//zeroing fds
	FD_ZERO(&master);
	FD_ZERO(&read_fds);

	//getting socket
	lispeer = gettcpsock();

	//declaring server address
	struct sockaddr_in serveraddr;
	memset(&serveraddr,0,sizeof(serveraddr));
	serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(3300);
	
	//declaring server address
	struct sockaddr_in peeraddr;
	memset(&peeraddr,0,sizeof(peeraddr));
	peeraddr.sin_addr.s_addr = INADDR_ANY;
	peeraddr.sin_family = AF_INET;
	peeraddr.sin_port = htons(port);

	//binding the peer to address
	bindsock(lispeer,peeraddr);
	
	//adding listener 
	FD_SET(lispeer,&master);
	FD_SET(lispeer,&read_fds);

	//litsening to port
	startlisten(lispeer,10);
	
	//register with the dir server
	char filename[10];
	printf("enter names of files with the peer with spaces:");
	scanf("%[^\n]s",&filename[0]);
	fdmax = lispeer;
	int dserv = gettcpsock();
	if(fdmax < dserv)
	fdmax = dserv;
	int res = connect(dserv,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
	if(res < 0 )
	errorrep("connect");
	struct packlist list[50];
/*	*(buf+0) = '1';
	*(buf+1) = ' ';
	*(buf+2) = '\0';
	strcat(buf,argv[1]);
	strcat(buf,&username[1]);*/
	struct pack reg;
	reg.type = 1;
	reg.prt = port;
	strcpy(reg.filenames,&filename[0]);
	int pcklen = sizeof(struct pack);
	send(dserv,&reg,pcklen,0);
	struct sockaddr_in filepeer,remote;
	FILE *put;
	while(1)
	{
		char name[10];
		printf("enter file to be downloaded:");
		scanf("%s",&name[0]);

		struct pack req;
		req.type=2;
		req.prt = 0;
		strcpy(req.filenames,name);
		res = send(dserv,&req,sizeof(struct pack),0);
		if(res < 0)
		perror("req message failed to be sent");

		int fileport;
		res = recv(dserv,&fileport,sizeof(fileport),0);
		if(res < 0)
		perror("server failed to send the list");
		printf("received %d as the fileport\n",fileport);
		printf("do you want to get the file 1-yes 0-no\n");
		int answer;
		scanf("%d",&answer);
		if(answer)
		{
			int getfile = gettcpsock();
			memset(&filepeer,0,sizeof(filepeer));
			filepeer.sin_addr.s_addr = inet_addr("127.0.0.1");
			filepeer.sin_family = AF_INET;
			filepeer.sin_port = htons(fileport);

			res = connect(getfile,(struct sockaddr *)&filepeer,sizeof(filepeer));
			if(res < 0)
			errorrep("connection to getfile failed");

			if(fdmax < getfile)
			fdmax = getfile;
			FD_SET(getfile,&read_fds);


			res = send(getfile,&req,sizeof(struct pack),0);
			if(res < 0)
			errorrep("send file req");


			if (select(fdmax+1, &read_fds, &write_fds, NULL, NULL) == -1) 
			{
	         	   perror("select");
	          	   exit(4);
	        	}
			FILE *get;
			get = fopen(&name[0],"w+");
			int i;
			for(;;)
			{
			for(i=0; i<=fdmax; i++)
			{
				if(FD_ISSET(i,&read_fds))	
				{
					if(i == lispeer)
					{
						int addrlen = sizeof remote;
						int newfd = accept(lispeer,(struct sockaddr *)&remote,&addrlen);
						if(newfd < 0)
						errorrep("accept");
						else
						{
							FD_SET(newfd,&write_fds);
							if(newfd > fdmax)
							fdmax = newfd;
							printf("selectserver: new connection on socket %d\n",newfd);
							struct pack filereq;
							int res = recv(newfd,&filereq,sizeof(filereq),0);
							if(res < 0)
							errorrep("here\n");
							put = fopen(filereq.filenames,"r+");
						}
						
					}
					else
					{
						char buf[256];
						res = recv(i,buf,sizeof(buf),0);
						if(res == 0)
						printf("connection closed by socket %d\n",i);
						if(res < 0)
						{
							errorrep("recv");
							FD_CLR(i,&master);
							close(i);
						}
						printf("getting: %s\n",buf);
						fprintf(get,"%s",buf);
						//free(buf);
					}
				if(FD_ISSET(i,&write_fds))
					{
						char buf[256];
						int nu = fscanf(put,"%[^\n]s",&buf[0]);
						if(nu < 0)
						shutdown(i,2);
						else
						printf("sending: %s\n",buf);
						res = send(i,buf,sizeof(buf),0);
						//free(buf);
					}
				}
			}
			
			}			
			
		}
	}
	
}
Esempio n. 7
0
void ftp_clean(int send, char *buf, unsigned long *bytes, int ftpsrv)
{

      char *port_start;
      int rporthi, lporthi;
      int lportlo, rportlo;
      int lport, rport;
      int remip[4];
      int localsock;
      int socksize = sizeof(struct sockaddr_in);

      struct sockaddr_in newsession;
      struct sockaddr_in sockname;

      if (ftpsrv == 0)
      {
            /* is this a port commando ? */
            if(strncmp(buf, "PORT", 4)) {
                  redir_write(send, buf, (*bytes), REDIR_OUT);
                  return;
            }
            /* parse the old address out of the buffer */
            port_start = strchr(buf, ' ');

            sscanf(port_start, " %d,%d,%d,%d,%d,%d", &remip[0], &remip[1],
                   &remip[2], &remip[3], &rporthi, &rportlo);
      } else {
            /* is this a passive mode return ? */
            if(strncmp(buf, "227", 3)) {
                  redir_write(send, buf, (*bytes), REDIR_OUT);
                  return;
            }
            
            /* parse the old address out of the buffer */
            port_start = strchr(buf, '(');
            
            sscanf(port_start, "(%d,%d,%d,%d,%d,%d", &remip[0], &remip[1],
                   &remip[2], &remip[3], &rporthi, &rportlo);
      }
    
      /* get the outside interface so we can listen */
      if(getsockname(send, (struct sockaddr *)&sockname, &socksize) != 0) {
            perror("getsockname");
            exit(1);
      }

      rport = (rporthi << 8) | rportlo;

      /* we need to listen on a port for the incoming connection.
         we will use the port 0, so let the system pick one. */

      localsock = bindsock(inet_ntoa(sockname.sin_addr), 0, 1);

      
      /* get the real info */
      if(getsockname(localsock, (struct sockaddr *)&sockname, &socksize) < 0) {
            perror("getsockname");
            if (dosyslog)
                  syslog(LOG_ERR, "getsockname failed: %m");
            exit(1);
      }

      lport = ntohs(sockname.sin_port);

      lporthi=(lport >> 8 ) & 0xff;
      lportlo=lport & 0xff;

      /* check to see if we bound */
      if(localsock == -1) {
            fprintf(stderr, "ftp: unable to bind new listening address\n");
            exit(1);
      }
      if (ftpsrv == 0) {
            /* send the new port and ipaddress to the server */
            (*bytes) = sprintf(buf, "PORT %d,%d,%d,%d,%d,%d\n",
                           sockname.sin_addr.s_addr & 0xff, 
                           (sockname.sin_addr.s_addr >> 8) & 0xff, 
                           (sockname.sin_addr.s_addr >> 16) & 0xff,
                           sockname.sin_addr.s_addr >> 24, lporthi, lportlo);
      } else {
Esempio n. 8
0
void main(int argc,char *argv[])
{
	/*if(argc != 2)
	errorrep("invalid number of arguments\n");
	
	//getting port number
	int port = atoi(argv[1]);*/

	fd_set master;
	fd_set read_fds;
	fd_set write_fds;
	int fdmax;
	int lispeer,p2,p3,p4;
	int newpeer;
	struct sockaddr_in remoteaddr;

	//zeroing fds
	FD_ZERO(&master);
	FD_ZERO(&read_fds);
	FD_ZERO(&write_fds);

	//getting socket
	lispeer = gettcpsock();
	p2 = gettcpsock();
	p3 = gettcpsock();
	p4 = gettcpsock();
	

	//declaring peer2 address
	struct sockaddr_in serveraddr;
	memset(&serveraddr,0,sizeof(serveraddr));
	serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(3301);
	
	//declaring peer3 address
	struct sockaddr_in paddr;
	memset(&paddr,0,sizeof(serveraddr));
	paddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	paddr.sin_family = AF_INET;
	paddr.sin_port = htons(3302);
	
	//decalring peer4 address
	struct sockaddr_in peaddr;
	memset(&peaddr,0,sizeof(serveraddr));
	peaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	peaddr.sin_family = AF_INET;
	peaddr.sin_port = htons(3303);
	
	//declaring server address
	struct sockaddr_in peeraddr;
	memset(&peeraddr,0,sizeof(peeraddr));
	peeraddr.sin_addr.s_addr = INADDR_ANY;
	peeraddr.sin_family = AF_INET;
	peeraddr.sin_port = htons(3300);

	//binding the peer to address
	bindsock(lispeer,peeraddr);
	
	//adding listener 
	FD_SET(lispeer,&master);
	FD_SET(lispeer,&read_fds);
	FD_SET(p2,&write_fds);
	FD_SET(p3,&write_fds);	
	FD_SET(p4,&write_fds);


	//litsening to port
	startlisten(lispeer,10);
	
	fdmax = lispeer;
	if(fdmax < p2)
		fdmax = p2;
	if(fdmax < p3)
		fdmax = p3;
	if(fdmax < p4)
		fdmax = p4;
	
/*	//register with the dir server
	char filename[10];
	printf("enter names of files with the peer with spaces:");
	scanf("%[^\n]s",&filename[0]);
	fdmax = lispeer;
	int dserv = gettcpsock();
	if(fdmax < dserv)
	fdmax = dserv;
	int res = connect(dserv,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
	if(res < 0 )
	errorrep("connect");
	struct packlist list[50];
/*	*(buf+0) = '1';
	*(buf+1) = ' ';
	*(buf+2) = '\0';
	strcat(buf,argv[1]);
	strcat(buf,&username[1]);*/
/*	struct pack reg;
	reg.type = 1;
	reg.prt = port;
	strcpy(reg.filenames,&filename[0]);
	int pcklen = sizeof(struct pack);
	send(dserv,&reg,pcklen,0);
	struct sockaddr_in filepeer,remote;
	FILE *put;*/
//	connect(p2,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
//	connect(p3,(struct sockaddr *)&paddr,sizeof(paddr));
//	connect(p4,(struct sockaddr *)&peaddr,sizeof(peaddr));
	int i;
	FILE *fp;
	fp = fopen("peer1","r+");
	char *buffer;
	int connections = 0;
	int newfd;
	for(;;)
	{
		FILE *p;
		p = fopen("rcv1","r+");
		if (select(fdmax+1, &read_fds,NULL, NULL,NULL) == -1) 
		{
         	   perror("select");
          	   exit(4);
        	}
		for(i=0;i<=fdmax;i++)
		{
			if(FD_ISSET(i,&read_fds))
			{
				if(i == lispeer)
				{
					int addrlen = sizeof remoteaddr;
					newfd = accept(lispeer,(struct sockaddr *)&remoteaddr,&addrlen);
					if(newfd < 0)
					errorrep("accept");
					else
					{
						printf("some one knocking connections\n");
						FD_SET(newfd,&read_fds);
						if(newfd > fdmax)
						fdmax = newfd;
						printf("selectserver: new connection on socket %d\n",newfd);
						if(connections == 0)
							connect(p2,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
						else
							if(connections == 1)
							connect(p3,(struct sockaddr *)&paddr,sizeof(paddr));
							else
								if(connections == 2)
									connect(p4,(struct sockaddr *)&peaddr,sizeof(peaddr));
						connections++;
						printf("connection number %d\n",connections);
					}
					
				}
				else
				{
					printf("in else\n");
					int nbytes;
					buffer = malloc(4*sizeof(char));
					if((nbytes = recv(i,buffer,4*sizeof(char),0)) <= 0)
						{
							if(nbytes == 0)
							printf("connection closed by socket %d\n",i);
							else
							errorrep("recv");
							FD_CLR(i,&read_fds);
							close(i);
						}
					else
						{
							printf("recived %d bytes\n",nbytes);
							//fread(buffer,sizeof(char),4,p);
							fseek(p,0,SEEK_END);
							int j;
							for(j=0;j<4;j++)
							fprintf(p,"%c",*(buffer+j));
							free(buffer);
						}
					
					int k;
					if(connections == 3)
					{
						buffer = malloc(4*sizeof(char));
						fread(buffer,sizeof(char),4,fp);
						/*for(k=0;k<=fdmax;k++)
						{
							if(FD_ISSET(k,&write_fds))
							{
								int sbytes = send(k,buffer,4*sizeof(char),0);
								printf("sent %d to %d",sbytes,k);
							}
					
						}*/
						send(p2,buffer,4,0);
						send(p3,buffer,4,0);
						send(p4,buffer,4,0);
					}
				}
			}
				
			
		}
		fclose(p);
	}
	/*while(1)
	{
		char name[10];
		printf("enter file to be downloaded:");
		scanf("%s",&name[0]);

		struct pack req;
		req.type=2;
		req.prt = 0;
		strcpy(req.filenames,name);
		res = send(dserv,&req,sizeof(struct pack),0);
		if(res < 0)
		perror("req message failed to be sent");

		int fileport;
		res = recv(dserv,&fileport,sizeof(fileport),0);
		if(res < 0)
		perror("server failed to send the list");
		printf("received %d as the fileport\n",fileport);
		printf("do you want to get the file 1-yes 0-no\n");
		int answer;
		scanf("%d",&answer);
		if(answer)
		{
			int getfile = gettcpsock();
			memset(&filepeer,0,sizeof(filepeer));
			filepeer.sin_addr.s_addr = inet_addr("127.0.0.1");
			filepeer.sin_family = AF_INET;
			filepeer.sin_port = htons(fileport);

			res = connect(getfile,(struct sockaddr *)&filepeer,sizeof(filepeer));
			if(res < 0)
			errorrep("connection to getfile failed");

			if(fdmax < getfile)
			fdmax = getfile;
			FD_SET(getfile,&read_fds);


			res = send(getfile,&req,sizeof(struct pack),0);
			if(res < 0)
			errorrep("send file req");


			if (select(fdmax+1, &read_fds, &write_fds, NULL, NULL) == -1) 
			{
	         	   perror("select");
	          	   exit(4);
	        	}
			FILE *get;
			get = fopen(&name[0],"w+");
			int i;
			for(;;)
			{
			for(i=0; i<=fdmax; i++)
			{
				if(FD_ISSET(i,&read_fds))	
				{
					if(i == lispeer)
					{
						int addrlen = sizeof remote;
						int newfd = accept(lispeer,(struct sockaddr *)&remote,&addrlen);
						if(newfd < 0)
						errorrep("accept");
						else
						{
							FD_SET(newfd,&write_fds);
							if(newfd > fdmax)
							fdmax = newfd;
							printf("selectserver: new connection on socket %d\n",newfd);
							struct pack filereq;
							int res = recv(newfd,&filereq,sizeof(filereq),0);
							if(res < 0)
							errorrep("here\n");
							put = fopen(filereq.filenames,"r+");
						}
						
					}
					else
					{
						char buf[256];
						res = recv(i,buf,sizeof(buf),0);
						if(res == 0)
						printf("connection closed by socket %d\n",i);
						if(res < 0)
						{
							errorrep("recv");
							FD_CLR(i,&master);
							close(i);
						}
						printf("getting: %s\n",buf);
						fprintf(get,"%s",buf);
						//free(buf);
					}
				if(FD_ISSET(i,&write_fds))
					{
						char buf[256];
						int nu = fscanf(put,"%[^\n]s",&buf[0]);
						if(nu < 0)
						shutdown(i,2);
						else
						printf("sending: %s\n",buf);
						res = send(i,buf,sizeof(buf),0);
						//free(buf);
					}
				}
			}
			
			}			
			
		}
	}*/
	
}
Esempio n. 9
0
void main()
{
	fd_set master;
	fd_set read_fds;
	int fdmax;
	int listener;
	int newfd;
	char *buf;
	buf = malloc(256*sizeof(char));
	struct sockaddr_in remoteaddr;
	
	//zeroing fds
	FD_ZERO(&master);
	FD_ZERO(&read_fds);
	
	//getting socket
	listener = gettcpsock();

	//declaring server address
	struct sockaddr_in serveraddr;
	memset(&serveraddr,0,sizeof(serveraddr));
	serveraddr.sin_addr.s_addr = INADDR_ANY;
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(3300);
	
	//binding the server to address
	bindsock(listener,serveraddr);
	
	//adding listener to serv
	FD_SET(listener,&master);
	//litsening to the port
	startlisten(listener,10);
	
	fdmax = listener;
	
	int addrlen;
	
	FILE *p;
	p = fopen("peer","r+");
	if(p == NULL)
	errorrep("fopen");
	
	for(;;)
	{
		read_fds = master;
		if (select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1) 
		{
         	   perror("select");
          	   exit(4);
        	}
		int i;
		for(i=0; i<=fdmax; i++)
		{
			if(FD_ISSET(i,&read_fds))
			{
				if(i == listener)
				{
					addrlen = sizeof remoteaddr;
					newfd = accept(listener,(struct sockaddr *)&remoteaddr,&addrlen);
					if(newfd < 0)
					errorrep("accept");
					else
					{
						FD_SET(newfd,&master);
						if(newfd > fdmax)
						fdmax = newfd;
						printf("selectserver: new connection on socket %d\n",newfd);
					}
					
				}
				else
				{
					int nbytes;
					if((nbytes = recv(i,buf,sizeof buf,0)) <= 0)
						{
							if(nbytes == 0)
							printf("connection closed by socket %d\n",i);
							else
							errorrep("recv");
							FD_CLR(i,&master);
							close(i);
						}
					else
						{
							if(buf[0] == '1')
							fprintf(p,"%s",buf+2);
							if(buf[0] == '2')
							{
								printf("request for filename %s",(buf+2));
							}
						}
				}
			}
		}
		
	}
	
	
}
Esempio n. 10
0
int main(int argc, char **argv)
{
	unsigned char pkt[MAXACARSLEN];
	char *basename = "acarsserv.sqb";
	char *bindaddr = "[::]";
	int c;
	int res;

	while ((c = getopt(argc, argv, "vb:N:asd")) != EOF) {

		switch (c) {
		case 'v':
			verbose = 1;
			break;
		case 'N':
			bindaddr = optarg;
			break;
		case 'b':
			basename = optarg;
			break;
		case 'a':
			allmess = 1;
			break;
		case 's':
			station = 1;
			break;
		case 'd':
			dupmess = 1;
			break;
		default:
			usage();
			exit(1);
		}
	}

	if (bindsock(bindaddr)) {
		fprintf(stderr, "failed to connect\n");
		exit(1);
	}

	if (initdb(basename)) {
		fprintf(stderr, "could not init sql base %s\n", basename);
		exit(1);
	}

	do {
		int len;
		acarsmsg_t *msg;
		struct tm tmp;
		char reg[8];
		char ipaddr[INET6_ADDRSTRLEN];
		struct sockaddr_in6 src_addr;
		socklen_t addrlen;
		char *mpt, *bpt;

		msg = calloc(sizeof(acarsmsg_t), 1);

		addrlen = sizeof(src_addr);
		bzero(&src_addr, addrlen);
		len =
		    recvfrom(sockfd, pkt, MAXACARSLEN, 0,
			     (struct sockaddr *)&src_addr, &addrlen);
		if (len <= 0) {
			fprintf(stderr, "read %d\n", len);
			continue;
		}

		if (len < 31) {
			continue;
		}
		pkt[len] = 0;

		mpt = pkt;
		bpt = mpt + 8;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		strcpy(msg->idst, mpt);
		mpt = bpt + 1;
		bpt = mpt + 1;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		msg->chn = atoi(mpt);
		mpt = bpt + 1;
		bpt = mpt + 2;
		if (*bpt != '/')
			continue;
		*bpt = '\0';
		tmp.tm_mday = atoi(mpt);
		mpt = bpt + 1;
		bpt = mpt + 2;
		if (*bpt != '/')
			continue;
		*bpt = '\0';
		tmp.tm_mon = atoi(mpt);
		mpt = bpt + 1;
		bpt = mpt + 4;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		tmp.tm_year = atoi(mpt);
		mpt = bpt + 1;
		bpt = mpt + 2;
		if (*bpt != ':')
			continue;
		*bpt = '\0';
		tmp.tm_hour = atoi(mpt);
		mpt = bpt + 1;
		bpt = mpt + 2;
		if (*bpt != ':')
			continue;
		*bpt = '\0';
		tmp.tm_min = atoi(mpt);
		mpt = bpt + 1;
		bpt = mpt + 2;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		tmp.tm_sec = atoi(mpt);
		mpt = bpt + 1;
		bpt = mpt + 1;
		if (*bpt != ' ')
			continue;
		msg->err = atoi(mpt);
		mpt = bpt + 1;
		bpt = mpt + 3;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		msg->lvl = atoi(mpt);
		mpt = bpt + 1;
		bpt = mpt + 1;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		msg->mode = *mpt;
		mpt = bpt + 1;
		bpt = mpt + 7;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		strcpy(reg, mpt);
		mpt = bpt + 1;
		bpt = mpt + 1;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		msg->ack = *mpt;
		mpt = bpt + 1;
		bpt = mpt + 2;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		strcpy(msg->label, mpt);
		mpt = bpt + 1;
		bpt = mpt + 1;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		msg->bid = *mpt;
		mpt = bpt + 1;
		bpt = mpt + 4;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		strcpy(msg->no, mpt);
		mpt = bpt + 1;
		bpt = mpt + 6;
		if (*bpt != ' ')
			continue;
		*bpt = '\0';
		strcpy(msg->fid, mpt);
		mpt = bpt + 1;
		strncpy(msg->txt, mpt, 220);
		msg->txt[220] = '\0';


		fixreg(msg->reg, reg);

		tmp.tm_isdst = 0;
		tmp.tm_mon -= 1;
		tmp.tm_year -= 1900;
		msg->tm = timegm(&tmp);

		get_ip_str((struct sockaddr *)&src_addr, ipaddr,
			   INET6_ADDRSTRLEN);

		if (verbose)
			fprintf(stdout,
				"MSG %s %1d %1c %7s %1c %2s %1c %4s %6s %s\n",
				ipaddr, msg->chn, msg->mode, msg->reg, msg->ack,
				msg->label, msg->bid, msg->no, msg->fid,
				msg->txt);

		processpkt(msg, ipaddr);

		free(msg);
	} while (1);
}