Linux - 面向连接的socket通信流程

字符串的IP与32的IP的转换

说明
 网络上的IP都是数字加点(192.168.0.1)构成
struct in_addr结构使用32位的IP,如
IP(C0A80001)是192.168.0.1
函数原型
 int inet_aton(const char *cp, struct in_addr *inp)
将a.b.c.d的IP转换为32位的IP,存储在 inp指针里面
char *inet_ntoa(struct in_addr in)
将32位IP转换为a.b.c.d的格式
说明
a代表 ascii,n代表network

面向连接的socket通信流程

服务器程序作用

初始化服务器程序

持续监听一个固定的端口

收到客户的连接后建立一个socket连接

与客户进行通信和信息处理

接收客户通过socket连接发送来的数据,创建一个新的socket,

通过socket连接与客户通信,进行相应处理,并返回处理结果

通信结束后中断与客户的连接(关闭socket)

客户程序作用

初始化客户程序

连接到某个服务器上,建立socket连接

与服务器进行通信和信息处理

接收服务器通过socket连接发送来的数据,进行相应处理

通过socket连接向服务器发送请求信息

通信结束后中断与客户的连接

服务器请求处理流程—循环服务器方案

UDP实现框架

没有一个客户端可以一直占用服务端

只要处理过程不是死循环,则服务器对于每一个客户机的请求总是能够满足

  socket(...);
   bind(...);
   while(1)
    {
         recvfrom(...);
         process(...);
         sendto(...);
   } 

TCP实现框架

每次接受一个客户端连接

完成某客户所有请求后,断开连接

 socket(...);
     bind(...);
     listen(...);
     while(1){
         accept(...);
         {
              read(...);
              process(...);
              write(...);
         }
         close(...);
     }

TCP实现框架

 s = socket(...);
  bind(s, ...);
  listen(s, ...);
  while(1) {
     ns = accept(s, ...);
     if(fork(..)==0)  {
           read(ns, ...);
           process(...);
           write(ns, ...);
          close(ns);
        }
     } 

  }  

多线程客户/服务器示例—线程实现

功能描述

客户端

使用线程向服务器发送从标准输入得到的字符

在主线程中将从服务器端返回的字符显示到标准输出

服务器端

将客户端发来的数据原样返回给客户端,每一个客户在服务器上对应一个线程

服务器并发处理优化途径

多路复用I/O

工作机理

进程可在多个socket上等待网络事件,当某个socket发生网络事件时,用户可通过查看网络事件对该socket事件进行I/O操作

要求应用程序不断向内核写入socket描述符,内核还应不断扫描socket集来检测状态

实现途径

预先构造一张描述符表,随后通过select()选择一个已准备好的描述符并返回

应用场景

一个进程中有多个客户连接(存在多个TCP 套接字描述符),select()函数阻塞直到任何一个描述符被激活

避免进程为等待一个已连接上的数据而无法处理其他连接

select()函数

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
nfds:所有被监控文件描述符中最大的一个加1
readfds:所有要读的文件文件描述符的集合
writefds:所有要写的文件文件描述符的集合
exceptfds:其他需要向我们通知的文件描述符
timeout:超时设置

运行机制

select调用进程一直阻塞直到以下情况之一发生

有文件可以读

有文件可以写

超时所设置的时间到

返回结果

-1:表明函数调用发生错误,错误号存放在errno变量中

0:表明发生超时而没有发生其他的错误

大于0:表明事件发生的文件描述符的数目

多路复用I/O相关宏

void FD_SET(int fd, fd_set *fdset)
将fd加入到fdset
void FD_CLR(int fd, fd_set *fdset)
将fd从fdset里面清除
void FD_ZERO(fd_set *fdset)
从fdset中清除所有的文件描述符
int FD_ISSET(int fd, fd_set *fdset)
判断fd是否在fdset集合中
功能
更多的灵活性,可编写TCP/UDP套接字不能实现的功能
可由用户自己创建各个头部
只能由有root权限的用户创建
函数原型
int sockfd(AF_INET, SOCK_RAW, protocol)
根据protocol(如IPPROTO_ICMP, IPPROTO_TCP, IPPROTO_UDP)创建不同类型原始套接字
时间: 2024-08-05 02:36:55

Linux - 面向连接的socket通信流程的相关文章

Socket通信流程

Socket通信流程 HTTP 底层就是通过socket建立连接通信管道,实现数据传输 HTTP是一个TCP的传输协议(方式),它是一个可靠,安全的协议

Linux C++ TCP Socket通信实例

环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服务器端建立连接并发送一条消息. server.cpp 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<errno.h> 5 #include<sys/type

Winsock系列函数 及 Socket通信流程

Socket是一种网络通信机制 Winsock系列函数 1. Socket 创建socket 2. Connect 尝试连接远端Socket 3. Send 在某个Socket 向远端发送数据 4. Recv 接收远端数据 5. Closesocket 关闭连接 6. Listen 在某个Socket上建立监听 7. Accept 接收一条新的连接 (是接收连接而不是接收数据) 8. Bind 给一个Socket分配一个本地协议地址 9. Select 用于检测Socket状态,用于高级通信 1

初试linux下的Socket通信(下)

自己动手写客户端程序 同样是实现上篇的功能,客户端程序不再用telnet,自己写代码实现,服务器端程序也需要修改下 服务器程序 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <arpa/inet.h> void

c++ 网络编程(二)TCP/IP linux 下多进程socket通信 多个客户端与单个服务端交互代码实现回声服务器

原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9612820.html LINUX下: 一.服务端代码 下面用了多个close来关闭文件描述符,可能有的小伙伴会有疑惑....我就说一句,创建进程的时候会把父进程的资源都复制 一份,而你这个子进程只需要保留自己需要处理的资源,其他的自然要关闭掉, 不然父亲一个儿子一个 待会打起来怎么办  嘿嘿 注意了:就像进程间的通信需要属于操作系统的资源管道来进行,套接字也属于操作系统,所以创建新进程也还是

基本Socket通信流程

服务器常用模型 1.初始化Socket (用于监听) 1)初始化 SOCKET s ; s =  Socket ( ... ) 2)绑定 bind(s, ...); 3)监听 listen(s, ...); 2.建立连接 1)检查状态 int ret = select ( ... ) ; if ( ret > 0 ) { //新连接 } 2)建立新连接 (如果有客户端请求连接) temp = accept ( ... );   // 注意,此时并不使用原来的Socket,而是新建一个Socket

linux下的socket通信小程序分享

最近学习unix网络编程,感觉东西零零碎碎,比较混乱.因此决定整理以下,发一个小博客.一来可以与大家分享以下,二来可以总结提高一下所学的东西.话说:竹子为什么长的高,因为它喜欢总结阿--^_^ 废话不多说了,上代码.小弟半路出家,入行不深,过路大神不喜勿喷阿,嘿嘿--^_^ 程序是一个基于tcp的 C/S .简单回显功能( 声明以下,不要以为注释是英语就说我是在哪里下载的,原因是我运行程序 汉字老显示乱码,就改成蹩脚英语了 ). 首先是一个自己的库 1 #ifndef MYLIB_H 2 #de

socket通信流程和一个简单的网络通信程序

""" server.py 模拟网络通信服务器端代码"""import socket #导入socket包 sk=socket.socket() #建立socket对象 print(sk) address=('127.0.0.1',8888) #生成地址信息元组 sk.bind(address) #绑定该地址信息 sk.listen(3) #设置最大连接数 ''' 服务器端不关闭,客户端输入exit后关闭,服务器接收下一个连接的内容,进行对话 '

网络编程-SOCKET开发之----3. socket通信工作流程

1. TCP的socket通信流程 服务端 1)socket----创建socket对象. 2)bind----绑定本机ip+port. 3)listen----监听来电,若在监听到来电,则建立起连接. 4)accept----再创建一个socket对象给其收发消息.原因是现实中服务端都是面对多个客户端,那么为了区分各个客户端,则每个客户端都需再分配一个socket对象进行收发消息. 5)read.write----就是收发消息了. 客户端 1)socket----创建socket对象. 2)c