套接口socket编程(Client/Server编程实例)
基本概念
套接口也就是网络中的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编程实例)的更多相关文章
- AndroidAsync :异步Socket,http(client+server),websocket和socket.io的Android类库
AndroidAsync是一个用于Android应用的异步Socket,http(client+server),websocket和socket.io的类库.基于NIO,没有线程.它使用java.ni ...
- C++网络套接字编程TCP和UDP实例
原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(so ...
- Win Socket编程原理及简单实例
[转]http://www.cnblogs.com/tornadomeet/archive/2012/04/11/2442140.html 使用Linux Socket做了小型的分布式,如Linux ...
- UNIX网络编程读书笔记:套接口选项
概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...
- 值得收藏的TCP套接口编程文章
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由jackieluo发表于云+社区专栏 TCP客户端-服务器典型事件 下图是TCP客户端与服务器之间交互的一系列典型事件时间表: 首先启 ...
- UNIX网络编程读书笔记:原始套接口
概述 应用程序可以绕过传输层而直接使用IPv4和IPv6,这称为原始套接口(raw socket).http://www.cnblogs.com/nufangrensheng/p/3583435.ht ...
- UNIX网络编程读书笔记:基本UDP套接口编程
概述 使用UDP编写的一些流行的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 如下图所示,给出了典型的UDP客户/服务器程序的函数调用: 客户不与服务器建立连 ...
- Linux网络编程系列-套接口选项控制
获取和设置套接口选项的方法有: getsockopt/setsockopt fcntl ioctl getsockopt/setsockopt 这两个函数仅用于套接口(socket)的设置,另外两个函 ...
- UDP套接口编程
常用的UDP实现的程序:DNS域名系统,NFS网络文件系统,SNMP简单网络管理协议 ssize_t recvfrom(int sockfd,void *buff,size_t nbytes,int ...
随机推荐
- C++练习 | 递归创建二叉树并求叶子结点的数值和
#include <iostream> using namespace std; struct Tree { int data; Tree *lchild; Tree *rchild; } ...
- Mysql 查询是否锁表
1.查询是否锁表show OPEN TABLES where In_use > 0; 2.查询进程 show processlist 查询到相对应的进程===然后 kill id 补充:查看正在 ...
- HIve数据存储
表 Table 内部表 Partition 分区表 External Table 外部表 Bucket Table 桶表 内部表 分区表 parttion对应于数据库中的Partition列的密集索引 ...
- 使用xadmin更新数据时,报错expected string or bytes-like object
expected string or bytes-like object 期望的字符串或类似字节的对象,一般为数据类型不匹配造成 本人在实际项目里发现的问题是: 数据库里的字段类型与django里mo ...
- C语言链队列
链队列类似于单链表,为了限制只能从两端操作数据,其结构体内有2个指针分别指向头尾,但队列里的节点用另一种结构体来表示,头尾指针则为指向该结构体的类型.只能通过操作头尾指针来操作队列. typedef ...
- Java ThreadLocal 源代码分析
Java ThreadLocal 之前在写SSM项目的时候使用过一个叫PageHelper的插件 可以自动完成分页而不用手动写SQL limit 用起来大概是这样的 最开始的时候觉得很困惑,因为直接使 ...
- 自定义udf添加一列
//创建得分窗口字典 var dict= new mutable.HashMap[Double, Int]() ){ dict.put(result_Score(i),i) } //自定义Udf函数 ...
- TCP交互流程
前言:在FPGA上实现TCP协议实际是一个不太好的计划,因为FPGA最擅长的是流水线处理方式,而TCP存在交互,导致FPGA需要进行反馈式的处理.但是由于项目新增的附加要求而又只能在FPGA上去实现T ...
- Pytorch之Variable求导机制
自动求导机制是pytorch中非常重要的性质,免去了手动计算导数,为构建模型节省了时间.下面介绍自动求导机制的基本用法. #自动求导机制 import torch from torch.autogra ...
- postgresql 安装插件
最近由于工作需要,学习了citusdata 插件,在按照官方文档装好postgresql 之后,不能在psql 中正常启用其它插件 如 : "create extension pg_trg ...