• UNIX 网络编程学习


    a.述

    书买很久了,好好学习下.O(∩_∩)O  只写程序,原理什么的,先不写了. 

    b.环境

    deepin15.4.1 64位

    vs code

    gcc version 6.4.0 20170724 (Debian 6.4.0-2) 

    虚拟机里跑的 没在物理机安装



    1.2一个简单的时间获取程序

    /**
     * TCP_getDayTime.c
     * 安装时间服务
     * sudo apt-get install xinetd -y
     *
     * 修改yes 为 no
     * sudo vi /etc/xinetd.d/daytime
     *
     * 重启服务
     * /etc/init.d/xinetd restart
     * 服务是否正确
     * sudo apt-get install  netcat -y
     * nc 127.0.0.1 13
     * 
     * 
     * 编译 gcc TCP_getDayTime.c -o TCP_getDayTime
     * 运行 ./TCP_getDayTime 127.0.0.1
     * 
     */
    
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <errno.h>
    
    /*错误处理*/
    void err_exit(char * err){
    	printf("
    ---error at %s---- 
    ",err);
    	exit(errno);
    }
    
    
    int main(int argc, char ** argv) {
    	int sockfd, n;
    	char recvline[1024 + 1];
    	struct sockaddr_in servaddr;
    
    	if (argc < 2) {
    		err_exit("argc < 2");
    	}
    	
    	bzero(&servaddr, sizeof(servaddr));
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_port = htons(13);
    	if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) {
    		err_exit("inet_pton()");
    	}
    
    	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0) ) <0) {
    		err_exit("socket()");
    	}
    	
    	if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0) {
    		err_exit("connect()");
    	}
    
    	while ((n = read(sockfd, recvline, 1024)) > 0) {
    	
    		recvline[n]=0;/* 0=='0' */
    		if(fputs(recvline, stdout)==EOF){
    			err_exit("fputs()");
    		}
    		if(n<0){
    			err_exit("n<0");
    		}
    	}
    
    	return 0;
    }
    

    1.3协议无关性-ipv6版本

    /**
     * TCP_getDayTimeipv6.c
     * 未测试
     * ipv6版本
     */
    
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <errno.h>
    
    /*错误处理*/
    void err_exit(char * err){
    	printf("
    ---error at %s---- 
    ",err);
    	exit(errno);
    }
    
    
    int main(int argc, char ** argv) {
    	int sockfd, n;
    	char recvline[1024 + 1];
    	struct sockaddr_in6 servaddr;/**/
    
    	if (argc < 2) {
    		err_exit("argc < 2");
    	}
    	
    	bzero(&servaddr, sizeof(servaddr));
    	servaddr.sin6_family = AF_INET6;/**/
    	servaddr.sin6_port = htons(13);/**/
    	if (inet_pton(AF_INET6, argv[1], &servaddr.sin6_addr) <= 0) {/**/
    		err_exit("inet_pton()");
    	}
    
    	if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0) ) <0) {
    		err_exit("socket()");
    	}
    	
    	if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))<0) {
    		err_exit("connect()");
    	}
    
    	while ((n = read(sockfd, recvline, 1024)) > 0) {
    	
    		recvline[n]=0;/* 0=='0' */
    		if(fputs(recvline, stdout)==EOF){
    			err_exit("fputs()");
    		}
    		if(n<0){
    			err_exit("n<0");
    		}
    	}
    
    	return 0;
    }
    

    1.5一个简单的时间获取服务器程序

    /**
     * 
     * 注意端口不用使用1024以下的
     * 1024以下要用root运行 才能成功监听吧?
     * 
     */
    
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <errno.h>
    #include <time.h>
    
    /*错误处理*/
    void err_exit(char * err){
    	printf("
    ---error at %s---- 
    ",err);
    	exit(errno);
    }
    
    int main(){
        int listenfd,connfd;
        struct sockaddr_in servaddr;
        char buff[1024];
        time_t ticks;
    
        
    
        bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family=AF_INET;
        servaddr.sin_port=htons(5000);
        servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
        
        if((listenfd=socket(AF_INET, SOCK_STREAM,0))<0){
            err_exit("socket()");
        }
        if((bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)))<0){
            err_exit("bind()");
        }
    
        if(listen(listenfd, 5) <0){
            err_exit("listen()");
        }
    
        for(; ;)
        {
            if((connfd=accept(listenfd, (struct sockaddr *)NULL, NULL))<0){
                err_exit("accept()");
            }
    
            ticks=time(NULL);
            snprintf(buff, sizeof(buff), "%.24s
    ", ctime(&ticks));
            write(connfd, buff, strlen(buff));
    
            close(connfd);
        }
    
    }
    

      

      

  • 相关阅读:
    WPS客户端更新日志留着备用
    C#设置电脑时间帮助类
    分布式数据库拆表拆库的常用策略
    程序员如何对待自己的工作
    java对接申通下单接口示例代码
    电子面单开发流程
    2016年工作总结和计划
    【价值观】大牛们的经典语录
    大话 程序猿 眼里的 接口
    【C#公共帮助类】DateTimeHelper设置电脑本地时间,实际开发很需要
  • 原文地址:https://www.cnblogs.com/startnow/p/7860126.html
Copyright © 2020-2023  润新知