• udp回射服务器


    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <errno.h>
    #include <string.h>
    
    const int maxline=4096;
    
    char * sock_ntop(const struct sockaddr *sa, socklen_t salen) {
    	char portstr[8];
    	static char str[128];
    	
    	switch(sa->sa_family) {
    	case AF_INET: {
    		struct sockaddr_in * sin = (struct sockaddr_in *) sa;
    		if(inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL) {
    			return NULL;
    		}
    		if(ntohs(sin->sin_port) != 0) {
    			snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));
    			strcat(str, portstr);
    		}
    		return str;
    	}
    	}
    }
    
    void dg_echo(int sockfd, struct sockaddr * pcliaddr, socklen_t clilen) {
    	int n;
    	socklen_t len;
    	char mesg[maxline], errbuff[maxline];
    
    	for(;;) {
    		len=clilen;
    		if((n=recvfrom(sockfd, mesg, maxline, 0, pcliaddr, &len))<0) {
    			strerror_r(errno, errbuff, maxline);
    			fprintf(stderr, "recvfrom error: %s\n", errbuff);
    			exit(-1);
    		}
    		printf("quest from %s\n", sock_ntop(pcliaddr, len));
    
    		if((n=sendto(sockfd, mesg, n, 0, pcliaddr, len))<0) {
    			strerror_r(errno, errbuff, maxline);
    			fprintf(stderr, "sendto error: %s\n", errbuff);
    			exit(-1);
    		}
    	}
    }
    
    int main(int argc, char **argv) {
    	int sockfd;
    	struct sockaddr_in servaddr, cliaddr;
    	char errbuff[maxline];
    
    	if((sockfd=socket(AF_INET, SOCK_DGRAM, 0))<0) {
    		strerror_r(errno, errbuff, maxline);
    		fprintf(stderr, "socket error: %s\n", errbuff);
    		exit(-1);
    	}
    	
    	memset(&servaddr, 0, sizeof(servaddr));
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    	servaddr.sin_port = htons(9999);
    
    	if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0) {
    		strerror_r(errno, errbuff, maxline);
    		fprintf(stderr, "bind error: %s\n", errbuff);
    		exit(-1);
    	}
    
    	dg_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
    	
    	return 0;
    }	
    

      

  • 相关阅读:
    BZOJ2456
    BZOJ2648
    POJ1639
    LOJ6003
    LOJ6002
    LOJ6001
    LOJ116
    POJ2594
    BZOJ4554
    JS事件 加载事件(onload)注意:1. 加载页面时,触发onload事件,事件写在<body>标签内。 2. 此节的加载页面,可理解为打开一个新页面时。
  • 原文地址:https://www.cnblogs.com/donggongdechen/p/16695716.html
Copyright © 2020-2023  润新知