写了一个简单的服务器软件,但是没有写客户端。现在我将客户端实现了,其实昨天已经说了客户端的实现步骤了。

步骤:

  1. socket()
  2. 初始化
  3. connet()链接
  4. 从标准输入读数据fgets()
  5. 传数据到服务器write()
  6. 读从服务器返回的数据read()
  7. 写数据到屏幕上write()
  8. 关闭socket文件close()

都没有什么新知识的。所以我也就直接贴代码了;

#include
<string.h>

#include
<sys/types.h>

#include
<sys/socket.h>

#include
<stdio.h>

#include
<stdlib.h>

#include
<unistd.h>

#include
<sys/stat.h>

#include
<arpa/inet.h>

#include
<netinet/in.h>

#define
ADDR_POST 9527

int main(void)

{

    int c_fd; //客户端的socket文件描述符

    int len; //从服务器传回的字符串长度

    char buf[BUFSIZ]; //储存数据

    struct
sockaddr_in clie_addr; //客户端地址结构体

    socklen_t addr_len; //客户端地址结构体大小

 

    //创建客户端socket文件,指定IPV4 ,TCP协议

    c_fd = socket(AF_INET,SOCK_STREAM,0);

 

    //初始化客户端地址结构体

    inet_pton(AF_INET, "127.0.0.1", &clie_addr.sin_addr.s_addr);//将IP字符串转化为网络值存入其中,这个"127.0.0.1"就是客户端的IP,但不一定是公网IP

    clie_addr.sin_family = AF_INET;//指定IPV4协议族

    clie_addr.sin_port = htons(ADDR_POST);//将服务器的端口转化为网络值存入

 

    connect(c_fd, (struct
sockaddr*)&clie_addr, sizeof(clie_addr));//由地址结构体连接服务器;

    //因为地址结构体中有服务器的端口,端口在机器上是唯一的。

    //刚接触,其实有很多还是不大明白。我们的服务器软件和客户端软件都是运行在一台机器上的,一台机器中的端口号是唯一的,类似进程号。至于若是服务器软件和客户端位于不同的机器是怎么经过网络找到对应的机器,我就不大清楚了,以后学到了在解惑吧。

 

    while (1)

    {

        fgets(buf, sizeof(buf), stdin); //从标准输入中读取数据

        write(c_fd, buf, strlen(buf)); //写到服务器中c_fd既有接收端又有发送端。

        len = read(c_fd, buf, sizeof(buf)); //读从服务器返回的数据

        write(STDOUT_FILENO, buf, len); //写到屏幕上

    }

    close(c_fd);

 

    return 0;

}

其实很简单的。

结果和昨天的示例一样:。服务器依然是阻塞着的,没啥好看的。

由于客户端不需要固定的端口号,因此不必调用bind(),客户端的端口号由内核自动分配。注意,客户端不是不允许调用bind(),只是没有必要调用bind()固定一个端口号,服务器也不是必须调用bind(),但如果服务器不调用bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。

客户端和服务器启动后可以使用netstat命令查看链接情况:

netstat -apn|grep 6666

Linux:客户端的实现的更多相关文章

  1. gitlab的搭建和linux客户端的连接

    一.安装 1.新建 /etc/yum.repos.d/gitlab-ce.repo,添加以下内容 1 2 3 4 5 6 7 [gitlab-ce] name=gitlab-ce baseurl=ht ...

  2. 《samba搭建win客户端和linux客户端的区别》

    samba服务的搭建 客户的使用系统的不同也导致测试结果的不同. linux系统客户端: security = user or share smbclient -L //192.168.7.113/w ...

  3. linux 客户端与linux服务器端连接与文件上传下载

    linux客户端连接linux服务器 用ssh 可以用 man ssh 查看用法 基本格式: ssh 用户名@主机名 如: ssh root@1.1.1.1 linux客户端上传文件到 linux 服 ...

  4. Centos 下安装Zabbix Linux 客户端

    今天在linux上安装了客户端,过程如下: (1)下载zabbix客户端软件 wget www.zabbix.com/downloads/2.0.3/zabbix_agents_2.0.3.linux ...

  5. rsync (windows 服务端,linux客户端)将windows上的数据同步到linux服务器,反之也可

    一:总体概述. 1.windows上面首先装CW_rsync_Server.4.1.0_installer,安装时要输入的用户名密码要记住哦!接下来就是找到rsyncd.conf进入配置细节 2.li ...

  6. 微软Skype Linux客户端全新发布

    前两天,微软说要给“Linux 用户带来一个令人兴奋的新闻”,今天,这个新闻来了.它刚刚为 Linux 发布了一个新的 Skype 客户端. 此次发布,微软为 Linux 带来的 Skype 客户端与 ...

  7. CMDB资产管理系统开发【day26】:linux客户端开发

    客户端疑难点及获取流程 1.linux客户端支持2就可以,python3就是很麻烦 难道你要求所有的客户端都上pytho3吗? 现在从bin的入口进去 HouseStark.ArgvHandler(s ...

  8. 配置Linux客户端使用socks5代理上网

    配置Linux客户端使用socks5代理上网   背景 有访问google或者其他海外网站需求的同学可能大都用过或者听过ss,在Windows.Mac.Android.IOS都有现成可用的客户端来协助 ...

  9. SVN的Windows和Linux客户端操作详解

    SVN的Windows和Linux客户端操作详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Windows客户端操作 1.安装SVN客户端 a>.去官网下载svn软件 ...

  10. openvpn用户管理、linux客户端配置及企业常用真实案例解析

    1.给企业用户分配VPN账户的流程: 添加拨号需要密码的用户 # source vars NOTE: If you run ./clean-all, I will be doing a rm -rf ...

随机推荐

  1. JS的正则表达式简介

    1.JS的正则表达式 1.1 简介 JS的正则表达式比较简单,总体上只分为两个功能:一个是test——用于匹配字符串是否符合规定的正则表达式规则:另外一个是exec——用于获取匹配到的数据. 1.2 ...

  2. [UE4]Delay的使用技巧:改变引擎执行顺序

    如果要游戏一开始就让机器人开火,但这是引擎还没有执行到武器的创建步骤,就可以使用“Delay”并设置函数的等待时间,让引擎先执行创建枪的步骤,然后机器人开火就没问题了.

  3. springmvc前端控制器的三种拦截方式

    *.do :只拦截.do文件 / :拦截除jsp页面的所有请求,包括restful类型的url /*  :拦截所有请求包括jsp页面

  4. mysql 之审计 init-connect+binlog完成审计功能

    mysql基于init-connect+binlog完成审计功能 目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是my ...

  5. iis ajax post 跨域问题解决

    iis ajax post时会遇到跨域的问题 只需要在IIS中http响应头中增加:Access-Control-Allow-Origin:*,即可解决问题

  6. sed初学者实用说明

     转自:http://www.codeweblog.com/sed%E5%88%9D%E5%AD%A6%E8%80%85%E5%AE%9E%E7%94%A8%E8%AF%B4%E6%98%8E/ ...

  7. boost serialize序列化

    boost序列化 #ifndef FND_SERI_H #define FND_SERI_H #include <boost/archive/text_oarchive.hpp> #inc ...

  8. Elasticsearch分布式机制探究

    Elasticsearch是一套分布式的系统,分布式是为了应对大数据量隐藏了复杂的分布式机制 分片机制 shard = hash(routing) % number_of_primary_shards ...

  9. CS229 6.15 Neurons Networks Deep Belief Networks

    Hintion老爷子在06年的science上的论文里阐述了 RBMs 可以堆叠起来并且通过逐层贪婪的方式来训练,这种网络被称作Deep Belife Networks(DBN),DBN是一种可以学习 ...

  10. appium java 在android7.0真机上测试程序时报错command failed shell "ps 'uiautomator'"的解决方式

    1.找到appium的安装目录下的adb.js文件,目录为:Appium\node_modules\appium\node_modules\appium-adb\lib 2.打开adb.js,找到如下 ...