⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketfun.c

📁 网络编程的服务端和客户端.包括用fork和select分别实现多进程编程和多线程编程.程序已经通过测试的.
💻 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 + -