`
memorymyann
  • 浏览: 267596 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

3.TCP套接口编程

阅读更多

对于编程者来说,我们所见到的网络通信实际上是2个socket之间的通信。所以双方第一步会调用socket创建socket。此时系统内核会创建一个socket描述结构并返回该描述结构的描述字。对于服务器来说,系统自己创造的socket并不适合,因为我们要指定服务器socket的端口号,因此我们会调用bind函数,将我们自己定义的描述结构绑定到描述关键字上。对于客户端来说一般系统自己制定描述结构即可,因此调用bind函数没有什么太多的意义,但可以调用。但貌似指定指定通信的端口号,地址貌似没有意义。

 

1.socket函数。
int socket(int family, int type, int protocol);

 

返回socket描述字。

 

family指协议族:AF_INET IPV4协议,AF_INET6 IPV6协议, AF_LOCAL UNIX域协议, AF_ROUTE路由套接口协议, AF_KEY 密钥套接口协议。

 

type: SOCK_STREAM 字节流套接口, SOCK_DGRAM数据报套接口,SOCK_RAW 原始套接口。

 

protocol:一般设置为0,只有当使用原始套接口时候才有其它设置。

 

family和type组合

                                 AF_INET            AF_INET6        AF_LOCAL          AF_ROUTE           AF_KEY

SOCK_STREAM          TCP                   TCP                 YES

SOCK_DGRAM            UDP                  UDP                 YES

SOCK_RAW                IPV4                 IPV6                                          YES                      YES

 

TCP和UDP很容易理解,IPV4和IPV6应该是IP数据包通信方面。YES表示有效,但没有合适缩略词描述,空白表示无效组合。(还有可能其它的如PF_XXX或者AF_UNIX,这里没有列出)。

 

 

2.connect函数:客户端使用,用于建立一个与TCP服务器的连接。

int connect(int sockfd, const struct sockaddr * servaddr, socklen_t addrlen);返回0成功,返回-1出错。

sockfd:前面提到的描述字。

servaddr:服务器的套接口地址结构指针。

addrlen:地址结构指针的大小。

这个函数很简单。

 

这里没有指定从哪个端口连接服务器端口,因为内核会自动选择源地址和一个临时端口。至于绑定端口,看下面的bind函数。

 

connect会触发三路握手,具体的返回错误信息,这里就不列出了。

 

3.bind函数:给套接口分配一个本地的协议地址。

int bind(int sockfd, struct sockaddr * myaddr, socklen_t addrlen); 0成功,-1出错。

在socket函数中就已经创建了套接口socket,但此时的套接口是有系统指定的IP和端口号。有时我们需要自己来制定地址和端口号,这就通过bind函数,将自己的socket绑定到套接口描述字上。上面的函数参数就很容易理解了,addrlen表示的是myaddr的长度。

 

myaddr有3个信息,协议族,地址和端口号。

对于服务器来说:绑定端口号很明显,因为只有知道端口号,我们才能去和服务器通信,当然不绑定也是可以的,这样你就得通过其它办法获得端口号比如说询问网络管理员。绑定IP地址就比较令人费解。服务器绑定IP地址的意义,比如说局域网内,该服务器地址为192.168.1.2,如果你把该地址绑定入socket,那么其它机器就可以通过192.168.1.2来访问。但对于本机来说,它还可以通过127.0.0.1来访问,但此时链接失败,因为你绑定的地址是192.168.1.2而不是127.0.0.1。当然如果你在路由器上做了端口映射,但外网仍然不可以访问你的这台机器服务器进程。

 

对于客户端来说:一般我们不需要去绑定一个自定义的socket,因为系统分配的已经满足我们传输要求。绑定IP地址貌似没什么意义,但绑定端口会有一定作用,因为平常是有系统自动分配的端口去和服务器通信,如果你绑定了端口号,则你就会通过指定的端口号和对方通信。

 

4.listen函数

int listen(int sockfd, int backlog) 返回0成功,-1出错

listen将未连接的套接口转换成监听套接口,第2个参数则是指此套接口最大的排队数目。但backlog定义比较模糊,具体的需要man listen查询,每个系统在实现上各不相同。但想用此参数来限制链接数目是不现实的。

 

5.accept函数

int accept(int sockfd, struct sockaddr * cliaddr, socket_t * addrlen); 返回非负描述字, -1就是出错。

从已完成队列头返回下一个已完成队列,若已完成队列空,则进程睡眠(缺省阻塞方式)。参数cliaddr会返回客户端信息,而addrlen则返回该结构的大小(已写数据的大小))。

 

如果你希望刚刚的程序显示连接者的信息,你所需要加入的代码则是

struct sockaddr_in * client_socket; //IPV4地址套接口描述结构

socket_len len; //长度

char temp[30]; //用来存点十表示法的IP地址,只要IPV4只要大于16即可

connfd = accept(listenfd, (struct sockaddr *)client_socket, &len); //修改的部分

inet_ntop(AF_INET, &client_socket->sin_addr, temp, sizeof(temp)); //将client_socket中记录的IP地址变成点十进制,结果存在temp中,同时返回char *也会指向temp

printf("connection from %s, port %d\n", temp, ntohs(client_socket->sin_port));

 

关于返回值,返回非负的值,则这个值代表了与客户的TCP链接。这里listenfd代表监听套接口描述字,而connfd代表了已连接套接口描述字。比如说服务器和2个客户端通信,服务器IP地址为192.168.1.3,服务器进程监听的端口号是80,2台客户机分别是192.168.1.4和192.168.1.5.内核分配给他们通信的端口号分别为45173和45765。这里IP地址代表了机器,80号端口则代表的是进程(可以这么理解,只要是提交到192.168.1.3:80的请求,就是请求服务器进程服务)。此时链接建立,connfd则代表了链接,这里有2个客户机连接上了服务器,则会有2个connfd。以后传递数据就通过这个链接描述字。

 

6.close函数

close函数并不会触发客户端或者服务器发送结束字节fin,它只是将链接的共享计数减1,当共享计数减为0时候,才会触发客户端或者服务器发送结束字节fin.及时你调用了close并最终导致计数减为0,socket也会将剩余没有发送完的数据发送完毕后才会发送fin字节。

分享到:
评论

相关推荐

    基于Linux的TCP_IP网络通信编程.pdf

    3. Socket 编程:提供了灵活的网络编程接口,用于实现 TCP/IP 网络通信。 Linux 的 TCP/IP 网络通信编程方法具有广泛的应用前景,特别是在嵌入式系统开发中。 Linux 作为一个自由软件,具有内核小、效率高、源代码...

    基于TCP文件传输控制台程序.zip

    基于TCP文件传输控制台程序.zip 套接口编程 这是个控制台程序 基于TCP的文件传输 代码比较简洁 博客有介绍 地址: http://blog.csdn.net/xsl1990/article/details/8478527

    TCPIP网络编程指导及代码实例.pdf

    本文档为TCPIP网络编程指导及代码实例,涵盖了OSI七层结构、TCP/IP模型、协议端口、套接字编程等知识点。 一、OSI七层结构 OSI七层结构是一种网络通信模型,由国际标准化组织(ISO)制定。该模型将网络通信分为七...

    实验一基于TCP套接字的文件传输客户服务器程序设计实验报告.pdf

    基于 TCP 套接字的文件传输客户服务器程序设计...通过本实验,我们掌握了基于 TCP 套接口的网络程序设计和大规模文件传输的基本方法,了解了 TCP 套接字编程的基本原理和实现方法,提高了编程能力和解决问题的能力。

    UNIX网络编程 第2卷 进程间通信.pdf(带书签)

    第4章 基本TCP套接口编程 第5章 TCP客户/服务器程序例子? 第6章 I/O复用:select和poll函数 第7章 套接口选项 第8章 基本UDP套接口编程 第9章 基本SCTP套接口编程 第10章 SCTP客户/服务器程序例子 第11章 名字与...

    UNIX网络编程 第2卷 进程间通信 带完整书签

    第4章 基本TCP套接口编程 第5章 TCP客户/服务器程序例子? 第6章 I/O复用:select和poll函数 第7章 套接口选项 第8章 基本UDP套接口编程 第9章 基本SCTP套接口编程 第10章 SCTP客户/服务器程序例子 第11章 ...

    UNIX网络编程第1卷(1-19章)

    第四章 基本TCP套接口编程 第五章 TCP客户-服务器程序例子 第六章 I/O复用:select和poll函数 第七章 套接口选项 第八章 基本UDP套接口编程 第九章 基本名字与地址转换 第十章 IPv4和Ipv6的互操作性 第十一章 高级...

    Python程序设计:TCP-Socket编程.pptx

    它是TCP/IP网络环境下应用程序与底层通信驱动程序之间运行的开发接口。 它可以将应用程序与具体的TCP/IP隔离开来,使得应用程序不需要了解TCP/IP的具体细节,就能够实现数据传输。 TCP-Socket编程 Socket层级关系 ...

    基于UDP和TCP协议的Socket(网络编程/套接字)案例

    用java编写的基于UDP和TCP两种协议编写的Socket(网络编程)案列

    linux网路编程 中文 23M 版

    第2 章Linux编程环境....................................................................................................14 2.1 Linux环境下的编辑器................................................. 14 ...

    Windows网络编程

    2617.1.1 套接字模式 2617.1.2 I/O模型 2647.2 套接字选项 3027.2.1 SOL_SOCKET选项 3037.2.2 IPPROTO_IP选项 3087.2.3 IPPROTO_TCP选项 3117.2.4 NSPROTO_IPX选项 3117.3 套接字输出/输出控制 3147.3.1 ...

    Windows网络编程技术_套接字选项和IO控制命令(资料+源码)

    第9章 套接字选项和I/O控制命令 2079.1 套接字选项 2079.1.1 SOL_SOCKET选项级别 2089.1.2 SOL_APPLETALK选项级别 2159.1.3 SOL_IRLMP选项级别 2189.1.4 IPPROTO_IP选项级 2229.1.5 IPPROTO_TCP选项级别 2279.1.6 ...

    基本UDP套接口编程

    概述 UDP 无连接的 connectionless不可靠的 unreliable数据报协议 datagram 应用:DNS, NFS, SNMP, ICQ TCP 面向连接的 connection-oriented可靠的 reliable字节流协议 byte stream 应用:www, telnet ,ftp

    UNIX网络编程卷2进程间通信(第2版)

    第4章 基本TCP套接口编程 第5章 TCP客户/服务器程序例子? 第6章 I/O复用:select和poll函数 第7章 套接口选项 第8章 基本UDP套接口编程 第9章 基本SCTP套接口编程 第10章 SCTP客户/服务器程序例子 第11章 名字与地址...

    TCP-IP Socket网络编程.ppt

    网络信息检索函数包括获取主机名、获取与套接口相连的远程协议地址、获取套接口本地协议地址、获取主机信息、获取协议信息等。 TCP/IP Socket 网络编程是一种非常重要的网络编程接口,它提供了一个通用的网络编程...

    Windows网络编程(PDF).rar

    31112.4.1 RSVP和套接字类型 31212.4.2 QoS通知 31412.4.3 QoS模板 31612.5 示例 31812.5.1 单播TCP 31812.5.2 单播UDP 33612.5.3 多播UDP 33712.6 ATM和QoS 33812.7 小结 339第13章 原始套接字 34013.1 原始套接字...

    基于TCP的服务器客户端编程讲解.doc

    " "实验步骤: " "TCP服务端程序设计 " "使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和 " "客户端两部分,其主要实现过程如图所示。 " " " " " " 图1.1 TCP客户/服务器的套接字函数 ...

    《Windows网络编程技术》.rar

    地址家族和名字解析1026.1 IP1026.1.1 TCP1026.1.2 UDP1026.1.3 定址1026.1.4 创建套接字1056.1.5 名字解析1056.2 红外线套接字1076.2.1 定址1076.2.2 名字解析1086.2.3 红外线设备列举1086.2.4 查询IAS1106.2.5 ...

Global site tag (gtag.js) - Google Analytics