《UNIX网络编程 卷1》第一章:实现一个简单的获取时间的客户端程序和服务端程序

本文介绍了如何在UNIX环境下,利用网络通信技术,实现一个简单的获取时间的客户端和服务器端程序。通过客户端发起请求,服务端响应当前时间,再在Ubuntu系统下进行实际运行试验,展示了网络编程的基础应用。
摘要由CSDN通过智能技术生成

客户端程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>

#define MAXLINE 100

int main(int argc,char** argv)
{
	int sockfd,n;
	char recvline[MAXLINE+1];
	struct sockaddr_in servaddr;

	if(argc != 2)
	{
		fprintf(stderr,"缺少IP地址的参数!\n");
		exit(EXIT_FAILURE);			
	}

	//用socket函数创建一个网际(AF_INET)字节流(SOCK_STREAM)套接字,
	//并返回一个用以标识该套接字的的整数描述符
	//然后测试整数sockfd是否小于0
	if( (sockfd = socket(AF_INET,SOCK_STREAM,0))  < 0)
	{
		fprintf(stderr,"网际字节流套接字创建失败!\n");
		exit(EXIT_FAILURE);			
	}

	//bzero()函数源于Berkeley网络编程代码,清零结构体变量servaddr
	bzero(&servaddr,sizeof(servaddr));

	//置地址族协议为AF_INET
	servaddr.sin_family = AF_INET;

	//置端口号为6666
	//htons()的功能是将整形变量从主机字节顺序转变为网络字节顺序(big-endien)
	servaddr.sin_port = htons(6666);
	
	//inet_pton()函数将点分十进制转换为用于网络传输的二进制数
	if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0)
	{
		fprintf(stderr,"inet_pton错误!");
		exit(EXIT_FAILURE);
	}

	//connect将sockfd与servaddr指定的服务器建立TCP连接
	if( connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0 )
	{
		fprintf(stderr,"connect失败!");
		exit(EXIT_FAILURE);
	}
	
	//建立TCP连接后,用read()读取服务器的应答
	while((n = read(sockfd,recvline,MAXLINE)) > 0)
	{
		recvline[n] = 0;
		if(fputs(recvline,stdout) == EOF)
			fprintf(stderr,"fputs() error\n");
	}
	if(n < 0)
		fprintf(stderr,"read error\n");

	exit(0);
}

服务端程序

#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#include<unistd.h>

#define MAXLINE 100
int main(int argc,char** argv)
{
	int listenfd,connfd;
	struct sockaddr_in servaddr;
	char buff[MAXLINE];
	time_t ticks;
	
	if( (listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
	{
		fprintf(stderr,"网际字节流套接字创建失败!\n");
		exit(EXIT_FAILURE);			
	}

	bzero(&servaddr,sizeof(servaddr));
	servaddr.sin_family = AF_INET;

	//指定IP地址为INADDR_ANY,这样,如果服务器有多个网络接口,服务器进程就可以在任意
	//网络接口上接受客户连接
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(6666);

	if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1)
    	{
      		printf("bind socket error\n");
       	 	exit(EXIT_FAILURE);
  	}

	if(listen(listenfd,10) == -1)
    	{
       		printf("listen socket error\n");
    	}
	
	printf("等待客户端请求的到来\n");

	while(1)
	{
		if( (connfd = accept(listenfd,(struct sockaddr*)NULL,NULL)) == -1)
		{
			printf("accpet error\n");
			continue;
		}

		ticks = time(NULL);
		snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
		if((write(connfd,buff,strlen(buff))) == -1)
		{
			printf("write error\n");
		}
	}
	close(connfd);

    	return 0;
}

Ubuntu下的运行试验

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值