做笔记使用,如果有写错了的地方还请指正!!!谢谢!!
/*
总结一些Webserver用到的函数参数及功能
*/
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <sys/uio.h>
int main(int argc, char* argv[]){
// socket(), bind(), listen(), accept()是基本通信流程,不用管
// 创建socket套接字,返回的是文件描述符
int socketfd = socket(AF_INET,SOCK_STREAM,0);
// 存放端口地址信息的结构体
sockaddr_in addr;
addr.sin_addr.s_addr = inet_addr("192.168.231.231"); // IP地址
addr.sin_family = PF_INET; // 地址协议族
addr.sin_port = htons(1000); // 端口号
// 绑定socket套接字与端口地址
bind(socketfd,(sockaddr*)&addr,sizeof(addr));
// socket套接字监听
listen(socketfd, 5);
// 存放多元素数据的非连续缓冲区
// struct iovec {
// void* iov_base; /* 起始地址 */
// size_t iov_len; /* 字节大小 */
// };
// 对于每一个传输的元素,指针成员iov_base指向一个缓冲区,这个缓冲区是存放的是readv所接收的数据或是writev将要发送的数据。
iovec vec[2];
vec[0].iov_base = NULL;
vec[0].iov_len = 0;
char buf[1024];
// #include <unistd.h>
// 参数:文件描述符,读写缓冲区,一次性读写的最大字节数
// 作用:将缓冲区的数据写到socket缓冲区/ 从socket缓冲区读取数据
read(socketfd, &buf, 1024);
write(socketfd, &buf, 1024);
// #include <sys/uio.h>
// 参数:文件描述符,iovec结构体数组,缓冲区数量
// 作用:一次调用中读/写多个非连续缓冲区,缓冲区用iovec结构体记录,iovec结构体数据分别是起始地址,和缓冲区大小
writev(socketfd, vec, 2);
readv(socketfd, vec, 2);
// #include <sys/socket.h>
// socket设计的数据传输函数
// 参数:文件描述符,读写缓冲区,缓冲区大小,flag
// 作用:读数据到指定buffer,写数据到socketfd
send(socketfd,&buf,sizeof(buf),0);
recv(socketfd,&buf,sizeof(buf),0);
socklen_t len = sizeof(addr);
// 作用:用于UDP通信,因为UDP通信公用一个服务端缓冲区,需要根据客户端的端口地址信息才能准确区分数据来源
// 参数:文件描述符,缓冲区,缓冲区大小,flag,客户端/服务端地址信息,客户端/服务端地址长度
recvfrom(socketfd,&buf,sizeof(buf),0,(sockaddr*)&addr, &len);
sendto(socketfd,&buf,sizeof(buf),0,(sockaddr*)&addr, sizeof(addr));
// struct msghdr {
// void *msg_name;//适用于套接字未连接的场合,指向地址结构,表示数据往哪个地址发送或数据接受自哪个地址,已连接(TCP或调用了connect的UDP)则设为NULL
// socklen_t msg_namelen;//地址长度,配合msg_name使用
// struct iovec *msg_iov;//缓冲区数组,对应readv和writev中的参数
// int msg_iovlen;//缓冲区数组y数目
// void *msg_control;//辅助数据的地址,指向控制信息结构体cmsghdr
// socklen_t msg_controllen;//辅助数据的大小
// int msg_flags;//接收端用,会根据实际的接受情况,将该标记设置为对应值
// }
msghdr msg;
msg.msg_name = NULL; // 用于套接字未连接的场合
msg.msg_namelen = 0;
msg.msg_iov = vec;
msg.msg_iovlen = 2;
msg.msg_control = NULL;
msg.msg_controllen = 0;
msg.msg_flags = 1;
// 最通用函数,集大成者
sendmsg(socketfd,&msg,0);
recvmsg(socketfd,&msg,0);
return 0;
}
溜了溜了~~