基于TCP协议的网络编程流程

服务器端:
1) socket(),创建套接字文件,用于连接
2) bind(), 绑定,把socket()函数返回的文件描述符和IP、端口号进行绑定;
3) listen(), (监听)将socket()返回的文件描述符的属性,由主动变为被动;
4) accept(), 阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,
则accept()函数返回,返回一个用于通信的套接字文件;
5) recv(), 接收客户端发来的数据; read()
6) send(), 发送数据;
7) close(), 关闭文件描述符;连接、通信

客户端:
1) socket(),创建套接字文件,既用于连接,也用于通信;
2) connect(); 用于发起连接请求;
3) send(), 发送数据;
4) recv(), 接收数据;
5) close(), 关闭文件描述符;

用到的API

1.int socket(int domain, int type, int protocol);   domain:地址族     type:TCP协议   protocol:协议族

功能: 创建套接字文件
参数:
domain:协议族
AF_UNIX, AF_LOCAL 用于本地通信
AF_INET IPv4 Internet protocols ip
AF_INET6 IPv6 Internet protocols ipv6

type:协议类型
SOCK_STREAM TCP
SOCK_DGRAM UDP

protocol:
一般情况下写0
系统默认自动帮助匹配对应协议
传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP
网络层:htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)

返回值:
成功: 返回一个文件描述符;
失败: -1

2. int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能: 绑定,将socket()返回值和IP/端口号进行绑定;

参数:
sockfd: 是socket()函数的返回值;
const struct sockaddr *addr:
struct sockaddr是结构体类型,是一个通用结构体;
struct sockaddr {
sa_family_t sa_family; // 2个字节typedef unsigned short int sa_family_t; //
char sa_data[14]; // 14字节
}
整个结构体大小为16个字节

******在填充的时候填充struct sockaddr_in ;
struct sockaddr_in {
unsigned short sin_family; //协议IPv4,2个字节
unsigned short sin_port; //端口号 ,2个字节
struct in_addr sin_addr;
struct in_addr {
__be32 s_addr; //IP地址,4个字节
};
/* Pad to size of `struct sockaddr'. */
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
sizeof(unsigned short int) - sizeof(struct in_addr)];
//8个字节
};

addrlen:结构体的大小;
sizeof(serveraddr);
返回值:-1 失败

3.int listen(int sockfd, int backlog);

功能: 用于监听,将主动套接字变为被动套接字;
参数:
sockfd: socket()的返回值
backlog:客户端同时连接服务器的最大个数;(队列1:保存正在连接)     (队列2,连接上的客户端)
返回值:失败 -1

4.int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,则accept()函数返回,返回一个用于通信的套接字文件;
参数:
sockfd:同上
addr: 如果不需要关系具体是哪一个客户端,那么可以填NULL;
addrlen:如果不需要关系具体是哪一个客户端,那么可以填NULL;
返回值: 文件描述符;acceptfd;

5.ssize_t recv(int sockfd, void *buf, size_t len, int flags);

功能: 接收数据
参数:
sockfd: acceptfd ;
buf 存放位置
len 大小
flags 一般填0

6.其他API

int inet_aton(const char *cp, struct in_addr *inp);

in_addr_t inet_addr(const char *strptr);       两个函数都是将主机点分十进制IP转化为网络字节序

char *inet_ntoa(stuct in_addr inaddr);将32位网络字节序二进制地址转换成点分十进制的字符串。

u_long htonl (u_long hostlong); 主机字节序到网络字节序

u_short htons (u_short short);主机字节序到网络字节序

u_long ntohl (u_long hostlong);网络字节序到主机字节序

u_short ntohs (u_short short);网络字节序到主机字节序

7.int connect(int sockfd, const struct sockaddr *addr,ocklen_t addrlen);

功能:用于连接服务器;
参数:sockfd:socket函数的返回值
addr: 填充的结构体是服务器端的;
addrlen:结构体的大小
返回值     -1 失败,正确 0

8. ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送数据
参数:基本同recv
flags 如果天0,相当于write();

转载于:https://www.cnblogs.com/huiji12321/p/11349766.html

step5 . day2 网络编程 基于TPC协议的网络编程流程及API相关推荐

  1. step5 . day3 网络编程 基于TPC协议的网络编程Demo,类FTP功能

    1.客户端 //cilent code #include <stdio.h> #include <sys/types.h> #include <sys/socket.h& ...

  2. step5 . day4 网络编程 基于UDP协议的网络编程流程及API

    UDP协议是面向无连接,不可靠的传输协议,编程流程如下; 服务器端: 1. socket(),返回一个文件描述符,用于通信 2. bind(); //得先完成结构体的填充sockaddr_in 3. ...

  3. 网络编程——基于TCP协议的通讯录【课程设计】

    网络编程--基于TCP协议的通讯录[课程设计] 本文目录 网络编程--基于TCP协议的通讯录[课程设计] 一.设计题目和要求 设计目标: 课程设计系统组成及模块功能: 二.设计内容 服务端 客户端 S ...

  4. 用C#实现基于TCP协议的网络通讯

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  5. 用C#实现基于TCP协议的网络通讯(1)

    2008-09-09 19:35 作者: 出处:www.4oa.com ( 11 ) 砖   ( 12 ) 好  评论 ( 0 ) 条 进入论坛 更新时间:2005-09-29 14:54 关 键 词 ...

  6. java socket 通信协议_java 基于TCP协议的Socket编程和通信

    java 基于 TCP 协议的 Socket 编程和通信 在网络通讯中,第一次主动发起通讯的程序被称作客户 端 (Client) 程序, 简称客户端, 而在第一次通讯中等待连接的 程序被称作服务器端 ...

  7. 基于TCP协议的网络摄像头的设计与实现

    一.摘要 基于TCP协议的网络摄像头的设计大部分和博文"基于UDP协议的网络摄像头的设计与实现"相同,本篇博文采用的TCP协议栈为NicheStack协议栈(同理,可使用LWIP协 ...

  8. 用C#实现基于TCP协议的网络通讯(2)

    2008-09-09 19:36 作者: 出处:www.4oa.com ( 11 ) 砖   ( 12 ) 好  评论 ( 0 ) 条 进入论坛 更新时间:2005-09-29 14:54 关 键 词 ...

  9. 篡改计算机网络,基于TCP协议的网络数据实时篡改.doc

    基于TCP协议的网络数据实时篡改 基于 TCP 协议的网络数据实时篡改 金 瓯,施 勇,薛 质(上海交通大学信息安全工程学院,上海 200240)[摘 要]首先对网络数据实时篡改作了定义,指出攻击者介 ...

最新文章

  1. 【转载】SAP表修改概览
  2. eval并发 shell_Shell 实现多任务并发
  3. Anaconda3-5.3.0-Windows-x86_64
  4. android 美颜录像,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频
  5. VC++2012编程演练数据结构《35》多路平衡归并
  6. 插入排序(边输边排)
  7. 直播带货的罗永浩再被限制高消费!本人回应:已取消 会尽快还债
  8. 百度地图多点路线规划_自驾游路线规划神器:高德地图路书功能
  9. python零基础教学plc_Python从基础到开发精修全面学习视频教程
  10. catia投图只投外轮廓线_catia作图小技巧
  11. 软件间对接时,常用的接口类型和协议类型有哪些
  12. 2019信用卡权益总结之十三:延误险
  13. WiFi覆盖下的生活 享受便利的同时 别忘记了安全
  14. Redmi AirDots只有一边有声音?? 如何进行双耳连接?
  15. 前端展示m3u8视频
  16. Android-如何自定义crash处理器
  17. 【转】最容易理解的对卷积(convolution)的解释
  18. 一步步读懂Pytorch Chatbot Tutorial代码(四) - 为模型准备数据
  19. 何制作手机自适应网页
  20. A. New Year and Hurry

热门文章

  1. 推箱子java下载_Java实现简单推箱子游戏
  2. mysql导出数据意义_导出数据库的意义
  3. 排列出所有子串暴力递归
  4. liunx命令(13)——df、free
  5. 第三章 PX4-SPI底层驱动解析
  6. POJ 1932 XYZZY (差分约束+传递闭包)
  7. 基于Google测试框架实现自己的测试框架
  8. c++ primer 5th,习题13.3 答案是不是错了?(未解决)
  9. 【c++】为什么类中静态(static)成员不能在类的定义内初始化?
  10. exit() 与_exit的区别