Linux下C语言实现C/S模式编程

由标题可知,这篇文章主要讲如何用C语言实现一个C/S模式的程序。
主要功能:时间回送。
客户机发出请求,服务器响应时间,并返回服务器时间,与客户机进行同步。
废话不多说,下面直接贴出源代码。
代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <time.h> 

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h> 

void client_process(int connfd); 

int main(int argc, char *argv[])
{
  int ret;
  int listenfd;
  int connfd;
  struct sockaddr_in srvaddr;
  struct sockaddr_in cliaddr;
  socklen_t addrlen; 

  listenfd = socket(AF_INET, SOCK_STREAM, 0);
  if (listenfd == -1) {
    perror("socket");
    exit(EXIT_FAILURE);
  } 

  srvaddr.sin_family = AF_INET;
  srvaddr.sin_port = htons(8888);
  srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  ret = bind(listenfd, (struct sockaddr *)&srvaddr, sizeof(srvaddr));
  if (ret == -1) {
    perror("bind");
    exit(EXIT_FAILURE);
  } 

  ret = listen(listenfd, 5);
  if (ret == -1) {
    perror("listen");
    exit(EXIT_FAILURE);
  } 

  while (1) {
    memset(&cliaddr, 0, sizeof(cliaddr));
    addrlen = sizeof(cliaddr);
    connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &addrlen);
    if (connfd != -1) {
      printf("a new client is comming\n");
      client_process(connfd);
      printf("disconnect\n");
      close(connfd);
    } else
      perror("accept");
  } 

  close(listenfd);
} 

void client_process(int connfd)
{
  int ret;
  char buf[4096]; 

  while (1) {
    memset(buf, 0, sizeof(buf));
    strcpy(buf, "Kevin@TimeServer $ ");
    ret = write(connfd, buf, strlen(buf) + 1);
    if (ret == -1) {
      perror("write");
      return;
    } 

    memset(buf, 0, sizeof(buf));
    ret = read(connfd, buf, sizeof(buf));
    if (ret > 0) {
      if (strcmp(buf, "time\r\n") == 0) {
        time_t t; 

        memset(buf, 0, sizeof(buf));
        strcpy(buf, "Kevin@TimeServer $ ");
        ret = write(connfd, buf, strlen(buf) + 1);
        if (ret == -1) {
          perror("write");
          return;
        } 

        time(&t);
        strcpy(buf, ctime(&t)); 

        ret = write(connfd, buf, strlen(buf) + 1);
        if (ret == -1) {
          perror("write");
          return;
        }
      }
    } else if (ret == -1) {
      perror("read");
      return;
    } else
      return;
  }
}

主要过程
1.建立源程序,输入源代码。
2.打开一个终端,编译运行程序。编译程序:gcc cs.c   运行程序:./a.out
3.新开一个终端,输入:telnet localhost 8888
主窗口效果如下:

4.在子窗口中输入:time
子窗口显示如下:

5.关闭子窗口,主窗口显示:连接断开。
效果如下:

好吧,程序就讲到这里了,希望大家喜欢,对大家的学习有所帮助。

(0)

相关推荐

  • C语言编程入门之程序头文件的简要解析

    头文件是扩展名为.h的文件,其中包含C函数的声明和宏定义,也可以多个源文件之间共享.有两种类型的头文件:程序员编写的文件,和编译器中附带的文件. 要求使用头文件的程序,包括通过它,使用C语言预处理指令#include就像所看到的包含stdio.h头文件,它随着编译器自带. 包括一个头文件等于复制头文件的内容,但我们不这样做,因为这很容易出错,一个好主意是我们不复制头文件的内容,特别是包括多个程序的源文件. 在C或C++程序的简单做法是,我们把所有的常量,宏全系统全局变量和函数原型在头文件,其中包

  • 12种实现301网页重定向方法的代码实例(含Web编程语言和Web服务器)

    为什么需要使用301重定向: 1. 保留搜索引擎的排名: 301 重定向是最有效的方法,不会影响到搜索引擎对页面的排名. 2. 保留访客和流量: 如果你将页面链接到大量方法可以访问过的地址,如果不是用重定向的话你就会失去这些用户(不解)原文:If you move your popular page to which a lot of visitors have already linked, you may lose them if you don't used redirect method

  • 浅谈C语言编程中程序的一些基本的编写优化技巧

    大概所有学习C语言的初学者,都被前辈说过,C语言是世界上接近最速的编程语言,当然这并不是吹牛,也并不是贬低其他语言,诚然非C语言能写出高速度的代码,但是C语言更容易写出高速的程序(高速不代表高效),然而再好的工具,在外行人手中也只能是黯淡没落. 对于现代编译器,现代CPU而言,我们要尽量迎合CPU的设计(比如架构和处理指令的方式等),虽然编译器是为程序员服务,并且在尽它最大的能力来优化程序员写出的代码,但是毕竟它还没有脱离电子的范畴,如果我们的代码不能让编译器理解,编译器无法帮我们优化代码,那么

  • C语言编程中的联合体union入门学习教程

    联合体(union)在C语言中是一个特殊的数据类型,能够存储不同类型的数据在同一个内存位置.可以定义一个联合体使用许多成员,但只有一个部件可以包含在任何时候给定的值.联合体会提供使用相同的存储器位置供多用途的有效方式. 定义联合体 要定义联合体,必须使用union语句很相似于定义结构.联合体声明中定义了一个新的数据类型,程序不止一个成员.联合体声明的格式如下: union [union tag] { member definition; member definition; ... member

  • Python语言的面相对象编程方式初步学习

    词语练习 class:告诉python创造一个新的东西 object:两个意思:最基本的东西和任何实例化的东西. instance:创建一个类得到的东西. def:在类中创建一个函数. self:在类里面的函数中使用,是实例和object能访问的变量. inheritance:继承,一个类可以继承另一个类,像你和你的父母. composition:一个类可以包含另外一个类,就像汽车包含轮胎. attribute:一个属性类,通常包括变量. is-a:表示继承关系 has-a:包含关系 通过卡片记

  • 解析C语言基于UDP协议进行Socket编程的要点

    两种协议 TCP 和 UDP 前者可以理解为有保证的连接,后者是追求快速的连接. 当然最后一点有些 太过绝对 ,但是现在不需熬考虑太多,因为初入套接字编程,一切从简. 稍微试想便能够大致理解, TCP 追求的是可靠的传输数据, UDP 追求的则是快速的传输数据. 前者有繁琐的连接过程,后者则是根本不建立可靠连接(不是绝对),只是将数据发送而不考虑是否到达. 以下例子以 *nix 平台的便准为例,因为 Windows平台需要考虑额外的加载问题,稍作添加就能在 Windows 平台上运行UDP. U

  • 12种最常用的网页编程语言简介(值得收藏)

    如今,随着网站的越来越普及,与Web相关的开发技术持续热门,从前端到后端,从标记语言到开发语言,各种技术交相辉映,沉沉浮浮,从开始简单的html到复杂的web开发语言asp.asp.net.php.jsp等等,在此,我就借助SEO马龙博客的平台跟大家简单的介绍一下常见的12种网页编程语言 1.PHP PHP是一个嵌套的缩写名称,是英文"超级文本预处理语言"(PHP:Hypertext Preprocessor)的缩写.PHP是一种HTML内嵌式的语言,与微软的ASP颇有几分相似,都是一

  • Go语言编程入门超级指南

    1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny. First you hate 'em,

  • Linux下C语言实现C/S模式编程

    由标题可知,这篇文章主要讲如何用C语言实现一个C/S模式的程序. 主要功能:时间回送. 客户机发出请求,服务器响应时间,并返回服务器时间,与客户机进行同步. 废话不多说,下面直接贴出源代码. 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <time.h> #

  • linux下c语言的多线程编程

    我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执行的最小单元. 一般一个最简单的程序最少会有一个线程,就是程序本身,也就是主函数(单线程的进程可以简单的认为只有一个线程的进程) 一个线程阻塞并不会影响到另外一个线程. 多线程的进程可以尽可能的利用系统CPU资源. 1创建线程 先上一段在一个进程中创建一个线程的简单的代码,然后慢慢深入. #incl

  • Linux下C语言的几道经典面试题小结(分享)

    本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正. 1.如果在Linux下使用GCC编译器执行下列程序,输出结果是什么? 答案如下: 2.C语言程序不使用任何条件运算符,打印出十次"Hello"? 答案如下: 或是: 3.如果在Linux下使用GCC编译器执行下列程序,输出结果是什么? 答案如下: 4.如果在Linux下使用GCC编译器执行下列程序,输出结果是什么? 答案如下: 5.如果在Linux下使用GCC编

  • Linux 下C语言连接mysql实例详解

    Linux 下C语言连接mysql实例详解 第一步: 安装mysql, 参考:http://www.jb51.net/article/39190.htm 第二步: 安装mysql.h函数库 sudo apt-get install libmysqlclient-dev 执行之后就可以看到/usr/include/MySQL目录了 然后开始我们的链接. 首先看我的数据库 mysql> show databases; +--------------------+ | Database | +----

  • Linux下C语言修改进程名称的方法

    本文实例讲述了Linux下C语言修改进程名称的方法.分享给大家供大家参考.具体如下: #include <stdio.h> #include <string.h> #include "./util/setproctitle.c" // extern char **environ; // int main(int argc , char *argv[]) // { // int i; // printf("argc:%d\n" , argc);

  • Linux下C语言的fork()子进程函数用法及相关问题解析

    fork fork()函数是linux下的一个系统调用,它的作用是产生一个子进程,子进程是当前进程的一个副本,它跟父进程有一样的虚存内容,但也有一些不同点. 但是,值得注意的是,父进程调用fork()后,fork()返回的是生成的子进程(如果能顺利生成的话)的ID.子进程执行的起点也是代码中fork的位置,不同的是下面这段C语言代码展示了fork()函数的使用方法: // myfork.c #include <unistd.h> #include <stdio.h> int mai

  • linux下c语言中隐藏进程命令行参数(例如输入密码等高危操作)

    前言 启动程序很多时候用命令行参数可以很方便,做到简化一些配置,但是输入用户名密码等操作,如果通过进程查看工具直接看到密码就太不安全了. 因此很有必要研究如何隐藏命令行参数中的某些字段,当然做成配置文件也是极好的,但是无疑给运行程序增加额外操作.编辑保存配置文件也会费点事. 我结合网上找到的一些方案,以及自己总结一个方案,记下笔记. 复写argv参数 该方案只在Linux下的C语言中验证成功,因为window下都是win32api获取命令行参数,但是没有设置这个,估计window不支持这种骚操作

  • Linux下C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 此次贪吃蛇小游戏的目的是使得我在Linux底下使用vi进行编写的 心得: 1.自己对linux中如何使用vi更加熟悉 如::wq yy pp dd u 等等 2.对c语言的指针,结构体,链表等更加的牢固 3.借此小项目也运用到多线程作为进入linux的深入学习打下坚实的基础 代码展示 #include<curses.h> #include<stdlib.h> #define UP 1 //1与-1的目的

  • linux下C语言实现写日志功能

    先上程序,该程序经过测试能够很好的实现写日志要求 /************************************************************************* > File Name: log.c > Author: ************************************************************************/ #include <stdio.h> #include <sys/type

  • linux下 C语言对 php 扩展

    一,搭建php环境下载php 5.2.6 源码 并解压编译安装,搭建php环境二,创建扩展项目进入源码目录cd php5.2.6/ext/./ext_skel --extname=my_ext创建名字为my_ext的项目,最终会生成my_ext.so 三,更改配置和程序$ vi ext/my_ext/config.m4 根据你自己的选择将 dnl PHP_ARG_WITH(my_ext, for my_ext support,dnl Make sure that the comment is a

随机推荐