沈阳seo网站管理查询网站备案信息

当前位置: 首页 > news >正文

沈阳seo网站管理,查询网站备案信息,开发公司标牌制作费计入什么科目,wordpress添加一言一、域套接字的概念 1.只能做一台主机内的进程间通信#xff0c;协议族#xff08;地址族#xff09;指定为#xff1a;AF_UNIX AF_LOCAL 2.bsp-lcd#xff1a; s类型文件#xff0c;就是域套接字 3.如果客户端不手动绑定#xff0c;则操作系统不会创建一个套接字文件…一、域套接字的概念 1.只能做一台主机内的进程间通信协议族地址族指定为AF_UNIX AF_LOCAL 2.bsp-lcd s类型文件就是域套接字 3.如果客户端不手动绑定则操作系统不会创建一个套接字文件给客户端自动绑定的。 二、域套接字的函数使用 1socket 功能在内核空间中创建套接字文件接收缓冲区发送缓冲区并返回该套接字文件的文件描述符到用户空间 原型 #include sys/types.h /* See NOTES / #include sys/socket.h int socket(int domain, int type, int protocol);参数 参数int domain协议族地址族;Name Purpose Man pageAF_UNIX, AF_LOCAL Local communication unix(7)int type: 套接字类型 SOCK_STREAM字节流式套接字流式套接字—-TCP协议SOCK_DGRAM 数据报式套接字报式套接字—-UDP协议SOCK_RAW原始套接字该套接字使用的协议需要在第三个参数指定;int protocol指定协议默认协议填0TCP协议: IPPROTO_TCP IPPROTO_UDP返回值 0 , 成功返回套接字文件描述符; -1, 失败更新errno; 2bind 功能将地址信息绑定到套接字文件描述符上 原型 #include sys/types.h / See NOTES */ #include sys/socket.h int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 参数 int sockfd指定要将地址信息绑定到哪个套接字文件描述符上; struct sockaddr addr通用地址信息结构体真实的地址信息结构体根据地址族指定.该结构体中需要填充上IP和端口由bind函数绑定到套接字上。 AF_UNIX : man 7 unix struct sockaddr_un {sa_family_t sun_family; / AF_UNIX / 必须填AF_UNIXchar sun_path[108]; / pathname */ 套接字文件路径必须事 先不存在由bind函数生成}; socklen_t addrlen真实的地址信息结构体的长度sizeof(struct sockaddr_un); 返回值 成功返回0; 失败返回-1更新errno; 3access 功能判断文件是否存在或者文件是否有某种权限 4unlink 功能删除文件的硬链接 三、流式域套接字 1UNIX TCP服务器 #include stdio.h #include sys/types.h #include sys/socket.h #include arpa/inet.h #include netinet/in.h #include unistd.h #include string.h #include sys/un.h#define ERR_MSG(msg) do{\fprintf(stderr, %d , LINE);\perror(msg);
}while(0)int main(int argc, const char *argv[])
{//创建流式套接字int sfd socket(AF_UNIX, SOCK_STREAM, 0);if(sfd 0){ERR_MSG(socket);return -1;}//判断域套接字文件是否存在if(access(./unix, F_OK) 0){//若存在则删除unlink(./unix);}//填充服务器的地址信息结构体。AF_UNIX: man 7 unixstruct sockaddr_un sun;sun.sun_family AF_UNIX; //必须填AF_UNIXstrcpy(sun.sun_path, ./unix); //套接字文件路径//绑定服务器的IP和端口—必须绑定if(bind(sfd, (struct sockaddr )sun, sizeof(sun)) 0){ERR_MSG(bind);return -1;}printf(bind success\n);//将套接字设置为被动监听状态监听是否有客户端连接if(listen(sfd, 128) 0){ERR_MSG(listen);return -1;}printf(listen success\n);struct sockaddr_un cun; //存储客户端地址信息socklen_t addrlen sizeof(cun);//阻塞函数阻塞等待客户端连接成功; 从已完成连接的队列头中获取一个客户端信息生成一个新的文件描述符//这个新的文件描述符才是与客户端通信的文件描述符;int newfd accept(sfd, (struct sockaddr)cun, addrlen);if(newfd 0){ERR_MSG(accept);return -1;}printf([%s] newfd%d 客户端连接成功\n, cun.sun_path, newfd);char buf[128] ;ssize_t res 0;while(1){bzero(buf, sizeof(buf));//接收数据res recv(newfd, buf, sizeof(buf), 0);if(res 0){ERR_MSG(recv);return -1;}else if(0 res){printf([%s] newfd%d 客户端下线\n, cun.sun_path, newfd);break;}printf([%s] newfd%d : %s\n, cun.sunpath, newfd, buf);//发送数据strcat(buf, **); //可以修改成从其他地方获取if(send(newfd, buf, sizeof(buf), 0) 0){ERR_MSG(send);return -1;}printf(发送成功\n);}close(newfd);//关闭文件描述符if(close(sfd) 0){ERR_MSG(close);return -1;}return 0; }2UNIX TCP 客户端 #include stdio.h #include sys/types.h #include sys/socket.h #include arpa/inet.h #include netinet/in.h #include unistd.h #include string.h #include sys/un.h#define ERR_MSG(msg) do{\fprintf(stderr, %d , LINE);\perror(msg);
}while(0)int main(int argc, const char argv[]) {//创建流式套接字int cfd socket(AF_UNIX, SOCK_STREAM, 0);if(cfd 0){ERR_MSG(socket);return -1;}//填充客户端自身的地址信息结构体。AF_UNIX: man 7 unix//绑定客户端的地址信息—非必须绑定//如果客户端不手动绑定则操作系统不会创建一个套接字文件给客户端自动绑定的。//填充服务器的地址信息结构体给connect函数使用。//要连接哪个服务器就填充哪个服务器绑定的地址信息struct sockaddr_un sun;sun.sun_family AF_UNIX; //必须填AF_UNIXstrcpy(sun.sun_path, ./unix);//连接服务器if(connect(cfd, (struct sockaddr)sun, sizeof(sun)) 0){ERR_MSG(connect);return -1;}printf(connect success\n);char buf[128] ;ssize_t res 0;while(1){bzero(buf, sizeof(buf));//发送数据printf(请输入 );fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] 0;//对方接收多少个字节发送多少个字节if(send(cfd, buf, sizeof(buf), 0) 0){ERR_MSG(send);return -1;}printf(发送成功\n);bzero(buf, sizeof(buf));//接收数据 res recv(cfd, buf, sizeof(buf), 0);if(res 0){ERR_MSG(recv);return -1;}else if(0 res){printf(cfd%d 服务器下线\n, cfd);break;}printf(cfd%d : %s\n, cfd, buf);}//关闭文件描述符if(close(cfd) 0){ERR_MSG(close);return -1;}return 0; } 四、报式域套接字 1.报式域套接字的编程与网络报式套接字编程思路是一致的但是由于客户端不手动绑定的话操作系统不会自动创建一个套接字文件给客户端绑定 2.此时若服务器想给客户端回复信息会找不到客户端的地址信息。此时客户端是必须绑定的。 1UNIX UDP服务器 #include stdio.h #include sys/types.h #include sys/socket.h #include arpa/inet.h #include netinet/in.h #include unistd.h #include string.h #include sys/un.h#define ERR_MSG(msg) do{\fprintf(stderr, %d , LINE);\perror(msg);
}while(0)int main(int argc, const char argv[]) {//创建报式套接字int sfd socket(AF_UNIX, SOCK_DGRAM, 0);if(sfd 0){ERR_MSG(socket);return -1; }printf(sfd %d\n, sfd);//判断文件是否存在//若存在则删除if(access(./unixSer, F_OK) 0){unlink(./unixSer);}//填充服务器的地址信息结构体 AF_UNIX: man 7 unixstruct sockaddr_un sun;sun.sun_family AF_UNIX;strcpy(sun.sun_path, ./unixSer);//绑定服务器的地址信息if(bind(sfd, (struct sockaddr)sun, sizeof(sun)) 0){ERR_MSG(bind);return -1;}printf(bind success\n);struct sockaddr_un cun; //存储数据包是从谁哪里来的socklen_t addrlen sizeof(cun);char buf[128] ;while(1){bzero(buf, sizeof(buf));//接收数据//if(recvfrom(sfd, buf, sizeof(buf), 0, NULL, NULL) 0)if(recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)cun, addrlen) 0){ERR_MSG(recvfrom);return -1;}printf([%s] : %s\n, cun.sunpath, buf);//发送数据 – 谁发给我我发给谁strcat(buf, *);if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr)cun, sizeof(cun)) 0){ERR_MSG(sendto);return -1;}printf(sendto success\n);}//关闭套接字close(sfd);return 0; }2UNIX UDP客户端 #include stdio.h #include sys/types.h #include sys/socket.h #include arpa/inet.h #include netinet/in.h #include unistd.h #include string.h #include sys/un.h#define ERR_MSG(msg) do{\fprintf(stderr, %d , LINE);\perror(msg);
}while(0)int main(int argc, const char argv[]) {if(argc 2){printf(请输入套接字文件路径名\n);return -1;}//创建报式套接字int cfd socket(AF_UNIX, SOCK_DGRAM, 0);if(cfd 0){ERR_MSG(socket);return -1;}printf(cfd %d\n, cfd);//绑定客户端的地址信息—》非必须绑定//如果客户端不手动绑定则操作系统不会创建一个套接字文件给客户端自动绑定的。//若服务器要给当前客户端回复信息则当前客户端必须要绑定//判断文件是否存在//若存在则删除if(access(argv[1], F_OK) 0){unlink(argv[1]);}//填充客户端的地址信息结构体给bind函数使用 struct sockaddr_un cun;cun.sun_family AF_UNIX;strcpy(cun.sun_path, argv[1]);if(bind(cfd, (struct sockaddr)cun, sizeof(cun)) 0){ERR_MSG(bind);return -1;}printf(客户端绑定成功\n);//填充服务器的地址信息结构体给下面的sendto函数使用struct sockaddr_un sun;sun.sun_family AF_UNIX;strcpy(sun.sun_path, ./unixSer);struct sockaddr_un rcvaddr; //存储数据包是从谁哪里来的socklen_t addrlen sizeof(rcvaddr);char buf[128] ;while(1){bzero(buf, sizeof(buf));//发送数据 – 给服务器printf(请输入 );fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] 0;if(sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr)sun, sizeof(sun)) 0){ERR_MSG(sendto);return -1; }printf(sendto success\n);//接收数据if(recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr)rcvaddr, addrlen) 0){ERR_MSG(recvfrom);return -1;}printf([%s] : %s\n, rcvaddr.sun_path, buf);}//关闭套接字close(cfd);return 0; }