本文面向的读者:对网络编程懵懂的IT雏鸟,有一定网络编程经验的IT菜鸟可略过,Orz…… 好了,下面进入主题…… 一、什么是socket(套接字)? socket的英文原义是“插座”,手机要充电需要用充电器连接到供电插座,看电视需要将插到提供信号的插座,电脑上网也需要将网请看如下
本文面向的读者:对网络编程懵懂的IT雏鸟,有一定网络编程经验的IT菜鸟可略过,Orz……
好了,下面进入主题……
一、什么是socket(套接字)?
socket的英文原义是“插座”,手机要充电需要用充电器连接到供电插座,看电视需要将插到提供信号的插座,电脑上网也需要将网线插到一个网线插孔(它也可以理解为一个插座)。计算机术语中的socket,套接字,与前面这些“插座”在功能上势必有相类的地方。在同一台主机上,进程之间通信可以是内存共享、发送信号、管道、FIFO等方式,那在网络上不同主机的进程又如何通信呢?!那就是通过socket.
Socket是一个抽象层,不同类型的套接字对应于不同的底层协议族以及协议族内的不同协议栈。这里只讨论TCP/IP协议族的TCP套接字。应用程序可以通过它互相发送/接收数据进行通信。套接字在邦定ip地址和端口后就可以标识一个进程,其它进程就可以利用该套接字的ip地址和端口找到这个进程,通过该套接字进行通信。当然一个进程可以有不同的套接字,一个实例化的套接字只能对应一个进程。通常,不同的端口提供不同的服务,就像开始提到的,不同类型的插座提供不同的功能服务一样。不同主机进程之间的通信,其实也可以说是不同主机套接字之间的通信,套接字就是起到通信桥梁的作用,或者说,套接字是本机上的进程和网络上其它主机的进程进行通信的接口。套接字通信就是从套接字读/写数据。首先,当然得生成一个套接字,用下面的头文件,函数。
#include
intbind(intsockfd,conststructsockaddrmyaddr,socklen_taddrlen);
参数说明:
sockefd要邦定协议地址的套接字描述符——由socket()生成。
myaddr指向特定的协议地址的指针。
addrlen该协议地址的长度
返回值:成功为0,出错则为-1
对于服务器而言,一般是邦定服务器本机的IP地址和一个众所周知的端口号,在这个套接字上就只来自该IP地址和端口的连接请求。众所周知,指的是客户端都知到这个端口提供什么样的服务。对于TCP,调用bind()函数可以指定一个端口号,或指定一个IP地址,也可以两者都指定,还可以都不指定。若不指定端口号,系统内核会为它选择一个临时的端口号,这种情况对客户端来说是正常的,但是对于服务端却极为罕见,因为服务器的端口号都应该是客户端众所周知的,应该具体指定。若不指IP地址,对客户端而言,内核会选择所用外出网络接口作为源IP地址;对服务端而言,内核就把客户发送的SYN的目的IP地址作为服务器的源IP地址。
☆listen()——对套接字sockfd一直连接请求
#include
intconnect(intsockfd,conststructsockaddrservaddr,socklen_taddrlen);
参数说明:
sockfd待连接的套接字描述符
servaddr向服务端请求连接的服务器地址结构的指针
addrlen服务器地址结构的长度
返回值:成功为0,失败为-1;
若connect()成功返回,说明建立连接的三次握手完成,连接已经建立成功,可以进行通信了。
192.168.1.107注意:若connect()失败,则该sockfd套接字不能再用,必须关闭,不能对这样的套接字再调用connect()进行连接,必须调用close(sockfd)关闭它,再重新调用socket()生成一个新的套接字进行重连。
三、简单实例:服务端回射客户端程序现在结合一个学习小例子,就是服务端将客户端发送的内容再回射给客户端,对知识点的体会深入浅出。
首先,编写一个服务端,简易代码如下:
[cpp]viewplaincopy/server.c/
#include
常林通过和佳ERP逐步实现了当初订立的信息化整体目标:以ERP的先进管理对经营和生产管理进行了系统的整合和优化,使信息技术与产品开发、生产制造、经营管理及发展全面融合,全面提高生产和管理水平,增强综合竞争力,提升可持续发展能力。
tags:192.168.1.10