栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

1- 简介 客户端获取时间程序--UNIX网络编程

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1- 简介 客户端获取时间程序--UNIX网络编程

1- socket通讯基本流程 客户端:

简单来说就是:创建描述符;填充数据;连接服务端;接收数据

sockfd = socket(AF_INET, SOCK_STREAM, 0)


bzero(&servaddr, sizeof(servaddr));


servaddr.sin_family = AF_INET;
servaddr.sin_port   = htons(13)
inet_pton(AF_INET, argv[1], &servaddr.sin_addr)


connect(sockfd, (SA *) &servaddr, sizeof(servaddr))


n = read(sockfd, recvline, MAXLINE)

服务端:

注意:刚开始创建的listenfd是监听描述符,用于监听特定的端口信息。 后面accept返回的是监听到的服务端socket描述符。

listenfd = Socket(AF_INET, SOCK_STREAM, 0)


bzero(&servaddr, sizeof(servaddr));


servaddr.sin_family      = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port        = htons(13);	


Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));


Listen(listenfd, LISTENQ);


connfd = Accept(listenfd, (SA *) NULL, NULL);


Write(connfd, buff, strlen(buff));

2- 源码 客户端
#include	"unp.h"

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

	if (argc != 2)
		err_quit("usage: a.out ");

	if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		err_sys("socket error");

	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_quit("inet_pton error for %s", argv[1]);

	if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
		err_sys("connect error");

	while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
		recvline[n] = 0;	
		if (fputs(recvline, stdout) == EOF)
			err_sys("fputs error");
	}
	if (n < 0)
		err_sys("read error");

	exit(0);
}

服务端

#include	"unp.h"
#include	

int
main(int argc, char **argv)
{
	int					listenfd, connfd;
	struct sockaddr_in	servaddr;
	char				buff[MAXLINE];
	time_t				ticks;

	listenfd = Socket(AF_INET, SOCK_STREAM, 0);

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family      = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port        = htons(13);	

	Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));

	Listen(listenfd, LISTENQ);

	for ( ; ; ) {
		connfd = Accept(listenfd, (SA *) NULL, NULL);

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24srn", ctime(&ticks));
        Write(connfd, buff, strlen(buff));

		Close(connfd);
	}
}

3- 其他

对于TCP/IP指定了某些端口用于特殊服务,参考:TCP/UDP常见端口

我们使用13端口号,就是默认获取时间的端口号是13.

当然我们也可以指定服务端 客户端的端口号为6666。

struct sockaddr_in	servaddr, cliaddr;
Getsockname(sockfd, (SA *) &cliaddr, &len);
printf("local addr: %sn",
		   Sock_ntop((SA *) &cliaddr, sizeof(cliaddr)));



struct sockaddr_in	 cliaddr;
connfd = Accept(listenfd, (SA *) &cliaddr, &len);
printf("connection from %s, port %dn",
			   Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
			   ntohs(cliaddr.sin_port));

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/338441.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号