`
隐形的翅膀
  • 浏览: 498615 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

套接字基础

 
阅读更多
1.
int socket(int domain,int type, int protocol)
int sockfd=socket(,,,);

返回文件描述符,-1 表示错误
需要头文件: <sys/types.h> <sys/socket.h>
domain : AF_INET,PF_INET,AF_INET6, IPv4 or IPV6
type:SOCK_STREAM, SOCK_DGRAM, tcp or udp
protocol: 通常默认为0, 表示系统自动选择合适的协议类型

2. IPV4套接字地址

struct sockaddr_in{
sa_family_t sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};

struct in_addr{
uint32_t s_addr;
}

3. int connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen)

0表示成功,-1表示失败, 非阻塞函数,立即返回

4. int listen(int sockfd,int backlog)

backlog  参数是指完成TCP三次握手后已经成功建立TCP连接的队列的长度,服务器执行ACCEPT操作从该队列中取下一个连接进行后续处理,BACKLO的默认值是128

5. int accept (int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen);

TCP服务器使用ACCEPT 函数从BACKLOG队列中返回下一个成功建立的连接), 如果BACKLOG队列为空,则服务器进程将被阻塞

如果该函数调用成功,它的返回值是一个新的套接字描述符,称为连接套接字,服务器使用该套接字和亿建立的客户端进行通信,而原有的监听套接字继续接受后续新客户端发来的连接请求

6. 其它

read/write/: TCP 连接用的函数

recvfrom/sendto UDP, 数据包套接字用到的函数

7.

if (listen(sockfd,128) == -1)
....

while(1){
if((new_fd = accept()) == -1)
....

for(;;)
{
len= read()

if(len>0)
处理读到的数据
}


}

此种模式下服务器只能对所接受到的一个客户端的连接请求进行处理,不能太接受其它客户端的连接请求,只有处理完,才能处理下一个请求

7. 使用子进程来出来


if (listen(sockfd,128) == -1)
....

while(1){
if((new_fd = accept()) == -1)
....

pid=fork()
switch(pid)
case :0 子进程
read
处理读入数据



}

高级套接字

8. setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen)

level: SOL_SOCKET, SOL_TCP

a SO_KEEPALIVE: 若在两小时内TCP连接双方没有发送过任何数据,自动向对方发送活动探测,并且接受方必须回应

b SO_RECVBUF SO_SNDBUF 调整发送缓存区和接受缓存区的大小

c SO_RCVLOWAT SO_SNDLOWAT 最低接收阀值和最低发送阀值

d SO_REUSEADDR : 服务器再次绑定到一个端口,无需等待。

9.

文件描述符

FD_ZERO(fd_set *fdset); 清空
FD_SET(int fd,fd_set *fdset); 添加
FD_CLR(int fd,fd_set *fdset); 删除某个
FD_ISSET(int fd,fd_set *fdset); 坚持某个是否被置位

fd_set rfds,orfds;
FD_ZERO(&orfds);
FD_SET(STDIN_FILENO,&orfds);
maxfd=STDIN_FILENO;

FD_SET(STDIN_FILENO,&orfds);
if((sockfd > maxfd)
maxfd=sockfd

rfds=orfds;

用SELECT 开始等待可读文件描述符集合可用的通知


ret = select(maxfd+1,&rfds,NULL,NULL,NULL)

if(ret == -1)
error
else
for(int i = 0; i < MAX_CONNECTION; i++)
{
if(FD_ISSET(sockfd,,&rfds)
read...
else if(FD_ISSET(STDIN_FILENO,&rfds)
write...
}

缺点
_FD_SETSIZE 最大值为1024, 若修改,需要重新编译内核,需要轮询

当使用FD_ISSET时, 需要遍历所有集合












分享到:
评论

相关推荐

    基于Python进行TCP套接字编程的基础知识 实验报告

    3.1 套接字基础与UDP通信 (源代码见附件) 实验原理: 基于UDP的无连接客户/服务器在Python实现中的工作流程如下: 1.首先在服务器端通过调用socket()创建套接字来启动一个服务器; 2.服务器调用bind()指定服务器的...

    流式套接字实现简单的客户端服务端通信过程

    1. **TCP套接字基础** - TCP是一种传输层协议,位于OSI模型的第四层,与UDP(用户数据报协议)并存。 - TCP提供面向连接的服务,即在数据传输前,双方会建立一个可靠的连接。 - 三次握手是TCP连接建立的过程,...

    tcp套接字例子windos

    1. **TCP套接字基础**: TCP是一种面向连接的、可靠的传输层协议,它保证了数据包按顺序无丢失地到达目的地。在Windows中,TCP套接字编程涉及创建套接字、绑定地址、监听连接请求、接受连接以及进行读写操作。 2. ...

    UNIX网络编程 卷1:套接字联网API源代码

    1. **套接字基础**:介绍套接字的概念、类型和工作原理,如流式套接字(SOCK_STREAM,对应TCP)和数据报套接字(SOCK_DGRAM,对应UDP)。 2. **基本网络概念**:涵盖IP地址、端口号、DNS解析等基础知识,这是构建...

    套接字传输,VS2008服务器端

    1. **套接字基础**:套接字是TCP/IP协议族的一部分,提供了进程间通信(IPC)的能力,特别适合于网络上的不同主机间的通信。在Windows平台上,通常使用Winsock API来实现套接字编程,它封装了Berkeley套接字接口。 ...

    套接字详解(自己找的好资料)

    一、套接字基础 1. 套接字定义:套接字是网络上的两个进程间通信的端点,类似于电话线路上的两个电话机。套接字由两部分组成:IP地址和端口号。IP地址标识网络中的设备,端口号区分同一设备上的多个服务。 2. 类型...

    UNIX网络编程卷1:套接字联网API(第3版)源代码

    1. **套接字基础**:涵盖套接字的创建、绑定、监听、连接和接受等基本操作。通过源代码,可以了解socket()、bind()、listen()、connect()和accept()等函数的具体用法。 2. **TCP/IP协议栈**:讲解了TCP和UDP这两种...

    套接字聊天程序CSocketDemo

    套接字基础 套接字是操作系统提供的编程接口,用于在网络中的不同进程间建立连接并进行数据交换。在C++中,通常使用Windows Socket API(Winsock)或Berkeley套接字来实现。CSocketDemo很可能基于这些API来构建它...

    Windows下多线程套接字编程

    一、套接字基础 套接字是网络通信的基本单元,它提供了进程间通信的能力,允许两个或多个系统通过网络进行数据交换。在Windows中,通常使用Winsock库(Windows Socket API)来实现套接字编程。Winsock提供了一组与...

    UNIX网络编程卷1:套接字联网API(第3版)完整书签

    1. **套接字基础**:讲解了套接字的概念,它是进程间通信(IPC)的一种方式,特别是在网络环境中。书中详细介绍了不同类型的套接字,如流式套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)和原始套接字(SOCK_...

    易语言取封包套接字IP端口模块

    在IT领域,网络通信是不可或缺的一部分,而套接字(Socket)则是实现网络通信的基础组件。易语言,作为中国本土的编程语言,提供了一种简单易用的方式来处理网络通信问题,其中包括取封包套接字IP端口的操作。本文将...

    C++实现套接字传文件

    1. **套接字基础**:套接字是进程间通信的一种方式,特别是在网络环境中。它提供了一种在不同主机之间建立连接并交换数据的机制。在C++中,我们通常使用`&lt;sys/socket.h&gt;`和`&lt;netinet/in.h&gt;`头文件来处理套接字。 2....

    socket同步套接字服务器客户端

    Socket同步套接字是网络编程中的重要概念,主要用于在不同计算机之间实现进程间通信(IPC)。在这个场景下,我们讨论的是一个基于Socket的同步服务器和客户端应用,它们通常用于实现简单的聊天程序。以下是对这些...

    java的套接字编程 简单的QQ

    1. **Java套接字基础** Java套接字是Java网络编程的基础,分为ServerSocket和Socket两种类型。ServerSocket是服务器端使用的,用于监听特定端口,等待客户端连接;Socket是客户端使用的,用于与服务器建立连接并...

    Socket套接字—Java套接字编程

    Socket套接字是Java编程语言中用于网络通信的核心组件,它是实现客户端-服务器模型的基础。在Java中,Socket和ServerSocket类提供了套接字编程的基本功能。本文将深入探讨Java套接字编程的相关知识点,包括Socket和...

    UNIX网络编程 第1卷(第3版):套接字联网API + 代码 中文 PDF

    1. **套接字基础**:套接字是网络通信中的基本概念,是进程间通信的一种方式。书中详细讲解了套接字的创建、类型(如流式套接字、数据报套接字和原始套接字)、属性设置以及套接字的生命周期。 2. **地址族与协议**...

    C# 网络编程套接字

    套接字基础 套接字是应用程序与网络协议栈交互的接口,可以看作是网络上的通信端点。在C#中,`System.Net.Sockets`命名空间提供了`Socket`类来处理套接字操作。套接字分为两种类型:流式套接字(Stream Socket,...

    Qt套接字编程源码

    **Qt套接字编程源码详解** 在软件开发中,网络通信是不可...总的来说,Qt套接字编程是实现跨平台网络应用的基础,通过学习其源码,开发者不仅可以提升技术水平,还能更好地运用到实际项目中,解决复杂的网络通信问题。

    winsock套接字

    Winsock 套接字编程基础 Winsock 套接字是一种基本的网络编程技术,用于建立和管理网络连接。以下是 Winsock 套接字编程的基础知识点: 创建套接字 套接字是网络编程的基础单元,用于建立和管理网络连接。Winsock...

Global site tag (gtag.js) - Google Analytics