socket套接字TCP API

socket概念

  • socket又称“套接字”,是计算机网络中进程间通信数据通道的一个端点,或称之为句柄。IP地址+端口号就可以唯一确定一个socket。
  • TCP/IP协议族包括传输层(TCP/UDP),网络层(ICMP/IP/IGMP),链路层(ARP/RARP)。应用层通常使用socket地址,即IP地址+端口号来确定通信的对端。而socket正是TCP/IP协议族与应用层之间的接口层,可以说对上层提供了TCP/IP协议族的一种封装,无需关心更底层的实现。
  • 应用上通常使用一些更高层的协议库来编程,socket更多归类于底层驱动编程。不过熟悉socket总归是有好处的。

套接字地址结构

  • IP地址+端口号可以唯一确定一个socket套接字地址,命名为sockaddr_in,位于netinet/in.h头文件中,定义如下。

    struct in_addr{in_addr_t s_addr;
    };
    struct sockaddr_in{uint8_t sin_len;sa_family_t sin_family;in_port_t sin_port;struct in_addr sin_addr;char sin_zero(0);
    };
  • in_addr_t in_port_t位于netinet/in.h
  • in_addr_t一般定义为uint32_tin_port_t一般定义为uint16_t
  • sa_family_t位于sys/socket.h
  • uint8_t等位于sys/types.h
  • sin_addr sin_port即为以网络字节序存储的32位ip地址与端口号
  • 套接字地址有很多种,为了能够统一以指针的形式使用socket API,使用时需要转换为通用套接字地址sockaddr,一般进行强制类型转换即可。

socket基本TCP API

  • 相关函数定义于sys/socket.h

    socket函数

  • socket函数用以创建一个socket。
    int socket(int family, int type, int protocal);
  • family通常设置为AF_INET``AF_INET6,分别表示IPv4/6协议。
  • type通常设置为SOCK_STREAM SOCK_DGRAM SOCK_RAW,分别表示字节流(TCP),数据报(UDP),原始套接字。
  • protocal表示协议族,IPPROTO_TCP'IPPROTO_UDP`通常设置为0也可。
  • 返回值表示非负套接字描述符

connect函数

  • 用于建立连接

    int connect(int sockfd, const struct sockaddr *servaddr, int addrlen);
  • TCP客户端用connect函数与服务器端建立连接
  • 此函数将激发TCP的三次握手连接过程,直到链接建立成功或出错才返回
  • 每个socket只能调用一次connect,出错后必须close当前socket再次重新依次调用socket、connect
  • 函数参数为socket描述符,通用socket地址指针及其结构体大小。

bind函数

  • bind将IP地址和端口绑定到套接字描述符

    int bind(int sockfd, const struct sockadddr *myaddr, int addrlen);
  • 如果sin_addr.s_addr设置为INADDR_ANY,且主机有多个网络接口,则可以在多个网络接口接受用户connect

listen函数

  • listem将一个未调用connect函数的socket转换为一个被动监听套接字

    int listen(int sockfd, int backlog);
  • backlog规定了挂起连接的最大数量

accept函数

  • 内核为任一个监听套接字维护一个正在处于握手连接阶段的未完成连接队列,以及已完成连接队列
  • accept每次接受一个监听套接字描述符,返回一个已连接队列中的已连接套接字描述符
  • 已连接套接字的套接字地址与地址长度存放于cliaddr与addrlen指向的内存中。如果使用两个0来调用,则无法得到客户端已连接套接字表示的地址与端口等信息。
  • 对于每个处理完毕的连接,应该close,否则可能耗尽套接字描述符
    int accept(int sockfd, struct sockaddr *cliaddr, int *addrlen)

close函数

  • close一个TCP套接字默认行为是把socket标记为关闭后返回。但触发了四次挥手过程

    int close(int sockfd);

传送数据

  • 通常需要一个缓冲区,之后使用recv、send函数接收发送
  • read、write在*nix系统上也可以
    int recv(int sockfd, void *buf, size_t len, int flags);
    int send(int sockfd, const void *buf, size_t len, int flags);

TCP通信客户端与服务器端

客户端流程

  • 使用connect连接服务器之后就可以开始传输数据

服务器端流程

  • 需要首先绑定网络接口(bind),之后进入监听状态(listen),最后从队列中取出一个已经连接的套接字,即获得新连接(accept),之后可以开始传输数据

源代码如下:

  • 服务器端
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdio.h>int main(){struct sockaddr_in local;int s;int sl;int rc;char buf[1000];local.sin_family = AF_INET;local.sin_port = htons(7500);local.sin_addr.s_addr = htonl(INADDR_ANY);s = socket(AF_INET, SOCK_STREAM, 0);if ( s < 0){perror("socket call failed");exit(1);}rc = bind(s, (struct sockaddr *) &local, sizeof(local));if ( rc < 0){perror("bind call failed");exit(1);}rc = listen(s, 5);if ( rc < 0){perror("listen call failed");exit(1);}sl = accept(s, NULL, NULL);if ( sl < 0){perror("accept call failed");exit(1);}rc = recv(sl, buf, 10, 0);if ( rc < 0){perror("recv call failed");exit(1);}printf("%s\n", buf);rc = send(sl, "good", 10, 0);if ( rc < 0){perror("send call failed");exit(1);}exit(0);
}
  • 客户端
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>int main(){struct sockaddr_in peer;int s;int rc;char buf[100];peer.sin_family = AF_INET;peer.sin_port = htons(7500);peer.sin_addr.s_addr = inet_addr("127.0.0.1");s = socket(AF_INET, SOCK_STREAM, 0);if ( s < 0 ){perror("socket call failed");exit(1);}rc = connect(s, (struct sockaddr *) &peer, sizeof(peer));if (rc){perror("connect call failed");exit(1);}rc = send(s, "hello", 10, 0);if (rc <= 0){perror("send call failed");exit(1);}rc = recv(s, buf, 10, 0);if (rc <= 0){perror("recv call failed");}elseprintf("%s\n", buf);exit(0);
}

 
 

转载请注明作者:Focustc,博客地址为http://blog.csdn.net/caozhk,原文链接为点击打开

socket套接字TCP API相关推荐

  1. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

    2016.7.4 今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析. 1.需求分析 首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户 ...

  2. JavavEE中网络编程Socket套接字Ⅱ(TCP)

    文章目录 TCP流套接字 ServerSocket API Socket API

  3. java贪吃蛇客户端服务器_java Socket套接字TCP编程开发服务端和客户端之间的通信 - 贪吃蛇学院-专业IT技术平台...

    超级简单,没有太多实质内容的Socket服务端,客户端小程序 先运行server 再运行client OK 服务端代码如下: public class Server { public static v ...

  4. 【网络编程】Socket套接字;UDP数据报套接字编程;TCP流套接字编程

    文章目录 1. 什么是网络编程 2. 网络编程中的基本概念 3. Socket套接字 4 UDP数据报套接字编程 4.1 客户端服务器交互流程 4.2 UDP版本的回显服务 4.3 英译汉服务 5. ...

  5. python--socket套接字/TCP

    socket套接字/TCP 一 客户端/服务器架构 C/S架构,包括 硬件C/S架构(打印机) 软件C/S 架构(web服务) C/S架构的软件(软件属于应用层)是基于网络进行通信的 Server端要 ...

  6. JavavEE中网络编程Socket套接字Ⅰ(UDP)

    文章目录 Socket套接字 TCP和UDP的区别 UDP socket DatagramSocket DatagramPacket

  7. Socket套接字通信 TCP UDP详解(网络通信)

    文章目录 一 什么是套接字Socket 1.Socket简介 2.Socket的域(domain) 3.Socket主要类型(type) 4.Socket基本工作流程 二 创建套接字Socket 1. ...

  8. socket网络编程套接字TCP/UDP两种方式详解

    目录 准备知识 源IP地址和目的IP地址 端口号与进程ID 传输层协议--TCP 传输层协议--UCP 网络字节序 socket套接字介绍 概念 常见的三种socket socket编程常见API s ...

  9. 《UNIX网络编程 卷1:套接字联网API》学习笔记——基本TCP套接字编程

    UNIX网络编程--基本TCP套接字编程 socket 函数 connect 函数 bind 函数 listen 函数 accept 函数 fork 和 exec 函数 并发服务器 close 函数 ...

最新文章

  1. spring-boot入门之二——验证、AOP日志、异常处理
  2. java aop性能检测_Spring AOP 性能监控器
  3. Windows 2008 R2 Powershell 3.0
  4. 今週木曜日までの日程表
  5. I/O多路复用之epoll
  6. android 语音搜索动画,Android自定义控件实现UC浏览器语音搜索效果
  7. [bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式 (hash构造后缀数组,二分答案)
  8. ubuntu系统启动qtceator时提示:Qt5.5.1/Tools/QtCreator/lib/qtcreator/plugins/libHelp.so: 无法加载库...
  9. JavaScript 物体的运动
  10. 呼吸灯 裸机 S3C2416
  11. 说一说我电脑上的那些必备软件
  12. OAuth2.0+SpringSecurity+Jwt实现系统的登录认证,用户授权
  13. 基于Java Servlet图片服务器
  14. 【坊间盘点】最近哪些企业「跑步」入场?
  15. 互联网晚报 | 12月1日 星期三 | 支付宝上线“支付宝小荷包”功能;快手好物联盟升级为“快分销”;小米公益平台正式上线...
  16. 毕业设计-基于JSP的网上购书系统.doc
  17. 商界大忌,你占了几条?
  18. Error receiving broadcast Intent com.android.vending.billing PURCHASES_UPDATED flg=0x10 has extras
  19. 软件自动化测试项目总结,自动化测试总结报告.docx
  20. 过日子·混日子·奔日子

热门文章

  1. 安卓PHP maker汉化,android 百度地图marker添加自定义视图
  2. 光驱怎么挂载第二个光驱_电脑光驱怎么安装?台式机安装光驱的方法
  3. 筛选列_Excel办公实操,两大办公技能,复杂数据进行筛选,一看就会
  4. linux c普通用户怎么判断键盘是否按动_网络没问题,电脑却无法联网怎么办?win10无法联网搞定方式举例...
  5. gatk过滤_重测序2--看了不后悔的gatk-变异检测
  6. ROS中阶笔记(六):机器人感知—机器语音
  7. 云存储服务器销售,云存储服务器销售
  8. 荒野行动系统推荐观战榜_荒野行动 观战延迟投票结果公示 更新计划抢先看!...
  9. react 流程图框架_【赠书】Preact(React)核心原理详解Preact(React) 核心原理解析...
  10. java 中linux命令参数说明,java中linux命令参数说明