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

📄 devip-win32.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <windows.h>#include "u.h"#include "lib.h"#include "dat.h"#include "fns.h"#include "error.h"#include "devip.h"#ifdef MSVC#pragma comment(lib, "wsock32.lib")#endif#undef listen#undef accept#undef bindvoidosipinit(void){	WSADATA wasdat;	char buf[1024];	if(WSAStartup(MAKEWORD(1, 1), &wasdat) != 0)		panic("no winsock.dll");	gethostname(buf, sizeof(buf));	kstrdup(&sysname, buf);}intso_socket(int type){	int fd, one;	switch(type) {	default:		error("bad protocol type");	case S_TCP:		type = SOCK_STREAM;		break;	case S_UDP:		type = SOCK_DGRAM;		break;	}	fd = socket(AF_INET, type, 0);	if(fd < 0)		oserror();	one = 1;	if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof(one)) > 0){		oserrstr();		print("setsockopt: %s\n", up->errstr);	}	return fd;}voidso_connect(int fd, unsigned long raddr, unsigned short rport){	struct sockaddr_in sin;	memset(&sin, 0, sizeof(sin));	sin.sin_family = AF_INET;	hnputs(&sin.sin_port, rport);	hnputl(&sin.sin_addr.s_addr, raddr);	if(connect(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0)		oserror();}voidso_getsockname(int fd, unsigned long *laddr, unsigned short *lport){	int len;	struct sockaddr_in sin;	len = sizeof(sin);	if(getsockname(fd, (struct sockaddr*)&sin, &len) < 0)		oserror();	if(sin.sin_family != AF_INET || len != sizeof(sin))		error("not AF_INET");	*laddr = nhgetl(&sin.sin_addr.s_addr);	*lport = nhgets(&sin.sin_port);}voidso_listen(int fd){	if(listen(fd, 5) < 0)		oserror();}intso_accept(int fd, unsigned long *raddr, unsigned short *rport){	int nfd, len;	struct sockaddr_in sin;	len = sizeof(sin);	nfd = accept(fd, (struct sockaddr*)&sin, &len);	if(nfd < 0)		oserror();	if(sin.sin_family != AF_INET || len != sizeof(sin))		error("not AF_INET");	*raddr = nhgetl(&sin.sin_addr.s_addr);	*rport = nhgets(&sin.sin_port);	return nfd;}voidso_bind(int fd, int su, unsigned short port){	int i, one;	struct sockaddr_in sin;	one = 1;	if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(one)) < 0){		oserrstr();		print("setsockopt: %s", up->errstr);	}	if(su) {		for(i = 600; i < 1024; i++) {			memset(&sin, 0, sizeof(sin));			sin.sin_family = AF_INET;			sin.sin_port = i;			if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) >= 0)					return;		}		oserror();	}	memset(&sin, 0, sizeof(sin));	sin.sin_family = AF_INET;	hnputs(&sin.sin_port, port);	if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) < 0)		oserror();}intso_gethostbyname(char *host, char**hostv, int n){	int i;	char buf[32];	unsigned char *p;	struct hostent *hp;	hp = gethostbyname(host);	if(hp == 0)		return 0;	for(i = 0; hp->h_addr_list[i] && i < n; i++) {		p = (unsigned char*)hp->h_addr_list[i];		sprint(buf, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);		hostv[i] = strdup(buf);		if(hostv[i] == 0)			break;	}	return i;}char*hostlookup(char *host){	char buf[100];	uchar *p;	HOSTENT *he;	he = gethostbyname(host);	if(he != 0 && he->h_addr_list[0]) {		p = he->h_addr_list[0];		sprint(buf, "%ud.%ud.%ud.%ud", p[0], p[1], p[2], p[3]);	} else		strcpy(buf, host);	return strdup(buf);}intso_getservbyname(char *service, char *net, char *port){	struct servent *s;	s = getservbyname(service, net);	if(s == 0)		return -1;	sprint(port, "%d", nhgets(&s->s_port));	return 0;}intso_send(int fd, void *d, int n, int f){	return send(fd, d, n, f);}intso_recv(int fd, void *d, int n, int f){	return recv(fd, d, n, f);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -