1. 基本流程

2. socket()

int socket(int domain, int type, int protocol);

socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1。
(1)domain:
AF_INET:IPv4
AF_INET6: ipv6
AF_UNIX:非网络环境
AF_UNSPIC:undefined
(2)type

SOCK_STREAM:创建TCP流套接字

SOCK_DGRAM:创建UDP数据报套接字

SOCK_RAW:创建原始套接字

(3)protocol:指定某个协议的特定类型
参数protocol通常设置为0,表示通过参数domain指定的协议族和参数type指定的套接字类型来确定使用的协议。

(4)返回值
执行成功后返回一个新创建的套接字;若有错误发生则返回一个-1,错误代码存入errno中。

3. bind()

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

函数bind()的作用是将一个套接字文件描述符与地址和端口绑定。

(1)sockfd:

sockfd是调用socket函数返回的文件描述符;

(2)addrlen

sockaddr结构的长度。

(3)my_addr

一个指向sockaddr结构的指针,它保存着本地套接字的地址(即端口和IP地址)信息。不过由于系统兼容性的问题,一般不使用这个结构,而使用另外一个结构(structsockaddr_in)来代替

(4)return

函数成功后返回0,当有错误发生时则返回-1,错误代码存入errno中。

struct sockaddr_in addr_serv,addr_client;/*本地的地址信息*/
memset(&serv_addr,0,sizeof(structsockaddr_in));
addr_serv.sin_family= AF_INET;/*协议族*/
addr_serv.sin_port= htons(SERV_PORT);/*本地端口号*/
addr_serv.sin_addr.s_addr= htonl(INADDR_ANY); /*任意本地地址*/
/*套接字绑定*/ if(bind(sock_fd,(structsockaddr *)&addr_serv),sizeof(struct sockaddr_in)) <0)
{
perror(“bind”);
exit(1);
}

4. listen()

int listen(int sockfd,int list_size);

用来初始化服务器可连接队列,服务器处理客户端连接请求的时候是顺序处理的,同一时间仅能处理一个客户端连接。当多个客户端的连接请求同时到来的时候,服务器并不是同时处理,而是将不能处理的客户端连接请求放到等待队列中,这个队列的长度由listen()函数来定义。

(1)sockfd

sockfd是调用socket函数返回的文件描述符

(2)list_size

指定该连接队列的最大长度。如果连接队列已经达到最大,之后的连接请求被服务器拒绝。大多数系统的设置为20,可以将其设置修改为5或者10,根据系统可承受负载或者应用程序的需求来确定。

(3)return

当listen()函数成功运行时,返回值为0;当运行失败时,它的返回值为-1,错误代码存入errno中。

5. accept()

#include<sys/types.h>

#include<sys/socket.h>

int accept(int sock_fd,struct sockaddr*addr,socklen_t *addrlen)

3次握手完成后,server会调用accept()接受一个链接请求。

如果在调用此函数之前,没有链接请求就会把进程阻塞,等待链接sock_fd:建立套接字时返回的套接字文件描述符,调用socket()返回的。

(1)sock_fd

是由函数socket创建,经函数bind绑定到本地某一端口上,然后通过函数listen转化而来的监听套接字。

(2)addr

用来保存客户端的地址和端口。

注:返回参数

(3)addrlen

入:addr缓冲区的大小。

出:addr 所指向的结构体的大小。

(4) return

accept()函数的返回值是新连接的客户端套接字文件描述符,与客户端之间的通信是通过accept()返回的新套接字文件描述符来进行的,而不是通过建立套接字时的文件描述符。如果accept()函数发生错误,accept()会返回-1,通过errno可以得到错误值。

(5)如果参数sock_fd所指定的套接字被设置为阻塞方式(Linux下的默认方式),且连接请求队列为空,则accept()将被阻塞直到有连接请求到此为止;如果参数s所指定的套接字被设置为非阻塞方式,如果队列为空,accept将立即返回-1,errno被设置为EAGAIN.

6. connect()

#include<sys/types.h>

#include<sys/socket.h>

int connect(int sock_fd,struct sockaddr  *serv_addr,socklen_taddrlen);

TCP:则connect()函数用于服务器发出连接请求,服务器的IP地址和端口号由 参数serv_addr指定。

UDP:则connect函数并不建立真正的连接,它只是告诉内核与该套接字进行通信的目的地址(由第二个参数指定),只有该目的地址发来的数据才会被该socket接收。调用connect函数的好处是不必在每次发送和接收数据时都指定目的地址。

(1)serv_addr

是一个指向数据结构sockaddr的指针,其中包括客户端需要连接的服务器的目的IP地址和端口号。

(2)addrlen

表示了第二了参数的大小,可以使用sizeof(struct sockaddr)

(3)return

执行成功后返回0,有错误发生则返回-1,错误代码存入errno中。

7. send()

#include<sys/types.h>

#include<sys/socket.h>

ssize_t send(int conn_fd,const void *buf,size_t len, int flags);

函数send用来在TCP套接字上发送数据,send只能对处于连接状态的套接字使用。

(1)conn_fd

为已建立好连接的套接字描述符,即调用accept()函数后返回的套接字描述符。

(2)buf

存放发送数据的缓冲区。

(3)len

发送缓冲区的长度

(4)flags

为控制选项,一般设置为0,或取以下值:

  • MSG_OOB:在指定的套接字上发送带外数据(out-of-band data),该类型的套接字必须支持带外数据(如:SOCK_STREAM).

  • MSG_DONTROUTE:通过最直接的路径发送数据,而忽略下层协议的路由设置。

(5)return

执行成功返回实际发送数据的字节数,出错则返回-1,错误代码存入errno中。

执行成功只是说明数据写入套接字的缓冲区中,并不表示数据已经成功地通过网络发送到目的地。

8. recv() 接收数据

#include<sys/types.h>

#include<sys/socket.h>

ssize_t recv(int conn_fd,void *buf,size_t len,int flags)

recv()用来TCP套接字上接收数据。函数recv从指定的套接字描述符上接收数据并保存到指定buf中

(1)conn_fd

为已建立好连接的套接字描述符,即调用accept()函数后返回的套接字描述符

(2)buf

接收缓冲区

(3)len

接收缓冲区的大小

(4)flags

为控制选项,一般设置为0或取以下数值

  • MSG_OOB:请求接收带外数据

  • MSG_PEEK:只查看数据而不读出

  • MSG_WAITALL:只在接收缓冲区满时才返回。

(5)return

函数执行成功返回接收到的数据字节数,出错返回-1,错误代码存入errno中。

Linux C 网络编程——3. TCP套接口编程的更多相关文章

  1. UNIX网络编程读书笔记:基本TCP套接口编程

    编写一个完整的TCP客户和服务器程序所需要的基本套接口函数: 1.socket函数(客户端.服务器端都必须调用) 参数family指明协议族(family),该参数也往往被称为协议域(domain). ...

  2. 值得收藏的TCP套接口编程文章

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由jackieluo发表于云+社区专栏 TCP客户端-服务器典型事件 下图是TCP客户端与服务器之间交互的一系列典型事件时间表: 首先启 ...

  3. 【转】Linux C 网络编程——TCP套接口编程

    地址:http://blog.csdn.net/matrix_laboratory/article/details/13669211 2. socket() <span style=" ...

  4. UNIX网络编程读书笔记:基本SCTP套接口编程

    概述 SCTP是一个较新的传输协议,于2000年在IETF得到标准化(TCP是在1981年标准化的).它最初是为满足不断增长的IP电话市场设计的:具体地说,就是穿越因特网传输电话信令. SCTP是一个 ...

  5. UNIX网络编程读书笔记:基本UDP套接口编程

    概述 使用UDP编写的一些流行的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 如下图所示,给出了典型的UDP客户/服务器程序的函数调用: 客户不与服务器建立连 ...

  6. Python网络编程之TCP套接字简单用法示例

    Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...

  7. UNIX网络编程——基本TCP套接字编程

    一.基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的 ...

  8. <网络编程>基本TCP套接字编程

    tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...

  9. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

随机推荐

  1. E: Invalid operation build-depgcc(给字符界面的ubuntu安装gcc 报错

    sudo apt-get  build-depgccE: Invalid operation build-depgcc 原因是中间少了个空格, 使用如下命令即可. sudo apt-get  buil ...

  2. Bootstrap-CL:超大屏幕

    ylbtech-Bootstrap-CL:超大屏幕 1.返回顶部 1. Bootstrap 超大屏幕(Jumbotron) 本章将讲解 Bootstrap 支持的另一个特性,超大屏幕(Jumbotro ...

  3. 一些部署django用到的linux命令

    mv untitled45/ /1601F/wang/ 将XXXX移动到XXX,也可以用于给XXX重新命名 zip -r -q -o hello.zip  /1601F/3/untitled45 安静 ...

  4. Docker系列06:Linux修改docker镜像和容器数据存储位置

    指定镜像和容器存放路径的参数是--graph=/var/lib/docker,其默认存储位置为/var/lib/docker, Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的 ...

  5. python之解析json

    json的格式是一个无序的键值对的集合,对象以{}包含,键值中间用:隔开,两个键值对之间用,隔开,值可以是双引号引起来的字符串(string),数值(number),true,false,null,对 ...

  6. Linux安装Python虚拟环境virtualenv

    1.安装virtulenv.virtulenvwrapper包 pip install virtualenv virtualenvwrapper 2.virtualenvwrapper是virtual ...

  7. Eclipse去掉对jQuery的错误提示

    1.I have found that I can leave the JavaScript Validator enable and ignore specific files by adding ...

  8. js动态加载数据到文本框指定的位置

    html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  9. fft 远程服务器返回错误 550返回码

    "远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件)"时,可能是如下原因: 1.URL路径不对,看看有没有多加空格,或者大小写问题 2.权限是否足 3.需 ...

  10. mongoTemplate.aggregate()聚合查询

    一.概述 1. 聚合的表达式 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 下表展示了一些聚 ...