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);
    }

}

  

  

原文地址:https://www.cnblogs.com/startnow/p/7860126.html