基本概念

套接口也就是网络中的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. ios的framework合并

    # 运行此脚本前 # 先编译一遍工程 确保正常运行 没有报错 # 作为Xcode Aggregate运行 # file-->new target-->cross-platform--> ...

  2. 轻量ORM-SqlRepoEx (十七)SqlRepoEx 2.30 版本更新说明

    .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,支持MySQL.SQL Server数据库方言,使用强类型操作数据的轻量级ORM工具,在减少魔法 ...

  3. Notes 20180310 : String第二讲_String的声明与创建

    1  字符串的声明与创建 学习String的第一步就是创建(声明)字符串,我们在这里之所以分为创建和声明(其实是一个意思,都是创建字符串,但两者却有本质的区别)是因为String是一个很特殊的类,它的 ...

  4. alter修改表

    alter修改表的基础语句,语法如下: ALTER TABLE table_name ADD column_name|MODIFY column_name| DROP COLUMN column_na ...

  5. 菜鸟程序猿之IDEA快捷键

    Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...

  6. javacript window对象

    Window -- 代表浏览器中一个打开的窗口: 对象属性 window //窗口自身 window.self //引用本窗户window=window.self window.name //为窗口命 ...

  7. 前端基础-jQuery的最常用的的方法each、data、

    阅读目录 each inArray get index data 一.jQuery中each方法的应用 jQuery中有个很重要的核心方法each,大部分jQuery方法在内部都会调用each,其主要 ...

  8. HCNA(一)网络传输介质

    一 .同轴线缆 介绍:同轴线缆是一种早期的网络传输介质,同轴电缆的得名与它的结构相关,由内导体.外导体.绝缘介质和防护套四部分组成.同样支持10Mbps传输速率.现在已经基本被淘汰,不在应用于企业网络 ...

  9. Flume(5)-Ganglia监控

    一. 安装Ganglia 1. 安装httpd服务与php sudo yum -y install httpd php 2. 安装其他依赖 sudo yum -y install rrdtool pe ...

  10. Go 学习之路:引用类型与值类型

    Golang中只有三种引用类型:slice(切片).map(字典).channel(管道): 引用类型 引用类型理解为(C语言):指针 值类型 值的拷贝 下面以值类型和slice(切片)例子可知: p ...