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

📄 service.cpp

📁 一个简单的用于实验的端口复用源代码~! 供大家学习探讨~!
💻 CPP
字号:
// rebind.cpp : Defines the entry point for the console application.
//


#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <stdio.h>


unsigned int port=8000;//默认重绑定端口


DWORD WINAPI ThreadProc(LPVOID lpParam) 
{ 
	SOCKET sClient = (SOCKET)lpParam; 
	SOCKET sNative; 
	char buff[256]={0}; 
	SOCKADDR_IN saddr; 
	DWORD val; 
	saddr.sin_family = AF_INET; 
	//设置要连接的回环地址
	saddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
	saddr.sin_port = htons(port); 
	//建立套接字
	if((sNative=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR) 
	{ 
		printf("socket error\n"); 
		return 0; 
	} 
	val = 100; 
	//设置收发数据超时时间
	if(setsockopt(sNative,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0) 
	{ 
		printf("setsockopt sNative error \n");
		return 0; 
	} 
	if(setsockopt(sClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0) 
	{ 
		printf("setsockopt sClient failed \n");
		return 0; 
	} 
	//连接127.0.0.1的port端口


	DWORD ret; 
	//循环接收从客户发来的数据,发给127.0.0.1,并判断特征字符
	//同时把从127.0.0.1收到的数据发给客户
    char buffer[256];

	while(TRUE) 
	{ 
		//接收从客户来的数据
		int ret = recv(sClient,buffer,256,0); 

        if(ret==-1)
		{
			printf("error\n");  
		}
        //buffer[ret]=0;
		//printf("%d",ret);
        printf("%s\n",buffer);
	} 


	closesocket(sClient); 
	closesocket(sNative); 
	return 0 ; 
} 



int main(int argc, char* argv[])
{		
	char szHost[256];
	sockaddr_in saddr; 
	sockaddr_in caddr;  
	SOCKET sListen; 
	SOCKET sClient[1000]; 
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2, 2);


	/*if (argc!=1)
	port=atoi(argv[1]);
	printf("port reuse test Startup.....\n");*/


	//加载winsock库
	if(WSAStartup(sockVersion, &wsaData) != 0)
        return 0;
	
	saddr.sin_family = AF_INET; 
	//设置要绑定的IP地址,公网IP
	saddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
	saddr.sin_port = htons(port); 
	//建立套接字
	sListen=WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
	if(sListen==SOCKET_ERROR)
	{ 
		printf("WSASocket error \n"); 
		return 0; 
	} 
	int val=1;  
	//设置套节字为可以重复绑定端口
	if(setsockopt(sListen,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0) 
	{ 
		printf("setsockopt error\n"); 
		return 0; 
	} 
	//绑定套接字到公网IP上
	if(bind(sListen,(SOCKADDR *)&saddr,sizeof(saddr))==SOCKET_ERROR) 
	{ 
		printf("bind error \n"); 
		return 0; 
	} 
	//接听套接字
	listen(sListen,1000); 
	DWORD ThreadId;
	HANDLE hThread;
	for (int i=0;i<1000;i++)
	{ 
		int Addrsize = sizeof(caddr); 
		//接受新连接
		sClient[i] = accept(sListen,(struct sockaddr *)&caddr,&Addrsize); 
		//printf("%s\n",inet_ntoa(caddr.sin_addr));
		if(sClient[i]!=INVALID_SOCKET) 
		{ 	
			//开启新线程
			hThread = CreateThread(NULL,0,ThreadProc,(LPVOID)sClient[i],0,&ThreadId); 
			if(hThread==NULL) 
			{ 
				printf("CreateThread error"); 
				break; 
			} 
		} 
		CloseHandle(hThread); 
	} 
	closesocket(sListen); 
	WSACleanup(); 
	return 0; 
} 

⌨️ 快捷键说明

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