网片是干什么用的,杭州seo工作室,怎么申请网站空间,嘉兴市城市建设门户网站socket网络编程的步骤
大体上#xff0c;连接的建立过程就是#xff1a;服务器在确定协议类型后#xff0c;向外广播IP地址和端口号#xff0c;并监听等待#xff0c;直到客户端获取了IP地址和端口号并成功连接#xff1a; 使用socket来进行tcp协议的网络编程的大体步骤…socket网络编程的步骤
大体上连接的建立过程就是服务器在确定协议类型后向外广播IP地址和端口号并监听等待直到客户端获取了IP地址和端口号并成功连接 使用socket来进行tcp协议的网络编程的大体步骤 其实socket的使用就像之前文件编程中打开文件的操作一样返回的是一个标识符之后就对这个标识符进行操作。 相关的API讲解 参考linux网络编程网络socket基础编程(一) 基础API_Jags的博客-CSDN博客 socket函数
创建套接字的函数
头文件
#include sys/types.h
#include sys/socket.h函数原型
int socket(int domain, int type, int protocol);
函数参数
domian表示所使用的协议族可以选取以下值中的一个 AF_INETIPv4因特网域 最常用TCP/IP的协议族 AF_INET6IPv6因特网域 AF_UNIXUnix域 AF_ROUTE路由套接字 AF_KEY密钥套接字 AF_UNSPEC未指定 ... ... type指定socket的类型可以选取以下值中的一个 SOCK_STREAM字节流套接字提供可靠面向连接的信息流使用TCP协议保证了数据的正确性和顺序性 SOCK_DGRAM数据报套接字提供无连接的服务数据可以通过相互独立的报文进行传输是无序的并且不能保证可靠性使用UDP协议 SOCK_RAW原始套接字运行程序使用底层协议如IP或ICMP直接进行访问功能强大但使用不便主要用于协议的开发 ... ... protocol协议的类型通常赋值“0”表示type类型对应的默认协议也可以从以下值中选一个 IPPROTO_TCPtcp协议 IPPROTO_UDPudp协议 IPPROTO_SCTPsctp协议 IPPROTO_TIPCtipc协议 ... ... 返回值成功则返回 监听套接字描述符失败返回-1 bind函数服务器
服务器绑定IP和端口号到网络标识符的函数
头文件
#include sys/types.h
#include sys/socket.h
函数原型 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
函数参数
sockfdsocket函数返回的 监听套接字描述符addr一个结构体指针指向 “包含有本机IP地址以及端口号” 的 “sockaddr结构体” 的指针 //ipv4AF_INET对应的地址结构
struct sockaddr{unsigned short as_family; //协议族char sa_data[14]; //IP端口号
};等价于下面这种是优化版struct sockaddr_in{sa_family_t sin_family; //协议族in_port_t sin_port; //端口号struct in_addr sin_addr; //IP地址结构体unsigned char sin_zero[8]; //填充没有实际意义只是为了跟socketaddr结构在内存中对齐这样两者才能相互转换
}; addrlen第二个参数所指向的结构体的长度使用 sizeof(来获取返回值成功返回0失败返回-1 listen函数服务器
服务器监听设置的函数 头文件
#include sys/types.h
#include sys/socket.h函数原型
int listen(int sockfd, int backlog);
函数参数
sockfdsocket函数返回的 监听套接字描述符backlog指定在请求队列中允许的最大请求数返回值成功则返回0失败返回-1 accept函数服务器
服务器接受连接的函数用于从已完成连接队列的队头返回下一个已完成连接如果已完成连接队列为空那么进程投入睡眠 头文件
#include sys/types.h
#include sys/socket.h函数原型
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函数参数
sockfdsocket函数返回的 监听套接字描述符addr用来返回已连接的客户端的协议地址不关心就写NULLaddrlen返回上一个参数对应结构体的长度不关心就写NULL返回值成功则返回已 连接套接字描述符失败返回-1 connect函数客户端
客户端连接的函数如果是TCP套接字,调用 connect函数将激发TCP的三路握手过程
头文件
#include sys/types.h
#include sys/socket.h函数原型 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
函数参数
sockfd套接字描述符addr服务器端的协议地址addrlen返回上一个参数对应结构体的长度返回值成功返回0失败返回-1 inet_aton 和 inet_ntoa函数
地址转换的API
头文件
#include sys/socket.h
#include netinet/in.h
#include arpa/inet.h
函数原型
int inet_aton(const char *cp, struct in_addr *inp);
//把字符串形式的“192.168.X.XXX”转为网络能识别的格式
char *inet_ntoa(struct in_addr in);
//把网络格式的IP地址转为字符串形式
函数参数1
cp字符串形式的IP地址inp存放转化后的 网络形式的IP地址返回值成功返回1失败返回0
函数参数2
in网络形式的IP地址返回值成功返回点分十进制数失败返回NULL read 和 write 函数
在套接字通讯中进行字节读取函数 和之前文件的的读写函数名字一样但参数不太一样因为在套接字的通讯中输入或输出的字节可能比请求的少。 使用详见使用read write 读写socket_san.hang的博客-CSDN博客 头文件
#include unistd.h
函数原型
ssize_t write(int fd, const void *buf, size_t nbytes);
//将buf中的nbytes个字节写入到文件描述符fd成功时返回写的字节数
ssize_t read(int fd, void *buf, size_t nbyte);
//从fd读取nbyte个字节到buf中返回实际所读的字节数
网络I/O还有一些函数例如 recv()/send(); readv()/writev(); recvmsg()/sendmsg()等... send 和 recv函数
另一组用于socket数据收发的API
头文件
#include sys/types.h
#include sys/socket.h函数原型 ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
函数参数
sockfdsocket函数返回的 监听套接字描述符buf代发数据 / 接受缓冲区len数据长度flags通常为0返回值成功返回 发送 / 接收 的字节数 失败 返回-1