服务器
1、创建socket文件描述符,使用socket函数(协议类型IPv4或者IPv6)
int socket(int domain, int type,int protocol)
该函数返回一个socket文件描述符 Domain: 协议域常用的有AF_INET(IPv4)、AF_INET6(IPv6)、AF_LOCAL(或称AF_UNIX)、AF_ROUTE等;指定在通信中使用的通信地址。例如AF_INET 则需要使用IPv4地址 Type:指定socket的类型,常用的有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。其中SOCK_STREM 表示面向连接的稳定数据传输即TCP协议。 Protocol:指定协议类型;
2、为socket绑定IP地址和端口
int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen)
函数执行成功返回0,执行失败返回SOCKET_ERROR
Sockefd :socket 描述符,使用socket函数创建
Addr:指向要绑定的sockfd的协议地址
IPv4结构
struct sockaddr_in{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
struct in_addr{ uint32_t s_addr; };
IPv6结构如下:
struct sockaddr_in6{
sa_family_t sin6_family;
in_port_t sin6_port;
struct in6_addr sin6_addr;
char sin_zero[8];
uint32_t sin6_scope_id;
};
struct in6_addr{
unsigned char s6_addr[16];
};
Unix域对应的代码:
#define UNIX_PATH_MAX 108
struct soockaddr_un{
sa_family_t sun_family;
char sun_path[UNIX_PATH_MAX];
}
Addrlen: 对应地址的长度
3、监听客户端发来的端口请求
int listen(int sockfd,int backlog)
函数执行成功返回0,执行失败返回SOCKET_ERROR
Sockfd: 要监听的socket描述符
Backlog: 可以排队的最大连接个数
4、接收来自客户端的请求(服务器被动打开连接,没有客户端连接时服务器会被阻塞)
int accept(int sockfd, struct sockaddr * addr,socklen_t *addrlen);
函数调用成功返回一个与客户端连接的socket文件描述符,用来实现客户端与服务器的通信,无客户端时则会一直阻塞
Sockfd: 服务器的socket文件描述符
Addr: 用来储存与服务器连接的客户端的地址
Addrlen: 用来接收客户端地址的长度
5、从socket中取数据或写入数据
网络I/O操作有下面机组
Read()/write()
Recv()/send()
Readv()/writev()
Recvmsg()/sendmsg()
Recvfrom()/sendto()
读:
ssize_t read(int fd,void *buf,size_t count);
从文件描述符fd中读取数据读取成功时,read()返回实际所读的字节数。返回的值为0表示已经读到文件结束,小于0表示出现错误,如果错误是EINTR表明读是由中断引起的,如果错误是ECONNREST表明网络连接出了文件
Fd: socket 文件描述符
Buf: 用来储存数据的缓冲区
Count : 缓冲区的长度
写:
ssize_t write(int fd,const void *buf,size_t nbytes);
将buf中的nbytes字节内容写入到文件描述符fd中,写入成功返回写入的字节数,失败则返回-1,并设置errno变量。向socket描述符中写入时有两种可能:1.write的返回值大于0 表示写入部分或者全部;2.返回值小于0表示写入失败,根据errno错误类型进行错误处理
Fd: socket 文件描述符
Buf: 写入数据的缓冲区
Count : 缓冲区的长度
6、关闭socket(客户端先关闭连接)
#include <unistd.h>
int close(int fd);
关闭一个socket描述符,并立即返回到调用进程,改描述符不能再进行read 或者 write
客户端
1、创建socket同服务器创建socket一样
2、连接指定的服务器和端口
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
函数执行成功返回0,执行失败返回SOCKET_ERROR
Sockfd:要连接的socket描述符
Addr: 服务器的地址
Addrlen: 对应的服务器地址的长度
3、向socket中写入数据或者读取数据,同服务器读写一样
4、关闭socket同服务器关闭一样;