Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2138141
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2015-06-10 10:57:03

第1章1.2节一个简单的时间获取客户程序
下面的demo访问的是ubuntu下的daytime服务,不需要另写服务端。
1.附源码如下
utils.h
  1. cong@msi:/work/test/tcpip/1echo$ cat utils.h
  2. #ifndef UTILS_H__
  3. #define UTILS_H__
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <sys/types.h> /* See NOTES */
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <strings.h>

  11. #define MAXLINE 1024

  12. #define dbmsg(fmt, args ...) printf("%s:%s[%d]: "fmt"\n", __FILE__,__FUNCTION__, __LINE__,##args)

  13. #endif
echo.c
  1. cong@msi:/work/test/tcpip/1echo$ cat echo.c
  2. #include "utils.h"

  3. //#define TIME_SERV_ADDR "192.168.4.98"
  4. #define TIME_SERV_ADDR "127.0.0.1"   -->本机测试时用127.0.0.1,真正用的是上面的地址

  5. int main ( int argc, char *argv[] )
  6. {
  7.     int sockfd, n;
  8.     struct sockaddr_in servaddr;
  9.     char recvline[1024];
  10.     sockfd = socket(AF_INET, SOCK_STREAM, 0);      -->创建socket
  11.     if(sockfd < 0)
  12.         return -1;
  13.     dbmsg("socket created");

  14.     //下面4行初始化结构体sockaddr_in
  15.     bzero(&servaddr, sizeof(servaddr));
  16.     servaddr.sin_family = AF_INET;    --> 设置地址族
  17.     servaddr.sin_port = htons(13);    --> 设置端口号,htons将主机字节转为网络字节序
  18.     inet_pton(AF_INET, TIME_SERV_ADDR, &servaddr.sin_addr); --> 设置服务器地址:将字符串(presentation)转为数值(numeric)

  19.     //连接服务端
  20.     connect(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr));
  21.     dbmsg("connect success");
  22.     while((n=read(sockfd, recvline, MAXLINE)) > 0)
  23.     {
  24.         recvline[n] = '\0';
  25.         dbmsg("read over");
  26.         fputs(recvline, stdout);
  27.     }

  28.     return EXIT_SUCCESS;
  29. }
inet_pton将点分十进制字符串转为网络地址结构

2.错误分析
像上面这样编译运行代码时发现会一直卡在connect上面,原因是本机的daytime服务没有打开
本机配置一下:
  1. cong@msi:/tmp$ sudo apt-get install xinetd

  2. cong@msi:/tmp$ sudo chmod 777 /etc/xinetd.d/daytime
  3. cong@msi:/tmp$ sudo vi /etc/xinetd.d/daytime
  4.    将两个disable由yes改为no
  5. cong@msi:/tmp$ sudo /etc/init.d/xinetd restart
3. 执行结果
  1. cong@msi:/work/test/tcpip/1echo$ ./echo
  2. echo.c:main[18]: socket created
  3. echo.c:main[23]: next connect
  4. echo.c:main[25]: connect success
  5. echo.c:main[29]: read over
  6. 10 JUN 2015 10:36:52 CST


1echo.rar (下载后改名为1echo.tar.gz)

阅读(1025) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~