Beispiel #1
0
/*
signal occur must in recvfrom ,or it must be a dead cycle
*/
void dg_cli(FILE *fp,int sockfd,const SA *pservaddr,socklen_t servlen){
	int n;
	const in on = 1;
	char sendline[MAXLINE+1],recvline[MAXLINE+1];
	socklen_t len;
	struct sockaddr_in *preply_addr;
	preply_addr = malloc(sizeof(struct sockaddr_in));
	bzero(preply_addr);
	SetSockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
	Signal(SIGALAM,recvfrom_alarm);
	len = servlen;
	while(Fgets(sendline,MAXLINE,fp) != NULL){
		sendto(sockfd,sendline,strlen(sendline),0,pservaddr,len);
		alarm(5);
		for(;;){
			len=servlen;
			n = recvfrom(sockfd,recvlien,MAXLINE,0,preply_addr,&len);
			if(n < 0){
				if(errno == EINTR)
					break;
				else
					err_quit("recvfrom error!");
			}else{
				recvfrom[n] = 0;
				printf("from %s : %s",inet_ntop(preply_addr->sin_family,preply_addr->sin_addr.s_addr,preply_addr->sin_len),recvfrom);
			}
		}
	}
}
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
	int n;
	const int on=1;
	char sendline[MAXLINE],recvline[MAXLINE+1];
	socklen_t len;
	struct sockaddr *preply_addr;
	preply_addr=malloc(servlen);
	SetSockopt(sockopt, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
	Signal(SIGALRM, recvfrom_alarm);
	while(Fgets(sendline,MAXLINE,fp) != NULL)
	{
		SendTo(sockfd,sendline,strlen(sendline),0,pservaddr,servlen);
		alarm(5);
		for(; ;)
		{
			len=servlen;
			n=recvfrom(sockfd,recvline,MAXLINE,0,preply_addr,&len);
			if(n < 0)
			{
				if(errno==EINTR)
					break;
				else
					err_sys("error");
			}
			else
			{
				recvline[n]=0; /*null terminate*/
				printf("from %s: %s", Sock_ntop_host(preply_addr, len), recvline);
			}
		}
	}
	free(preply_addr);
}
int main(int meoww, char **pornn)
{
	int cat; /*size*/
	if(meoww == 2)
		ListenMeow = tcp_listen(NULL, pornn[1], NULL);
	else if(meoww == 3)
		ListenMeow = tcp_listen(pornn[1], pornn[2], NULL);
	else
		err_quit("tcpreceive [<host>] <port#>");
	cat = 4096;
	SetSockopt(ListenMeow, SOL_SOCKET, SO_RCVBUF, &cat, sizeof(cat));
	ConnectMeow = accept(ListenMeow, NULL, NULL);
	Signal(SIGURG, sig_urg);
	Fcntl(ConnectMeow, F_SETOWN, getpid());
	for(; ;)
		pause();
}