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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥