TCP编程函数和步骤
TCP编程的服务器端一般步骤是
1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt(); * 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind();
4、 开启监听,用函数listen();
5、 接收客户端上来的连接,用函数accept();
6、 收发数据,用函数send()和recv(),者read()和write();
7、 关闭网络连接;
8、 关闭监听;
TCP编程的客户端一般步骤是:
1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt();* 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、 设置要连接的对方的IP地址和端口等属性;
5、 连接服务器,用函数connect();
6、 收发数据,用函数send()和recv(),或者read()和write();
7、 关闭网络连接;
UDP编程的服务器端一般步骤是:
1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt();* 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind()
4、 循环接收数据,用函数recvfrom();
5、 关闭网络连接;
UDP编程的客户端一般步骤是:
1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt();* 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、 设置对方的IP地址和端口等属性;
5、 发送数据,用函数sendto();
6、 关闭网络连接;
常用的网络命令:
netstat
命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息.netstat有许多的选项我们常用的选项是 -an 用来显示详细的网络状态.至于其它的选项我们可以使用帮助
telnet
telnet是一个用来远程控制的程序,但是我们完全可以用这个程序来调试我们的服务端程序的. 比如我们的服务器程序在监听8888端口,我们可以用telnet localhost 8888来查看服务端的状况
数据结构
1、地址结构
struct sockaddr_in {
short int sin_family; /* 地址族 一般为AF-INET */
unsigned short int sin_port; /* 端口号 */
struct in_addr sin_addr; /* IP地址 */
unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 使用memset()或bzero()来填充*/
};
struct sockaddr {
unsigned short sa_family; /* 地址族, AF_xxx */
char sa_data[14]; /* 14 字节的协议地址 */
};
2、DNS结构
struct hostent {
char *h_name; /* 主机的官方域名 */
char **h_aliases; /* 一个以NULL结尾的主机别名数组 */
int h_addrtype; /* 返回的地址类型,在Internet环境下为AF-INET */
int h_length; /*地址的字节长度 */
char **h_addr_list; /* 一个以0结尾的数组,包含该主机的所有地址*/
};
操作函数
1、 socket:
创建socket 描述符
int socket(int domain, int type, int protocol);
domain=AF_INET,socket的类型,type=SOCK_STREAM 或SOCK_DGRAM,分别表示TCP连接和UDP连接;protocol=0。
返回一个整型socket描述符。
2.bind:
将socket描述符与你本机上的一个端口相关联(仅用于服务器)
int bind(int sockfd,struct sockaddr *my_addr, int addrlen);
Sockfd是一个socket描述符
my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;
addrlen=sizeof(struct sockaddr)。
返回:成功=0;失败=-1,errno=错误号。
可以用下面的赋值自动获得本机IP地址和随机获取一个没有被占用的端口号:
my_addr.sin_port = 0; /* 系统随机选择一个未被使用的端口号 */
my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本机IP地址 */
3.Connect:
与远端服务器建立一个TCP连接 (用于客户端)
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
Sockfd是目的服务器的sockt描述符
serv_addr是包含目的机IP地址和端口号的指针。
返回:成功=0;失败=-1,errno=错误号。
4、Listen:
监听是否有服务请求 ,用于bind()后
int listen(int sockfd, int backlog);
Sockfd是Socket系统调用返回的socket 描述符;
backlog指定在请求队列中允许的最大请求数,缺省值为20。
返回:成功=0;失败=-1,errno=错误号。
5.accept:
接受来自客户的请求
int accept(int sockfd, void *addr, int *addrlen);
sockfd是被监听的socket描述符,
addr 是指向sockaddr_in变量的指针,存放客户主机的信息 ;
addrten 指向值为sizeof(struct sockaddr_in)的整型指针变量。
返回:成功返回一个新的socket描述符,来供这个新连接来使用。 错误发生时返回一个-1并且设置相应的errno值。
6.Send:
在连接(TCP)的socket方式下发送信息
int send(int sockfd, const void *msg, int len, int flags);
Sockfd是用来传输数据的socket描述符
msg是一个指向要发送数据的指针。
Len是以字节为单位的数据的长度。
flags一般情况下置为0。
7.recv:
在连接(TCP)的socket方式下接收数据
int recv(int sockfd,void *buf,int len,unsigned int flags);
Sockfd是接受数据的socket描述符;
buf 是存放接收数据的缓冲区;
len是缓冲的长度。
Flags也被置为0。
返回:实际上接收的字节数,如果连接中止,返回0,。出现错误时,返回-1并置相应的errno值。
8.sendto:
在在无连接(UDP)的socket方式下发送数据
int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);
to表示目地机的IP地址和端口号信息
tolen=sizeof (struct sockaddr)。
返回:实际发送的数据字节长度或在出现发送错误时返回-1。
9.Recvfrom()
在无连接(UDP)的socket方式下接收数据
int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);
from 保存源机的IP地址及端口号。
fromlen=sizeof(struct sockaddr)。
返回:实际存入from中的数据字节数。当出现错误时返回-1,并置相应的errno。
10.close()
释放socket,停止任何数据操作
close(sockfd);
11.shutdown:
单向关闭连接
int shutdown(int sockfd,int how);
how可以设为下列值:
·0-------不允许继续接收数据
·1-------不允许继续发送数据
·2-------不允许继续发送和接收数据,均为允许则调用close ()
shutdown在操作成功时返回0,在出现错误时返回-1(并置相应errno)。
12. gethostbyname:
域名和IP地址的转换
struct hostent *gethostbyname(const char *name);
13.inet_pton函数:
将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。
int inet_pton(int family,const char * strptr,void * addrptr);
第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向点分十进制串的指针:第三个参数是一个指向转换后的网络字节序的二进制值的指针。
返回:1---成功 0---输入不是有效的表达格式 -1---失败
14.inet_ntop函数:
和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。
const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len);
第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向网络字节序的二进制值的指针;第三个参数是一个指向转换后的点分十进制串的指针;第四个参数是目标的大小,以免函数溢出其调用者的缓冲区。
返回:指向结果的指针---成功 NULL---失败
相关文章:

OSD的主要实现方法和类型(转)
源:OSD的主要实现方法和类型 目前有两种主要的OSD实现方法:外部OSD发生器与视频处理器间的叠加合成;视频处理器内部 支持OSD,直接在视频缓存内部叠加OSD信息。 外部OSD发生器与视频处理器间的叠加合成的实现原理是:由一个MCU内建的…

为什么要研究游戏 AI 呢?
作者 | 叶鑫来源 | DatawhaleAI作为时下计算机算法的超级巨星,在例如CV、NLP、语音、机器人等诸多领域都有广泛的应用。而在游戏领域,AI的应用往往被认为只是把游戏角色拟人化,算法的第一印象也通常是强化学习。但实际当中,AI在游…

oracle 工具:tkprof
https://docs.oracle.com/cd/B10501_01/server.920/a96533/ex_plan.htm http://blog.csdn.net/dba_waterbin/article/details/8010629 oracle sql执行计划怎么看 https://zhidao.baidu.com/question/1178766860347033659.html

Linux环境编程--文件基本操作
Linux 下目录是/这样的 而windows是\怎么记呢?\和w是不是一样的反向?所以Linux的目录就是反的反向,好记了。 一:open函数名称:open目标:打开一个文件。头文件:#include <sys/types.h>#in…

Firefox插件
为什么80%的码农都做不了架构师?>>> 网站优化必备的9个Firefox插件 在网页设计制作中经常使用到的火狐浏览器插件工具: 1. Firebug Firebug是开发人员们钟爱火狐浏览器的一个重要原因,Firebug是火狐浏览器上一个集成式的强大调试…

马斯克公开支持“上班摸鱼”:让工作更愉快!
整理 | 王晓曼出品 | 程序人生 (ID:coder _life)11月16日,在国美集团批评员工上班摸鱼的通报中,一名员工在网易云音乐上使用了22.5G的流量格外显眼。11月18日,网易云音乐也紧跟热点上线了摸鱼计算器活动&am…

瀚思首发三款产品 推动大数据安全战略布局
安全已成为了当下社会最为关注的几个问题之一,随着大数据时代的来临,如今的安全问题也变得严峻和复杂。近日,HanSight瀚思在北京召开了产品战略暨融资发布会,推出了瀚思用户行为分析系统(HanSight UBA)、瀚…

Linux环境编程--编辑器基本操作
vim使用 新建文件 #vim hello.c 插入模式 按下I键,底下出现- - 插入- - 换行:按下Enter 删除字符:普通模式下按x 删除整行:按dd 恢复删除:按u 取消命令: CtrlR 对U后果弥补 复制:y y2w复制2个…

2021 IDEA大会开启AI思想盛宴,用“创业精神”做科研
11月22日上午10时许,由深圳市福田区人民政府、深圳市福田区科技创新局和粤港澳大湾区数字经济研究院(International Digital Economy Academy, 简称“IDEA”)联合举办的2021 IDEA大会在深圳福田开幕。大会以“The World Needs a Few Good IDE…

Android不同分辨率和不同密度适配
官方原文地址:http://developer.android.com/training/multiscreen/screendensities.html 本文主要介绍: 1.dip dp sp 简单用法 2.适配不同分辨率屏幕图片的处理方法 支持不同的密度或分辨率 本课介绍如何通过提供不同的资源和使用的测量分辨率独立单元支…

网络工程师成长日记333-某城市政府项目
网络工程师成长日记333-某城市政府项目 这是我的第333篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 直接上干货,拓扑图: 工程目的:排除故障配置如下:LinWei#show running-configBuilding c…

linux环境编程-- ftok()函数
系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。 ftok原型如下: key_t ftok( char * fname, int id )fname就时你指定的文件名(该文件必须是存在而且可以访问的),id是…

使用 ChatterBot 库制作一个聊天机器人
作者 | 周萝卜来源 | 萝卜大杂烩我们学习一些如何使用 ChatterBot 库在 Python 中创建聊天机器人,该库实现了各种机器学习算法来生成响应对话,还是挺不错的1什么是聊天机器人聊天机器人也称为聊天机器人、机器人、人工代理等,基本上是由人工智…

powerDesign设计随笔
PowerDesigner的Table视图同时显示Code和Name的方法 实现方法:Tools-Display Preference powerDesigner设置 name不自动等于code 从数据库里抽取了数据模型,为了理清思路,需要将name改为中文名称,但是pd自动将name填充为code&…

Apache Kylin在绿城客户画像系统中的实践
前言\\作为国内知名的房地产开发商,绿城经过24年的发展,已为全国25万户、80万人营造了美丽家园,并将以“理想生活综合服务提供商”为目标,持续为客户营造高品质的房产品和生活服务。\\2017年,绿城理想生活集团成立&…

linux环境编程--IPC 之 msg queue
消息队列在UNIX的SystemV版本,AT&T引进了三种新形式的IPC功能(消息队列、信号量、以及共享内存)。但BSD版本的UNIX使用套接口作为主要的IPC形式。Linux系统同时支持这两个版本。系统调用msgget() 如果希望创建一个新的消息队列࿰…

2021 IDEA大会圆满落幕,一文回顾大会精彩看点
11月23日,为期两天的2021 IDEA大会在深圳福田圆满落幕。2021 IDEA大会由深圳市福田区人民政府、深圳市福田区科技创新局和粤港澳大湾区数字经济研究院(International Digital Economy Academy,简称“IDEA”)联合举办。深圳市科创委…

【转】Android下编译jni库的二种方法(含示例) -- 不错
原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是:1)使用Android源码中的Make系统2)使用NDK(从NDK r5开始)---------------------------------源码要求&…

linux下如何修改系统时间
我们一般使用“date -s”命令来修改系统时间。比如将系统时间设定成2018年2月23日的命令如下。 #date -s 02/23/2018 将系统时间设定成下午11点12分0秒的命令如下。 #date -s 11:12:00 注意,这里说的是系统时间,是linux由操作系统维…

thttpd服务器
1 引言随着微处理器技术、计算机网络技术的进步,基于嵌入式WEB的网络数字视频监控系统逐渐得到了人们的广泛关注。把图像采集、视频压缩和WEB功能集中到一个体积很小的设备内,可以直接连入局域网和Internet,达到即插即用,省掉多种…

链接产业 聚变未来 | 移动云区块链开发者论坛来了
有人认为,如果说蒸汽机释放了人们的生产力,电力解决了人们基本的生活需求,互联网改变了信息传递的方式,那么区块链作为构造信任的机器,将可能改变整个人类社会价值传递的方式。区块链已走进大众视野,成为社…

Bzoj4016: [FJOI2014]最短路径树问题
题面 传送门 Sol 先\(SPFA\)求出单源最短路,\(Bfs\)建出树,字典序可以用堆解决 然后就是点分治的一眼题 开桶记录到当前根经过边长度相同的最长路,记录它的长度 自己强行\(yy\)了一个这种类型的点分丑陋写法 # include <bits/stdc.h> #…

libevent源码深度剖析
原文地址:http://blog.csdn.net/sparkliang/article/details/4957667libevent源码深度剖析一——序幕张亮1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少。写这一系列文章的用意在于&#…

元宇宙中可跨语种交流!Meta 发布新语音模型,支持128种语言无障碍对话
编译 | 禾木木出品 | AI科技大本营(ID:rgznai100)语言交流是人类互动一种自然的方式,随着语音技术的发展,我们可以与设备以及未来的虚拟世界进行互动,由此虚拟体验将于我们的现实世界融为一体。然而,语音技…

前端面试官,我为什么讨厌你。
近两年来,参加过的前端面试不下二十场了,吐槽一下。我所经历的,都是小公司,大公司的同学请无视。 招聘信息能否不要装逼?写一大堆你项目根本用不上的,来给谁看?我曾遇到上面写了一堆对js如何要求…

【ASP.NET Core】解决“The required antiforgery cookie xxx is not present”的错误
当你在页面上用 form post 内容时,可能会遇到以下异常: The required antiforgery cookie "????????" is not present. 咱们来重现一下错误。新建一个 ASP.NET Core 项目,模板选【空】就行了,这是老周最喜欢的项…

linux系统级别的能够打开的文件句柄的数file-max命令
简单的说, max-file表示系统级别的能够打开的文件句柄的数量, 而ulimit -n控制进程级别能够打开的文件句柄的数量.man 5 proc, 找到file-max的解释:file-max中指定了系统范围内所有进程可打开的文件句柄的数量限制(系统级别, kernel-level). (The value …

这封以数字构写的蓝图,正在实现笔尖所触即世界
作者 | 贾凯强出品 | AI科技大本营(ID:rgznai100)一撇一捺,一勾一抹,笔走龙蛇,可见真意。笔者小时候字迹潦草,便总是抱怨为什么一定要写字好看?而如今计算机统治了世界,键盘和鼠标早…

Svn 笔记—— Hooks
pre-commit 钩子功能:[rootDa hooks]# cat /application/svndata/sadoc/hooks/pre-commit#!/bin/bash#Check message lenth ---更新版本时强制输入信息小于5个字符会退出REPOS"$1"TXN"$2"logmsgsvnlook log -t $TXN $REPOS |grep &q…

22.CSS边框与背景【上】
第十七章 CSS边框与背景【上】 一、声明边框 属性 值 说明 CSS版本 1、border-width 长度值 设置边框的宽度(可选) 1 2、border-style 样式名称 设置边框的样式(必选&…