📄 socketfun.c
字号:
#include <stddef.h>#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/un.h>#include <netdb.h>#include <netinet/in.h>#include "err_exit.h"#include "socketfun.h"/* 创建和命名文件套接字 */int make_named_socket(const char * filename){ struct sockaddr_un name; int sock; size_t size; memset(&name,0,sizeof(struct sockaddr_un)); /* 创建套接字 */ sock=socket(AF_UNIX,SOCK_DGRAM,0); if(sock<0) err_exit("socket"); /* 命名套接字 */ name.sun_family=AF_UNIX; strcpy(name.sun_path,filename); /* 地十的大小是文件名开始听偏移与其长度之和加1(用于终止的空字节)*/ /* size=sizeof(struct sockaddr_un)+1; */ size=sizeof(struct sockaddr_un); if(bind(sock,(struct sockaddr *)&name,size)<0) err_exit("bind"); return sock;}/* 命名一个Internet套接字地址 */void init_sockaddr(struct sockaddr_in * name,const char * hostname,const char *serv){ struct hostent *hp; char *host,myname[255]; if(hostname==NULL){ gethostname(myname,sizeof(myname)); host=myname; }else{ host=(char *)hostname; } /* 获取主机地址信息 */ if((hp=gethostbyname(host))==NULL){ printf("Unknown host:%s\n",host); exit(-1); } /* 填入服务器的IP地址和端口 */ bzero(name,sizeof(struct sockaddr)); /*printf("AF_INET=%d\n",AF_INET);*/ if(hp->h_addrtype==AF_INET){ name->sin_family=AF_INET; bcopy(hp->h_addr_list[0],&name->sin_addr,hp->h_length); if(serv==NULL) name->sin_port=htons(0); else name->sin_port=htons(atoi(serv)); }else{ printf("Unknown address type\n"); exit(-1); }}int make_socket(unsigned short int port){ int sock; struct sockaddr_in name; /* 创建套接字 */ sock=socket(AF_INET,SOCK_STREAM,0); if(sock<0) err_exit("socket"); /* 命名套接字 */ name.sin_family=AF_INET; name.sin_port=htons(port); name.sin_addr.s_addr=htonl(INADDR_ANY); /*name.sin_addr.s_addr=inet_addr("192.168.1.68");*/ /*bzero(&name.sin_zero,8);*/ if(bind(sock,(struct sockaddr *)&name,sizeof(struct sockaddr_in))<0) err_exit("bind"); return sock; }int socket_connect(const char *hostname,const char *serv_port){ int sockfd; struct sockaddr_in sockaddr; struct hostent *hp; char *host,myname[MAXNAMELEN]; /* 初始化服务的IP地址和端口 */ init_sockaddr(&sockaddr,hostname,serv_port); /* 创建套接字 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) err_exit("socket error"); /* 建立与服务的连接 */ if(connect(sockfd,(struct sockaddr *)&sockaddr,sizeof(sockaddr))<0) err_exit("connect error"); return(sockfd);}int socket_listen(const char *hostname,const char *server){ int sockfd; struct sockaddr_in name; /* 创建套接字 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) err_exit("socket error"); /* 初始套接字地址结构 */ init_sockaddr(&name,hostname,server); if(bind(sockfd,(struct sockaddr *)&name,sizeof(name))<0) err_exit("bind"); /* 创建侦听队列 */ listen(sockfd,LISTENQ); return sockfd;}/*int check_per(int sockfd,in_addr_t *refuselist){ socklen_t len; struct sockaddr_in addr,raddr; in_addr_t s_addr; /* 查看与我连接的是谁 *//* len=sizeof(raddr); if(getpeername(sockfd,(struct sockaddr *)&raddr,&len)<0){ printf("getpeername with socket %d failed \n",sockfd); return -1; } /* 拒绝来自特定地址的连接 *//* s_addr=raddr.sin_addr.s_addr; ap=refuse_addr_list; for(;ap!=0;ap+=){ close(sockfd); return -1; } return 0;}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -