Linux 环境下 socket通信 TimeServer TimeClient

来源:互联网 发布:mysql 5.7数据库迁移 编辑:程序博客网 时间:2024/05/16 11:43

1. server提供时间查询

     (a) 先设定socket,bind地址,listen。

     (b) 论循accept请求得到文件描述符fd,用fdopen打开这个特殊文件,借助fprintf写文件,关闭文件描述符fd。

     (c) 但一直未关闭socket,因为while(1)循环持续运行。

server.c

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include <arpa/inet.h>#define oops(msg) { perror(msg); exit(EXIT_FAILURE); }int main(){        int socket_fd = socket(PF_INET, SOCK_STREAM, 0);        if(socket_fd == -1) oops("socket initiating error...");        struct sockaddr_in address;        bzero((void *)&address, sizeof(address));        address.sin_family = AF_INET;        address.sin_addr.s_addr = inet_addr("192.168.100.125");        address.sin_port =  8888;        int bind_return =  bind(socket_fd, (struct sockaddr *)&address, sizeof(address));        if(bind_return == -1) oops("bind error...");        int listen_return = listen(socket_fd, 1);        if(listen_return == -1) oops("listen error...");        while(1){                int fd = accept(socket_fd, NULL, NULL);                if(fd == -1) oops("accept error...");                FILE *fp = fdopen(fd, "w");                if(fp == NULL) oops("fdopen");                time_t current_time = time(NULL);                char *now_time = ctime(&current_time);                fprintf(fp, "Time here is : %s", now_time);                fclose(fp);        }        return EXIT_SUCCESS;}
2. client.c

(a) 先设定socket,connect到这个服务器地址

(b) 从socket中 read信息,写入buffer中。

(c) 对buffer中数据处理。(write到标准输出 stdout 的fd 为1)

(d) close 掉socket。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include <arpa/inet.h>#define oops(msg) { perror(msg); exit(EXIT_FAILURE); }#define SIZE 100int main(){        int socket_fd = socket(PF_INET, SOCK_STREAM, 0);        if(socket_fd == -1) oops("socket initiating error...");        struct sockaddr_in address;        bzero(&address, sizeof(address));        address.sin_family = AF_INET;        address.sin_addr.s_addr = inet_addr("192.168.100.125");        address.sin_port =  8888;        int connect_result = connect(socket_fd, (struct sockaddr*)&address, sizeof(address));        if(connect_result == -1) oops("connect error...");        char buffer[SIZE];        ssize_t message_length = read(socket_fd, buffer, SIZE);        if(message_length == -1) oops("error: read data from socket...");        ssize_t write_length = write(1, buffer, message_length); //write到标准输出stdout        if(write_length != message_length) oops("error: write ...");        close(socket_fd);        return EXIT_SUCCESS;}



原创粉丝点击