基于linux网络聊天室的设计_毕业设计论文(编辑修改稿)内容摘要:

连接。 connect()函数原型为 :int connect ( int sockfd, struct sockaddrserv_addr, int addrlen)。 sockfd 是目的服务器的 socket 描述符。 serv_addr是包含目的机 IP 地址和端口号的指针 , addrlen 为结构的大小。 遇到错误时返回 1, 并且 errno 中包含相应的错误码。 进行客户端程序设 计无须调用 bind(), 因为这种情况下只需知道目的机器的 IP 地址 , 而客户通过哪个端口与服务器建立连接并不需要关心 , 内核会自动选择一个未被占用的端口供客户端来使用。 ( 4) 步骤 4: 监听连接 listen()在服务器端程序中 , 当 socket 与某一端口捆绑以后 , 就需要监听该端口 , 以便对到达的服务请求加以处理。 int listen( int sockfd, int backlog)。 sockfd 是 Socket 系统调用返回的 socket 描述符。 backlog 指定在请求队列中允许的最大请 求数 , 进入的连接请求将在队列中等待 accept()它们。 backlog 对队列中等待服务的请求的 数目进行了限制 , 对于小型服务器 , 队列长度应该为 5 或是稍大一些的值 , 而对于网站服务器 , 我们就需要更大的值 , 比如说 16 或是更大。 当 listen 遇到错误时返回 1, errno 被置为相应的错误码。 ( 5) 步骤 5: 连接端口的服务请求 当某个客户端试图与服务器监听的端口连接时 ,该连接请求将排队等待服务器 accept()它。 通过调用 accept()函数为其建立一个连接 , accept()函数将返回一个新的 socket 描述符 , 来供这个新连接来使用。 而服务器可以继续在以前的那个 socket 上监听 , 同时可以在新的 socket 描述符上进行数据send ()( 发送 ) 和 recv()( 接收 ) 操作。 int accept( int sockfd, void addr, int addrlen)。 sockfd 是被监听的 socket 描述符 , addr 通常是一个指向 sockaddr_in 变量的指针 , 该变量用来存放提出连接请求服务的主机的信息 ( 某台主机从某个端口发出该请求 )。 addrlen 通常为一个指向值为 sizeof( struct sockaddr_in) 的整型指针变量。 错误发生时返回一个 1 并且设置相应的errno 值。 accept()之前 , 通常将 addrlen 初始化为 0。 ( 6) 步骤 6: 数据传输 send()和 recv() send()和 recv()这两个函数是用于面向连接的 socket 上进行数据传输。 send()函数原型为 : int send ( int sockfd, const void msg, int len, intflags)。 sockfd 是想用来传输数据的 socket 描述符 , msg是一个指向要发送数据 ( 可以是字符型、整型、浮点型等 ) 的指针。 len 是以字节为单位的数据的长度。 flags 一般情况下置为 0。 send()函数返回实际上发送出的字节数 , 可能会少于希望发送的数据。 所以需要对 send()的返回值进行测量。 当 send()返回值与 len 不匹配时 , 应该对这种情况进行处理。 recv()函数原型为 : int recv ( int sockfd, void buf, int len, unsignedint flags)。 sockfd 是接收数据的 socket 描述符。 buf 是存放接收数据的缓冲区。 len 是缓冲的长度。 flags 也被置为 0。 recv()返回实际上接收的字节数 , 或当出现错误时 ,返回 1 并置相应的 errno 值。 ( 7) 步骤 7: 关闭连接 close() 当所有的数据操作结束以后 , 可以调用 close()函数来释放该 socket, 从而停止在该 socket 上的任何数据操作。 摘要 : 在 Linux 下开发高性能的网络通信程序 , 是充分发挥 Linux 网络特性的一个关键因素。 Socket 接口是 TCP /IP 网络最为通用的 API, Socket 在计算机中提供了一个通信端口 , 可以通过这个端口与任何一个具有 Socket 接口的计算机通信。 Socket 接口上 TCP/IP 网络应用程序接口( API),它提供了许多函数和例程,程序员可以使用它们来开发 TCP/IP 网络应用程序。 2 Socket 使用 Socket 接口进行网络通信的过程如图 13 所示,简要步骤如下: (1) 建立一个 Socket. (2) 按要求配置 socket,将 socket 连接到远程主机或给 socket 指定以各本地协议端口。 (3) 按要求通过 socket 发送和接受数据。 (4) 关闭此 socket。 这是通过 Socket 实现点对点通信需要掌握的 4 个编程要点。 多线程的概念 上述点对点通信的实现知识完成了主机进程与服务器进程之间的连接,建立连接的进程之间是一对一的联系,即主机的一个进程与服务器的一个进程之间建立的连接。 而每个进程进行通信的环节都包括了发送信息和接口信息两个任务,这两个任务通过一个端口地址发送和接收。 对于多个并发的任务需要创建多个线程或线程去实现。 使用一个进程去完成发送信息是没有问题的,因为发送总是主动的;而使用同一个进 程再去完成接受信息去不一定会成功,因为接受信息是被动的,所以当没有信息可以接收时,该进程就会被阻塞,从而导致发送任务也一起被阻塞。 同一个端口的发送和接收是两个并发任务,应该由两个不同的任务去分别完成信息的发送和接收。 这样,当接收信息任务因没有信息而被阻塞时,不至于影响发送任务的执行。 那么,发送和接收两个任务是使用两个进程还是两个进程去完成呢。 在网络通信中,端口地址是以进程为单位进程分配的,而一个进程与外界的消息发送与接收必须通过分配给它的同一个端口进行。 因此,不能通过创建进程方式来解决上诉问题,因为两个 进程会分别对应两个不同的端口,而发送和接收必须使用同一端口。 线程不是资源分配的单位,所以如果使用两个线程不会对线程分配新的端口。 因此,本实验需要使用两个线程去分别完成发送和接收信息的任务,这两个线程共享其进程拥有的统一个端口地址。 由于创建进程的进程本身会作为一个线程来调度,所以只需要再创建一个线程专门负责接 收信息就可以了。 因此,对于从每个客户端发来的请求,服务器端都要创建相应的线程去接收并处理;同理,对于客户端而言,也要创建一个线程去读取服务器端发来的信息。 3 系统实现 Linux 提供的有关 Socket 的系统调用 (1) Socket() 作用: socket 函数为客户机或服务器创建一个 sokcet 格式: int socket(int family,int type,int protocol)。 参数说明: Family:表示地址族,可以去 AF_UNLX 和 AF_INT。 其中, AF_UNLX 只能够用于单一的 UNIX 系统进程间通信。 AF_INT 是针对Inter 的,因而可以允许在远程主机之间通信,实验中使用 AF_INT。 Type : 网络 程 序 所采 用 的通 信 协议 , 可 以取 SOCK_STREAM 或SOCK_DGRAM。 其中, SOCK_STREAM 表明使用的是。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。