Linux网络编程基础知识

来源:互联网 发布:淘宝被盗号了怎么办 编辑:程序博客网 时间:2024/05/22 22:44

参考来源《Linux下C语言应用编程》-杨铸著

一、基本概念

与socket编程相关的最主要有4个东西:A机的IP地址、B的IP地址、A机端口号、B机的端口号。

htons将无符号短整型的数据的主机字节顺序转换为网络字节顺序。

inet_pton将点分格式的地址字符串转换为网络字节序整型数。

inet_ntop将网络字节序整型转换为点分格式的IP地址。

gethostbyname可以将机器名转换为一个结构体指针,这个结构体里面存储了域名与IP地址的对应信息。

gethostbyaddr可以将一个socket地址结构体里面的IP地址转换为一个结构体指针,在这个结构体里面存储了域名与IP地址的对应信息。


read和write是网络程序里面最基本的函数,也是原始通信函数。高级函数有:

recv和send

recvmsg和sendmsg

close和shutdown。shutdown可以只关闭读写一个方向。


udp socket函数:

sendto向指定数据接收端发送指定数据;

recvfrom接收数据发送端到达的数据;


二、连接过程

对于主机来说:

调用socket创建一个与任何网络连接相对应的套接口,其返回值是一个文件描述符;

调用bind将刚刚创建的socket与本机的IP地址和端口号绑定,这样一来socket就变成了一个3元组;

调用listen将socket指定为一个被动套接口,专门用于监听客户端到达的网络连接请求;

调用accept使socket进入到可以接收网络连接请求的状态,此时服务器将能够接受客户端发起的连接,但如果没有客户端发起连接,那么服务器将进入阻塞态,直到有客户端连接到达,accept将返回另一个socket远端IP地址的信息;

调用read从连接套接口接受客户端发送过来的数据,如果此时客户端并未发送数据,那么read将阻塞到有数据到达为止;

根据客户端的要求进行数据的处理;

调用write向连接套接字写入处理后的数据,将数据通过网络送达客户端;

所有数据传输完毕, 调用close关闭连接套接口。

对于客户机来说:

调用socket创建一个不与任何网络连接相对应的套接口;

调用connect将服务器IP和端口作为参数传入,此时OS会选择一个本机尚未使用的端口号作为本次创建网络连接的本地端口号,当三次握手后,connect返回;

调用write向socket写入数据;

调用read等待从socket获取服务器通过write回送的数据;

当所有数据接收完毕,调用close关闭网络连接,通信结束。

三、问题

1、当启动服务器,再次终止立即启动时,服务器报错“不能绑定到指定地址”,需等待一段时间才能重新启动。原因是已经处理过客户端连接的服务器已经绑定了本地端口,需等待2MSL时间。解决办法是在socket和bind之间设置允许地址重用套接口选项(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))。

2、一次只能处理一个客户请求的服务器称为迭代服务器,迭代服务器不能响应多个客户端的连接请求,其根本原因不是服务器太忙而是阻塞在等待客户端数据的到达。解决办法是使用多个进程或者线程,一个子进程服务于一个客户端,父进程负责监听客户连接,这种服务器被称为并发服务器。

3、udp与TCP编程的不一样的地方,对于服务端来说:没有调用accept,bin绑定接口后就可以接收不同IP发来的数据;对于客户端来说:没有调用connect,不需要建立连接。由操作系统临时选择本地IP地址和端口,由sendto指定目标IP地址和端口。


0 0
原创粉丝点击