Socket入门-获取服务器时间实例

daytimetcpsrv.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
 
int main(int argc,char **argv)
{
    int listenfd,connfd;//监听套接字,连接套接字
    struct sockaddr_in servaddr;
    char buff[1024];
    time_t ticks;
     
    //创建监听套接字
    listenfd=socket(AF_INET,SOCK_STREAM,0);
     
    // 填写网际套接字地址
        //bzero相对于memset 更加好记,只有两个参数。 Berkeley函数和ANSI C标准函数
    bzero(&servaddr,sizeof(servaddr));//清空结构推荐使用memset函数,bzero函数已过时,速度慢
    servaddr.sin_family=AF_INET;//协议
        //htonl htons 字节排序函数
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);//任意主机网络接口中连接服务器
    servaddr.sin_port=htons(10000);//绑定端口
     
    //绑定套接字
    bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
 
    //Listen 函数把该套接字转换成监听套接字
    listen(listenfd,10);
 
    //等待连接
    printf("Waiting connection!\n");
 
    for(;;)
    {   
        //阻塞,投入睡眠,等待某个客户连接的到达并被内核接受。TCP使用三次握手建立连接,握手完毕时accept返回,只时一个已连接描述符
        connfd=accept(listenfd,(struct sockaddr *)NULL,NULL);
        ticks=time(NULL);
        snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));//ctime把整数值转换成直观可读的时间格式
        //写到buff缓冲区,并不等于已经发送给对方,等缓冲区处理完之前的数据后,开始传送缓冲区内容
        write(connfd,buff,strlen(buff));
        close(connfd);
    }
}
//补充知识:
//------------------------
//字节操纵函数  <strings.h>
//Berkeley函数
//bzero bcopy bcmp ---以上仅仅列出函数名
//ANSI C 函数
//*memset *memcpy memcmp
//------------------------

  daytimetcpcli.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc,char **argv)
{
    int sockfd,n;
    char recvline[1024];
    struct sockaddr_in servaddr;
 
    if(argc!=2)
        {printf("参数有误!\n");return -1;}
 
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
        {printf("套接字创建失败!\n");return -1;}
 
    //指定服务器的IP地址和端口
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;//协议
    servaddr.sin_port =htons(10000);//端口
        //inet_pton地址转换(ASCII 字符串 与 网络字节序的二进制之间转换网际地址) P表达->N数值
    if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0)//IP地址有参数获得argv[1],argv[0]->当前程序
        {printf("inet_pton error for ");return -1;}
     
    //进行连接到服务器
    if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
        {printf("connect error");return -1;}
 
    //读数据
    while( (n=read(sockfd,recvline,1024))>0){
        recvline[n]=0;
        if(fputs(recvline,stdout)==EOF)//将recvline中的数据输出到标准输出
            {printf("fputs error");return -1;}
    }
 
    if(n<0)printf("read error");
 
    exit(0);       
}

  
输出结果:
服务器端:
xx@xxxxxx:~/Public/C$ ./daytimetcpsrv.out 
Waiting connection!

客户机端:
xx@xxxxxx:~/Public/C$ ./daytimetcpcli.out 127.0.0.1
Sat Jun  4 09:28:33 2016

posted @   马丁黄瓜啊  阅读(562)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
点击右上角即可分享
微信分享提示