第1章1.2节一个简单的时间获取客户程序
下面的demo访问的是ubuntu下的daytime服务,不需要另写服务端。
1.附源码如下
utils.h
-
cong@msi:/work/test/tcpip/1echo$ cat utils.h
-
#ifndef UTILS_H__
-
#define UTILS_H__
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <sys/types.h> /* See NOTES */
-
#include <sys/socket.h>
-
#include <netinet/in.h>
-
#include <arpa/inet.h>
-
#include <strings.h>
-
-
#define MAXLINE 1024
-
-
#define dbmsg(fmt, args ...) printf("%s:%s[%d]: "fmt"\n", __FILE__,__FUNCTION__, __LINE__,##args)
-
-
#endif
echo.c
-
cong@msi:/work/test/tcpip/1echo$ cat echo.c
-
#include "utils.h"
-
-
//#define TIME_SERV_ADDR "192.168.4.98"
-
#define TIME_SERV_ADDR "127.0.0.1" -->本机测试时用127.0.0.1,真正用的是上面的地址
-
-
int main ( int argc, char *argv[] )
-
{
-
int sockfd, n;
-
struct sockaddr_in servaddr;
-
char recvline[1024];
-
sockfd = socket(AF_INET, SOCK_STREAM, 0); -->创建socket
-
if(sockfd < 0)
-
return -1;
-
dbmsg("socket created");
-
-
//下面4行初始化结构体sockaddr_in
-
bzero(&servaddr, sizeof(servaddr));
-
servaddr.sin_family = AF_INET; --> 设置地址族
-
servaddr.sin_port = htons(13); --> 设置端口号,htons将主机字节转为网络字节序
-
inet_pton(AF_INET, TIME_SERV_ADDR, &servaddr.sin_addr); --> 设置服务器地址:将字符串(presentation)转为数值(numeric)
-
-
//连接服务端
-
connect(sockfd, (const struct sockaddr*)&servaddr, sizeof(servaddr));
-
dbmsg("connect success");
-
while((n=read(sockfd, recvline, MAXLINE)) > 0)
-
{
-
recvline[n] = '\0';
-
dbmsg("read over");
-
fputs(recvline, stdout);
-
}
-
-
return EXIT_SUCCESS;
-
}
inet_pton将点分十进制字符串转为网络地址结构
2.错误分析
像上面这样编译运行代码时发现会一直卡在connect上面,原因是本机的daytime服务没有打开
本机配置一下:
-
cong@msi:/tmp$ sudo apt-get install xinetd
-
-
cong@msi:/tmp$ sudo chmod 777 /etc/xinetd.d/daytime
-
cong@msi:/tmp$ sudo vi /etc/xinetd.d/daytime
-
将两个disable由yes改为no
-
cong@msi:/tmp$ sudo /etc/init.d/xinetd restart
3. 执行结果
-
cong@msi:/work/test/tcpip/1echo$ ./echo
-
echo.c:main[18]: socket created
-
echo.c:main[23]: next connect
-
echo.c:main[25]: connect success
-
echo.c:main[29]: read over
-
10 JUN 2015 10:36:52 CST
1echo.rar (下载后改名为1echo.tar.gz)
阅读(1047) | 评论(0) | 转发(0) |