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

1- socket通讯基本流程

客户端:

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

/* 创建socket 描述符 */
sockfd = socket(AF_INET, SOCK_STREAM, 0)

/* 清零 struct sockaddr_in 数据*/
bzero(&servaddr, sizeof(servaddr));

/* 初始化struct sockaddr_in 数据(ipv4 端口号)服务端地址 */
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描述符。

/* 创建socket描述符 */
listenfd = Socket(AF_INET, SOCK_STREAM, 0)

/* 清空struct sockaddr_in 数据 */
bzero(&servaddr, sizeof(servaddr));

/* 填充struct sockaddr_in 数据 */
servaddr.sin_family      = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port        = htons(13);	/* daytime server */

/* 绑定 */
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 <IPaddress>");

	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);	/* daytime server */
	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;	/* null terminate */
		if (fputs(recvline, stdout) == EOF)
			err_sys("fputs error");
	}
	if (n < 0)
		err_sys("read error");

	exit(0);
}

服务端

#include	"unp.h"
#include	<time.h>

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);	/* daytime server */

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

	Listen(listenfd, LISTENQ);

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

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

		Close(connfd);
	}
}

3- 其他

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

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

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

/* 客户端打印server IP信息 */
struct sockaddr_in	servaddr, cliaddr;
Getsockname(sockfd, (SA *) &cliaddr, &len);
printf("local addr: %s\n",
		   Sock_ntop((SA *) &cliaddr, sizeof(cliaddr)));


/* 服务端打印连接的客户端IP信息 */
struct sockaddr_in	 cliaddr;
connfd = Accept(listenfd, (SA *) &cliaddr, &len);
printf("connection from %s, port %d\n",
			   Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
			   ntohs(cliaddr.sin_port));

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值