当前位置: 首页 > 编程日记 > 正文

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]; /* 填充以保持与struct sockaddr同样大小 使用memset()bzero()来填充*/ 
};

struct sockaddr { 
        unsigned short sa_family; /* 地址族, AF_xxx */ 
         char sa_data[14]; /* 14 字节的协议地址 */

};


2DNS结构
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); 
domainAF_INETsocket的类型,typeSOCK_STREAM SOCK_DGRAM,分别表示TCP连接和UDP连接;protocol0

返回一个整型socket描述符。


2.bind: 

socket描述符与你本机上的一个端口相关联(仅用于服务器)

int bind(int sockfd,struct sockaddr *my_addr, int addrlen);

Sockfd是一个socket描述符
my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;
addrlensizeof(struct sockaddr)。 
返回:成功=0;失败=-1errno=错误号。
可以用下面的赋值自动获得本机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;失败=-1errno=错误号。

4Listen: 

监听是否有服务请求 ,用于bind()
int listen(int sockfd, int backlog); 
SockfdSocket系统调用返回的socket 描述符;
backlog指定在请求队列中允许的最大请求数,缺省值为20
返回:成功=0;失败=-1errno=错误号。

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地址及端口号。
fromlensizeof(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_INETAF_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_INETAF_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是\怎么记呢&#xff1f;\和w是不是一样的反向&#xff1f;所以Linux的目录就是反的反向&#xff0c;好记了。 一&#xff1a;open函数名称&#xff1a;open目标&#xff1a;打开一个文件。头文件&#xff1a;#include <sys/types.h>#in…

Firefox插件

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

马斯克公开支持“上班摸鱼”:让工作更愉快!

整理 | 王晓曼出品 | 程序人生 &#xff08;ID&#xff1a;coder _life&#xff09;11月16日&#xff0c;在国美集团批评员工上班摸鱼的通报中&#xff0c;一名员工在网易云音乐上使用了22.5G的流量格外显眼。11月18日&#xff0c;网易云音乐也紧跟热点上线了摸鱼计算器活动&am…

瀚思首发三款产品 推动大数据安全战略布局

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

Linux环境编程--编辑器基本操作

vim使用 新建文件 #vim hello.c 插入模式 按下I键&#xff0c;底下出现- - 插入- - 换行&#xff1a;按下Enter 删除字符&#xff1a;普通模式下按x 删除整行&#xff1a;按dd 恢复删除&#xff1a;按u 取消命令&#xff1a; CtrlR 对U后果弥补 复制&#xff1a;y y2w复制2个…

2021 IDEA大会开启AI思想盛宴,用“创业精神”做科研

11月22日上午10时许&#xff0c;由深圳市福田区人民政府、深圳市福田区科技创新局和粤港澳大湾区数字经济研究院&#xff08;International Digital Economy Academy, 简称“IDEA”&#xff09;联合举办的2021 IDEA大会在深圳福田开幕。大会以“The World Needs a Few Good IDE…

Android不同分辨率和不同密度适配

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

网络工程师成长日记333-某城市政府项目

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

linux环境编程-- ftok()函数

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

使用 ChatterBot 库制作一个聊天机器人

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

powerDesign设计随笔

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

Apache Kylin在绿城客户画像系统中的实践

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

linux环境编程--IPC 之 msg queue

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

2021 IDEA大会圆满落幕,一文回顾大会精彩看点

11月23日&#xff0c;为期两天的2021 IDEA大会在深圳福田圆满落幕。2021 IDEA大会由深圳市福田区人民政府、深圳市福田区科技创新局和粤港澳大湾区数字经济研究院&#xff08;International Digital Economy Academy&#xff0c;简称“IDEA”&#xff09;联合举办。深圳市科创委…

【转】Android下编译jni库的二种方法(含示例) -- 不错

原文网址&#xff1a;http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下&#xff1a;两种方法是&#xff1a;1&#xff09;使用Android源码中的Make系统2&#xff09;使用NDK&#xff08;从NDK r5开始&#xff09;---------------------------------源码要求&…

linux下如何修改系统时间

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

thttpd服务器

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

链接产业 聚变未来 | 移动云区块链开发者论坛来了

有人认为&#xff0c;如果说蒸汽机释放了人们的生产力&#xff0c;电力解决了人们基本的生活需求&#xff0c;互联网改变了信息传递的方式&#xff0c;那么区块链作为构造信任的机器&#xff0c;将可能改变整个人类社会价值传递的方式。区块链已走进大众视野&#xff0c;成为社…

Bzoj4016: [FJOI2014]最短路径树问题

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

libevent源码深度剖析

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

元宇宙中可跨语种交流!Meta 发布新语音模型,支持128种语言无障碍对话

编译 | 禾木木出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;语言交流是人类互动一种自然的方式&#xff0c;随着语音技术的发展&#xff0c;我们可以与设备以及未来的虚拟世界进行互动&#xff0c;由此虚拟体验将于我们的现实世界融为一体。然而&#xff0c;语音技…

前端面试官,我为什么讨厌你。

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

【ASP.NET Core】解决“The required antiforgery cookie xxx is not present”的错误

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

linux系统级别的能够打开的文件句柄的数file-max命令

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

这封以数字构写的蓝图,正在实现笔尖所触即世界

作者 | 贾凯强出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;一撇一捺&#xff0c;一勾一抹&#xff0c;笔走龙蛇&#xff0c;可见真意。笔者小时候字迹潦草&#xff0c;便总是抱怨为什么一定要写字好看&#xff1f;而如今计算机统治了世界&#xff0c;键盘和鼠标早…

Svn 笔记—— Hooks

pre-commit 钩子功能&#xff1a;[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 长度值 设置边框的宽度&#xff08;可选&#xff09; 1 2、border-style 样式名称 设置边框的样式&#xff08;必选&…