socket编程:简单TCP服务器/客户端编程 您所在的位置:网站首页 socket编程是什么意思 socket编程:简单TCP服务器/客户端编程

socket编程:简单TCP服务器/客户端编程

#socket编程:简单TCP服务器/客户端编程| 来源: 网络整理| 查看: 265

    其实对于socket:我们需要理解的是他提供了一种编程概念,利用socket就可以利用系统已经封装好的内部进行通信,我们只需要关注应用层方面的数据控制就OK了。

一. 套接字(socket)

    socket英文为插座的意思,也就是为用户提供了一个接入某个链路的接口。而在计算机网络中,一个IP地址标识唯一一台主机,而一个端口号标识着主机中唯一一个应用进程,因此“IP+端口号”就可以称之为socket。

    两个主机的进程之间要通信,就可以各自建立一个socket,其实可以看做各自提供出来一个“插座”,然后通过连接上“插座”的两头也就是由这两个socket组成的socket pair就标识唯一一个连接,以此来表示网络连接中一对一的关系。

我们先来简单的了解一下socket究竟是什么东东。

    首先对于套接字编程,他需要指定的套接字的地址作为参数,所以在网络协议中存在不同的协议,即存在不同的地址结构定义方式。对于这些结构都是sockaddr_开头的。每一个协议有一个唯一的后缀,例如以太网的就是sockaddr_in,这个常用。

    然后我们来看一下通用的套接字结构:

struct sockaddr{     sa_family sa_family;     char sa_data[14]; }

这个是套接字的原型,注意在套接字编程中,关于sockaddr_的函数都需要进行类型转换转换为sockaddr.

以太网中常用的套接字结构是:socket编程:简单TCP服务器/客户端编程_IP

对应关系是:

socket编程:简单TCP服务器/客户端编程_网络_02

sin_family:对应的是地址类型:AF_INET代表ipv4。

sin_port:代表端口号。

sin_addr.s_addr:代表我们所建立的ip地址。

在编程之前,我们需要关注的是,在计算机中,字节序的存储分为大端小段,在网络字节序中,利用的是大端状态。而计算机可能存在大端可能存在小端,所以就存在一些字节序的转换函数:

socket编程:简单TCP服务器/客户端编程_IP_03

就如函数名一样。host字节序to转换为net字节序l long4字节长度,余下函数同理。

然后我们还需要关注的是,在我们的sockaddr_in中,ip地址存在sin_addr.s_addr的类型,字符串的点分十进制的类型,还有二进制的类型,所以就有一系列的ip地址结构转换函数:

socket编程:简单TCP服务器/客户端编程_计算机_04

根据这几个函数的输入参数和输出参数可以看到他们的转换时从什么转换到什么,

然后还有2个安全转换的函数:

socket编程:简单TCP服务器/客户端编程_IP_05

socket编程:简单TCP服务器/客户端编程_计算机_06

这2个函数是针对不同协议族的地址转换,第一个参数就代表网络类型协议族。

在基于上面的了解情况下,我们了解一下socket基于Tcp协议实现可靠传输的连接传输释放过程:

socket编程:简单TCP服务器/客户端编程_计算机_07然后我们需要注意一下几个问题:

客户端与服务器的交互过程:

   客户端的连接过程,对服务端是接收过程。然后在过程中进行3次握手建立TCP连接。

   客户端与服务端之间的数据交换是相对的过程,客户端的读数据对应的是服务器端的写数据过程。客户端的写数据对应服务器的读数据过程。

   在交互完毕后,关闭套接字连接。

下面开始套接字编程的认识。

首先我们来看一下代码,然后进行讲解:

首先来看服务端的代码:

#include #include #include #include #include #include #include #define _PROT_ 8888 #define _BACKLOG_ 5 void process_conn_server(int s) { ssize_t size =  0; char buffer[1024]; while(1) { size = read(s,buffer,1024); if(size == 0) { return ; } sprintf(buffer,"%d bytes altongether\n",size); write(s,buffer,strlen(buffer) + 1); } } int main() { int ss,sc; struct sockaddr_in server_sock; struct sockaddr_in client_sock; pid_t pid; int err; ss = socket(AF_INET,SOCK_STREAM,0); if(ss 


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有