基本概念

套接口也就是网络中的ID。网络通信,归根到底还是进程间通信(不同计算机上的进程间的通信)。在网络中,每一个节点(计算机或路由器)都有一个网络地址,也就是IP地址。

  • IP地址:在网络中唯一标识一台主机,32
  • 端口号:在主机中唯一标识一个进程,16
  • IP+port:在网络环境中唯一标识一个进程(socket)

socket也称套接字,是linux文件的一种类型(伪文件:不占存储空间的文件。linux 有7中文件, 1.普通文件  2.目录(d)3.字符设备文件(c) 4.块设备文件(b) 5.套接口文件(s)[如我们开启MySQL服务后,在/var/lib/mysql/下生成的mysql.sock文件,关闭MySQL服务后,这个文件就消失了],6.管道(p):有两端,读端 r:流出 fd[0]     写段w:流入 fd[1]         7.符号链接文件(l)[有点儿像WIN下的快捷方式]  其中占存储的有三种:普通,目录,软链接)

socket成对出现,

一个文件描述符指向两个缓冲区,一个读一个写。

预备知识                                                                                                                                          、

网路字节序:

TCP/IP规定,网路数据流应采用大端字节序,即低地址高字节。(大端:低地址--高位   高地址--地位    小端:低--低 高--高,即端口号和IP地址都是以网路字节序存储的,网络字节序使用的是大端模式。称给某个系统所采用的字节序为主机字节序,它可能是小端模式也可能是大端模式。

为使网络编程具有可移植性,使同样的C代码在大端和小端计算机上编译后能正常运行,可以调用一下库函数做网络字节序和主机字节序的转换。

#include<arpa/inet.h>
uint32_t htoal(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
//返回的是网络字节序
uint32_t ntoh1(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
//返回的主机字节序
//h表示host,to,n代表network,s代表short,l表示long
//端口16位 ,ip 32位

套接口的数据结构

在Linux中,每一种协议都有自己的网络地址数据结构,以sockaddr_开头,如IPV4对应的是sockaddr_in.

           //man 7 ip 查看

           struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
/*套接口结构地址族,如IPV4为AF_INET*/
in_port_t sin_port; /* port in network byte order */
/*16位TCP或UDP端口号,网络字节顺序*/
struct in_addr sin_addr; /* internet address */
}; /* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};

C/S编程

服务器是指在网络上提供服务的应用程序,客户机是指用户为了得到某种服务所需要 运行的应用程序,即申请服务的程序。一个服务器程序可以同时接收多个客户机的请求。

server.c:
socket() 建立套接字
bind() 绑定IP 端口号(struct sockaddr_in addr 初始化)
listen() 指定最大同时发起连接数
accept() 阻塞等待客户端发起连接
read()
小--大
write 给客户端
close();
client.c:
socket();
bind();可以依赖“隐式绑定”,即写不写都行
connect();发起连接
write();
read();
close();
 #include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<ctype.h>
#include<strings.h>
#define SERV_PORT 6666 //端口号
int main(void)
{
int lfd,cfd;//定义套接口描述符
struct sockaddr_in serv_addr;//定义服务器IPV4套接口地址数据结构serv_addr
struct sockaddr_in clie_addr;//d定义客户端client
socklen_t clie_addr_len;
char buf[BUFSIZ],clie_IP[BUFSIZ];//用BUFSIZ就不需要自己定义宏了
int i,n;
lfd=socket(AF_INET,SOCK_STREAM,);//AF_INET:IPV4 AF_INET6:IPV6
bzero(&serv_addr,sizeof(serv_addr));//清0,memset清任何数
serv_addr.sin_family=AF_INET;//设置addr的成员信息
serv_addr.sin_port=htons(SERV_PORT);//本地字节序转换为网络字节序
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);//IP地址设为本地IP INADDR_ANY本地任意IP bind(lfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));//绑定端口 listen(lfd,);//最多可以接受128个客户端的请求,监听ifd描述符 clie_addr_len=sizeof(clie_addr);
cfd=accept(lfd,(struct sockaddr *)&clie_addr,&clie_addr_len);//bind accept connect 需要强转
printf("client IP:%s,client port:%d\n",inet_ntop(AF_INET,&clie_addr.sin_addr,clie_IP,sizeof(clie_IP)),ntohs(clie_addr.sin_port));
while(){
n= read(cfd,buf,sizeof(buf));
for(i=;i<n;i++)
{
buf[i]=toupper(buf[i]);//下写转换为大写
}
write(cfd,buf,n);
}
close(lfd);
close(cfd); return ; }

server.c

 #include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<ctype.h>
#include<string.h>
#define SERV_PORT 6666
#define SERV_IP "127.0.0.1 "
int main(void)
{
int cfd;
int n;
char buf[BUFSIZ];
struct sockaddr_in serv_addr;
// socklen_t serv_addr_len;
cfd = socket(AF_INET,SOCK_STREAM,);
memset(&serv_addr,,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;//设置addr的成员信息
serv_addr.sin_port=htons(SERV_PORT);//本地字节序转换为网络字节序
inet_pton(AF_INET,SERV_IP,&serv_addr.sin_addr.s_addr);
// serv_addr.sin_addr=*((struct in_addr *)host->haddr);
connect(cfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));//客户端程序发起连接请求
while()
{
fgets(buf,sizeof(buf),stdin);//hello world ----fgets---"hello world\n\0"从键盘写
write(cfd,buf,strlen(buf));
n=read(cfd,buf,sizeof(buf));
write(STDOUT_FILENO,buf,n);
}
close(cfd);
return ;
}

client.c

套接口socket编程(Client/Server编程实例)的更多相关文章

  1. AndroidAsync :异步Socket,http(client+server),websocket和socket.io的Android类库

    AndroidAsync是一个用于Android应用的异步Socket,http(client+server),websocket和socket.io的类库.基于NIO,没有线程.它使用java.ni ...

  2. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

  3. Win Socket编程原理及简单实例

    [转]http://www.cnblogs.com/tornadomeet/archive/2012/04/11/2442140.html 使用Linux Socket做了小型的分布式,如Linux ...

  4. UNIX网络编程读书笔记:套接口选项

    概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...

  5. 值得收藏的TCP套接口编程文章

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由jackieluo发表于云+社区专栏 TCP客户端-服务器典型事件 下图是TCP客户端与服务器之间交互的一系列典型事件时间表: 首先启 ...

  6. UNIX网络编程读书笔记:原始套接口

    概述 应用程序可以绕过传输层而直接使用IPv4和IPv6,这称为原始套接口(raw socket).http://www.cnblogs.com/nufangrensheng/p/3583435.ht ...

  7. UNIX网络编程读书笔记:基本UDP套接口编程

    概述 使用UDP编写的一些流行的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 如下图所示,给出了典型的UDP客户/服务器程序的函数调用: 客户不与服务器建立连 ...

  8. Linux网络编程系列-套接口选项控制

    获取和设置套接口选项的方法有: getsockopt/setsockopt fcntl ioctl getsockopt/setsockopt 这两个函数仅用于套接口(socket)的设置,另外两个函 ...

  9. UDP套接口编程

    常用的UDP实现的程序:DNS域名系统,NFS网络文件系统,SNMP简单网络管理协议 ssize_t recvfrom(int sockfd,void *buff,size_t nbytes,int ...

随机推荐

  1. JAVA并发(一)

    java并发的一系列框架和技术主要是由java.util.concurrent 包所提供.包下的所有类可以分为如下几大类: locks部分:显式锁(互斥锁和速写锁)相关: atomic部分:原子变量类 ...

  2. Java中的集合和常用类

    Java中的常用类: ▪ Object类 ▪ Math类 ▪ String类和StringBuffer类(字符串) ▪ 8种基本类型所对应的包装类 ▪ java.util包中的类——Date类 Obj ...

  3. Oracle分析函数巧妙使用

    在 Oracle中使用Sql必须弄懂分析函数 Oracle开发专题之:分析函数(OVER) 1 Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 6 Or ...

  4. Eclipse部署Web项目,常用操作和常见错误的解决方案

    部署Web项目到tomcat 在eclipse中找到Servers项,打开服务器(F3)(建议直接删除服务器,重新建立再设置比较好)1.Servers Locations 中选择Use Tomcat ...

  5. activemq的搭建、启动,简单demo

    一.搭建activeMQ 在官网下载window版本,直接解压就可以. 二.启动 在解压完的目录/bin/win64,双击击activemq.bat,运行完之后打开浏览器,输入http://127.0 ...

  6. vue+element 页面输入框--回车导致页面刷新的问题

    el-form 后面加上 @submit.native.prevent

  7. 利用Docker设置Node.js

      docker是一个开源的应用容器引擎,可以为我们提供安全.可移植.可重复的自动化部署的方式.docker采用虚拟化的技术来虚拟化出应用程序的运行环境.如上图一样.docker就像一艘轮船.而轮船上 ...

  8. C语言中的if与else if

    今天发现一个比较不理解的代码,是关于else if这个判断语句的代码.代码如下 #include<stdio.h> ; int main(void) { ) { printf(" ...

  9. sqlserver之group by 与over函数

    group by 函数主要用来对数据进行分组,over()函数则是一个“开窗函数”,它更多的是与聚合函数如:sum().max().min().avg().count()等函数以及排名函数如:row_ ...

  10. 20155330 实验四 Android程序设计

    20155330 实验四 Android程序设计 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握An ...