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

📄 main.c

📁 psp开发用的所有头文件。包含所有系统API。需要psp-gcc编译器。在www.psp-dev.com上有
💻 C
字号:
/* * PSP Software Development Kit - http://www.pspdev.org * ----------------------------------------------------------------------- * Licensed under the BSD license, see LICENSE in PSPSDK root for details. * * main.c - Simple elf based network example. * * Copyright (c) 2005 James F <tyranid@gmail.com> * Some small parts (c) 2005 PSPPet * * $Id: main.c 1887 2006-05-01 03:54:06Z jim $ * $HeadURL: svn://svn.ps2dev.org/psp/trunk/pspsdk/src/samples/net/simple/main.c $ */#include <pspkernel.h>#include <pspdebug.h>#include <pspsdk.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <pspnet.h>#include <pspnet_inet.h>#include <pspnet_apctl.h>#include <pspnet_resolver.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/select.h>#include <errno.h>#define printf pspDebugScreenPrintf#define MODULE_NAME "NetSample"#define HELLO_MSG   "Hello there. Type away.\r\n"PSP_MODULE_INFO(MODULE_NAME, 0x1000, 1, 1);PSP_MAIN_THREAD_ATTR(0);/* Exit callback */int exit_callback(int arg1, int arg2, void *common){	sceKernelExitGame();	return 0;}/* Callback thread */int CallbackThread(SceSize args, void *argp){	int cbid;	cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);	sceKernelRegisterExitCallback(cbid);	sceKernelSleepThreadCB();	return 0;}/* Sets up the callback thread and returns its thread id */int SetupCallbacks(void){	int thid = 0;	thid = sceKernelCreateThread("update_thread", CallbackThread,				     0x11, 0xFA0, PSP_THREAD_ATTR_USER, 0);	if(thid >= 0)	{		sceKernelStartThread(thid, 0, 0);	}	return thid;}#define SERVER_PORT 23int make_socket(uint16_t port){	int sock;	int ret;	struct sockaddr_in name;	sock = socket(PF_INET, SOCK_STREAM, 0);	if(sock < 0)	{		return -1;	}	name.sin_family = AF_INET;	name.sin_port = htons(port);	name.sin_addr.s_addr = htonl(INADDR_ANY);	ret = bind(sock, (struct sockaddr *) &name, sizeof(name));	if(ret < 0)	{		return -1;	}	return sock;}/* Start a simple tcp echo server */void start_server(const char *szIpAddr){	int ret;	int sock;	int new = -1;	struct sockaddr_in client;	size_t size;	int readbytes;	char data[1024];	fd_set set;	fd_set setsave;	/* Create a socket for listening */	sock = make_socket(SERVER_PORT);	if(sock < 0)	{		printf("Error creating server socket\n");		return;	}	ret = listen(sock, 1);	if(ret < 0)	{		printf("Error calling listen\n");		return;	}	printf("Listening for connections ip %s port %d\n", szIpAddr, SERVER_PORT);	FD_ZERO(&set);	FD_SET(sock, &set);	setsave = set;	while(1)	{		int i;		set = setsave;		if(select(FD_SETSIZE, &set, NULL, NULL, NULL) < 0)		{			printf("select error\n");			return;		}		for(i = 0; i < FD_SETSIZE; i++)		{			if(FD_ISSET(i, &set))			{				int val = i;				if(val == sock)				{					new = accept(sock, (struct sockaddr *) &client, &size);					if(new < 0)					{						printf("Error in accept %s\n", strerror(errno));						close(sock);						return;					}					printf("New connection %d from %s:%d\n", val, 							inet_ntoa(client.sin_addr),							ntohs(client.sin_port));					write(new, HELLO_MSG, strlen(HELLO_MSG));					FD_SET(new, &setsave);				}				else				{					readbytes = read(val, data, sizeof(data));					if(readbytes <= 0)					{						printf("Socket %d closed\n", val);						FD_CLR(val, &setsave);						close(val);					}					else					{						write(val, data, readbytes);						printf("%.*s", readbytes, data);					}				}			}		}	}	close(sock);}/* Connect to an access point */int connect_to_apctl(int config){	int err;	int stateLast = -1;	/* Connect using the first profile */	err = sceNetApctlConnect(config);	if (err != 0)	{		printf(MODULE_NAME ": sceNetApctlConnect returns %08X\n", err);		return 0;	}	printf(MODULE_NAME ": Connecting...\n");	while (1)	{		int state;		err = sceNetApctlGetState(&state);		if (err != 0)		{			printf(MODULE_NAME ": sceNetApctlGetState returns $%x\n", err);			break;		}		if (state > stateLast)		{			printf("  connection state %d of 4\n", state);			stateLast = state;		}		if (state == 4)			break;  // connected with static IP		// wait a little before polling again		sceKernelDelayThread(50*1000); // 50ms	}	printf(MODULE_NAME ": Connected!\n");	if(err != 0)	{		return 0;	}	return 1;}int net_thread(SceSize args, void *argp){	int err;	do	{		if((err = pspSdkInetInit()))		{			printf(MODULE_NAME ": Error, could not initialise the network %08X\n", err);			break;		}		if(connect_to_apctl(1))		{			// connected, get my IPADDR and run test			char szMyIPAddr[32];			if (sceNetApctlGetInfo(8, szMyIPAddr) != 0)				strcpy(szMyIPAddr, "unknown IP address");			start_server(szMyIPAddr);		}	}	while(0);	return 0;}/* Simple thread */int main(int argc, char **argv){	SceUID thid;	SetupCallbacks();	pspDebugScreenInit();	if(pspSdkLoadInetModules() < 0)	{		printf("Error, could not load inet modules\n");		sceKernelSleepThread();	}	/* Create a user thread to do the real work */	thid = sceKernelCreateThread("net_thread", net_thread, 0x18, 0x10000, PSP_THREAD_ATTR_USER, NULL);	if(thid < 0)	{		printf("Error, could not create thread\n");		sceKernelSleepThread();	}	sceKernelStartThread(thid, 0, NULL);	sceKernelExitDeleteThread(0);	return 0;}

⌨️ 快捷键说明

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