socket套接字编程函数

来源:互联网 发布:淘宝工作室是做什么 编辑:程序博客网 时间:2024/06/06 05:06

网络编程中接受连接请求的套接字创建过程可整理如下:

  1. 调用socket函数创建套接字
  2. 调用bind函数分配IP地址和端口
  3. 调用listen函数转为可接收请求状态
  4. 调用accept函数受理连接请求

函数说明

socket()函数

#include <sys/socket.h>// 成功时返回文件描述符,失败时返回-1int socket(int domain, int type, int protocol);

参数

  • domain:套接字中使用的协议族(Protocol Family)信息;
  • type:套接字数据传输类型信息
  • protocol:计算机通信中使用的协议信息

协议族(Protocol Family)

头文件sys/socket.h中声明的协议族

名称 协议族 PF_INET IPv4互联网协议族 PF_INET6 IPv6互联网协议族 PF_LOCAL 本地通信的UNIX协议族 PF_PACKET 底层套接字的协议族 PF_IPX IPX Novell协议族

套接字类型(Type)

面向连接的套接字:SOCK_STREAM

  • 传输过程中数据不会消失
  • 按序传输数据
  • 传输的数据不存在数据边界(Boundary)

面向消息的套接字:SOCK_DGRAM

  • 强调快速传输而非传输顺序
  • 传输的数据可能丢失也可能损毁
  • 传输的数据有数据边界
  • 限制每次传输的数据大小

协议(Protocol)

  • IPPROTO_TCP – TCP传输协议
  • IPPTOTO_UDP – UDP传输协议
  • IPPROTO_SCTP – STCP传输协议
  • IPPROTO_TIPC – TIPC传输协议

bind()函数

// 成功时返回0,失败时返回-1int bind(int sockfd, const struct sockaddr *addr, socklen_t, addrlen);

参数

  • sockfd:socket文件描述符
  • addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同
  • addrlen:对应的是地址的长度

sockaddr对应IPv4的结构体如下:

struct sockaddr_in{    sa_family_t sin_family; // 地址族(Address Family)    uint16_t sin_port; // 16位TCP/UDP端口号    struct in_addr sin_addr; // 32位IP地址    char sin_zero[8]; // 不使用};struct in_addr{    In_addr_t s_addr; // 32位IPv4地址};

listen()函数

// 成功时返回0,失败时返回-1int listen(int sockfd, int backlog);

参数

  • sockfd:socket文件描述符
  • backlog:socket可以排队的最大连接个数

accept()函数

// 成功时返回文件描述符,失败时返回-1int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数

  • sockfd:socket文件描述符
  • addr:服务器的socket地址
  • addrlen:socket地址的长度

connect()函数

// 成功时返回文件描述符,失败时返回-1int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);

参数

  • sockfd:socket文件描述符
  • serv_addr:服务器的socket地址
  • addrlen:socket地址的长度

文件操作

打开文件

#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>// 成功时返回文件描述符,失败时返回-1int open(const char *path, int flag);

参数

  • path:打开的目标文件名及路径信息
  • flag:文件的打开模式

文件的打开模式

打开模式 含义 O_CREAT 必要时创建文件 O_TRUNC 删除全部现有数据 O_APPEND 维持现有数据,保存到其后面 O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 读写打开

关闭文件

#include <unistd.h>// 成功时返回0,失败时返回-1int close(int fd);

参数

  • fd:需要关闭文件或套接字的文件描述符

将数据写入文件

#include <unistd.h>// 成功时返回写入的字节数,失败时返回-1ssize_t write(int fd, const void *buf, ssize_t nbytes);

参数

  • fd:显示数据传输对象的文件描述符
  • buf:保存要传输数据的缓冲地址值
  • nbytes:要传输数据的字节数

读取文件中的数据

#include <unistd.h>// 成功时返回接收的字节数(但遇到文件结尾则返回0),失败时返回-1ssize_t read(int fd, void *buf, ssize_t nbytes);

参数

  • fd:显示数据接收对象的文件描述符
  • buf:要保存接收数据的缓冲地址值
  • nbytes:要接收数据的最大字节数
0 0