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

📄 tcpsrv.cpp

📁 包括服务端和客户端
💻 CPP
字号:
//得用控制台应用程序编写一个基于TCP的面向连接的服务端应用程序
#include <Winsock2.h>
#include <stdio.h>

struct rc4_state
{
	int x, y, m[256];
};

void rc4_setup( struct rc4_state *s, unsigned char *key,  int length );
void rc4_crypt( struct rc4_state *s, unsigned char *data, int length );

void main()
{
	struct rc4_state s;
    unsigned char key[]={0x01,0x02,0x03,0x04,0x05,0x06};//种子密钥

	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库	
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		return;	}///...if
	//判断是否我们请求的winsocket版本,如果不是
	//则调用WSACleanup终止winsocket的使用并返回
	if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
		WSACleanup( );
		return; 	}///...if
//2.创建套接字
	SOCKET sockSrv = socket(AF_INET, 
		SOCK_STREAM,  //创建流式套接字
		0);  //零表示自动选择协议
//3.将套接字绑定到本地地址与端口上
	SOCKADDR_IN addrSrv;   //定义一个地址结构体的变量
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
		//用htonl()方法将INADDR_ANY转换为网络字节序
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000); //指定端口号
		//htons把u_short类型从主机字节序转换为网络字节序
	bind(sockSrv,(SOCKADDR *) &addrSrv,sizeof(SOCKADDR));
		//SOCKADDR大小写是一样的
//4.设置监听
	listen(sockSrv,5);
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);
	while(1)
	{	SOCKET sockConn = accept(sockSrv,
			(SOCKADDR *) &addrClient,&len);
		char sendBuf[100];
		sprintf (sendBuf,"Welcome %s to \
			http://blog.csdn.net/teshorse",
			inet_ntoa(addrClient.sin_addr));

		rc4_setup( &s, key, sizeof(key) );//生成加密子密钥序列
		rc4_crypt( &s,(unsigned char *)sendBuf,sizeof(sendBuf));//用加密子密钥序列解密数据

		send(sockConn,sendBuf,strlen(sendBuf)+1,0);

		char recvBuf[1000];
		recv(sockConn,recvBuf,1000,0);
		
		printf("接受到的数据:%s\n",recvBuf);

		rc4_setup( &s, key, sizeof(key) );//生成加密子密钥序列
		rc4_crypt( &s,(unsigned char *)recvBuf,sizeof(recvBuf));//用加密子密钥序列解密数据
		printf("%s\n",recvBuf);		

		printf("解密后的数据:%s\n",recvBuf);
		
		closesocket(sockConn);        
	}
}

//函数功能:由给定的种子密钥生成子密钥
void rc4_setup( struct rc4_state *s, unsigned char *key,  int length )
{
	int i, j, k, *m, a;

	s->x = 0;
	s->y = 0;
	m = s->m;

	for( i = 0; i < 256; i++ )
	{
		m[i] = i;
	}

	j = k = 0;

	for( i = 0; i < 256; i++ )
	{
		a = m[i];
		j = (unsigned char) ( j + a + key[k] );
		m[i] = m[j]; m[j] = a;
		if( ++k >= length ) k = 0;
	}
}
//函数功能:由生成的子密钥加解密数据
void rc4_crypt( struct rc4_state *s, unsigned char *data, int length )
{ 
	int i, x, y, *m, a, b;

	x = s->x;
	y = s->y;
	m = s->m;

	for( i = 0; i < length; i++ )
	{
		x = (unsigned char) ( x + 1 ); a = m[x];
		y = (unsigned char) ( y + a );
		m[x] = b = m[y];
		m[y] = a;
		data[i] ^= m[(unsigned char) ( a + b )];
	}

	s->x = x;
	s->y = y;
}

⌨️ 快捷键说明

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