socket套接字TCP API

socket概念

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

    只是熟悉socket总归是有优点的。

套接字地址结构

  • IP地址+port号能够唯一确定一个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);
  • TCPclient用connect函数与server端建立连接
  • 此函数将激发TCP的三次握手连接过程,直到链接建立成功或出错才返回
  • 每一个socket仅仅能调用一次connect,出错后必须close当前socket再次又一次依次调用socket、connect
  • 函数參数为socket描写叙述符。通用socket地址指针及其结构体大小。

bind函数

  • bind将IP地址和port绑定到套接字描写叙述符

    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来调用,则无法得到client已连接套接字表示的地址与port等信息。

  • 对于每一个处理完毕的连接,应该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通信client与server端

client流程

  • 使用connect连接server之后就能够開始数据传输

server端流程

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

源码例如以下:

  • server端
#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);
}
  • client
#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");
}
else
printf("%s\n", buf); exit(0);
}

 

 

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

版权声明:本文博客原创文章,博客,未经同意,不得转载。

socket套接字TCP API的更多相关文章

  1. 02网络编程( socket套接字+TCP粘包 )

    目录 02 网络编程 一.socket套接字编程 二.简易代码模板 2.1 服务端 2.2 客户端 三.通信循环及代码优化 四.黏包现象 五.struct模块 六.简易版本报头 七.上传文件数据 * ...

  2. socket套接字TCP协议传输-案例测试

    术语: 套接字接口:socket,是一个IP地址和一个端口号的组合,套接字可以唯一标识整个Internet中的一个网络进程. TCP连接:一对套接字接口(一个用于接收,一个用于发送)可定义面向连接的协 ...

  3. 传输模型, tcp socket套接字

    osi七层模型 tcp/ip四层模型 socket套接字 tcp 协议是可靠的  包括 三次握手 四次挥手 import socket # server server = socket.socket( ...

  4. python--socket套接字/TCP

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

  5. Socket(套接字) IP TCP UDP HTTP

    Socket(套接字) 阮老师的微博 (转)什么是套接字(Socket)? 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进 ...

  6. Python 31 TCP协议 、socket套接字

    1.TCP协议 可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割. (1)三次握手建链接( ...

  7. 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法

    网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) ​ 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...

  8. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

  9. [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序]

    [网络编程之Socket套接字介绍,套接字工作流程,基于TCP协议的套接字程序] 为何学习socket套接字一定要先学习互联网协议: 1.首先:要想开发一款自己的C/S架构软件,就必须掌握socket ...

随机推荐

  1. Windows Phone开发(20):当MediaElement和VideoBrush合作的时候

    原文:Windows Phone开发(20):当MediaElement和VideoBrush合作的时候 前面说的那么多控件都是"静态"的,都是"哑吧"的,今天 ...

  2. 第4周 页面限制8060 bytes

    原文:第4周 页面限制8060 bytes 恭喜您!在你面前就只剩下几页了,然后你就可以完成第1个月的SQL Server性能调优培训了.今天我将讲下页的一些限制,还有为什么你会喜欢这些限制,同时也会 ...

  3. js调用百度地图接口

    原文:js调用百度地图接口 这是前几天公司做的新项目,上面需要用到地图的数据.第一次做这类型的东西没啥思路,咱们经理说,这东西简单,截个图存文件夹里调整好尺寸,数据库里存上图片的地址动态调用就行了.心 ...

  4. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(二)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

  5. Unreal Engine 4 创建Destructible Mesh(可破坏网格)

    Unreal Engine 4的物理引擎用的是PhysX. 支持网格破坏.布料.物理粒子等,非常强大.曾经须要编码才干完毕的工作,在Unreal Engine 4 中仅仅须要拖拖拽拽就完毕了,非常方便 ...

  6. Blend4精选案例图解教程(四):请给我路径指引

    原文:Blend4精选案例图解教程(四):请给我路径指引 路径在界面设计中,可以起到很好的辅助作用,我常常使用它来对元素进行规则排列和非规则排列控制. 本次教程将演示,Blend中路径的常规用法. 1 ...

  7. 玩转html5(二)----用canvas结合脚本在画布上画简单的图(html5又一强大功能)

    在html5中可以使用canvas标签在画布上画图,先直接上代码,这篇文章先简单介绍一下canvas的使用方法,简单画几个圆,矩形,三角形,写字. 在代码中均给出了注释,在这里特别强调的一点是:使用c ...

  8. B. Dreamoon and WiFi(Codeforces Round 272)

    B. Dreamoon and WiFi time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. 20那天android得知

    20多天的实习(事实上,一个人学习的东西)要结束, 剩下的只是读研. 这项20许多天我学到了很多东西, 对android的发展也有了一定的了解.之后写这篇文章主要完成的研究可以得知快速回升 1.安德鲁 ...

  10. Android自己主动化測试——CTS測试

    一.为什么须要兼容性測试(下面称CTS)? 1.1.让APP提供更好的用户体验.用户能够选择很多其它的适合自己设备的APP.让APP更稳定. 1.2.让开发人员设计更高质量的APP. 1.3.通过CT ...