大虾们帮我看看我的代理服务器程序呀
/*********************************************************************/
/***************WINDOWS SOCKET代理服务器******************************/
/*********************************************************************/
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>
#define MY_SERVER_PORT 5060 /*服务端口 */
#define PROXY_PORT 8080
#define MAX_MSG_SIZE 1023 /*缓冲区的大小 */
#define BACKLOG 5 /*等待服务的最大数*/
SOCKET ser_socket, /* 服务器socket */
cli_socket, /* 客户端SOCKET */
pro_socket; /* 代理服务器socket*/
struct sockaddr_in cli_addr, /* 客户端的地址 */
ser_addr, /* 服务器的地址 */
pro_addr; /* 代理服务器地址*/
char proaddr[]="172.17.1.97";
int addrlen;
/*服务过程;服务器接受一条消息,然后发送一条消息 */
int Server_Proc()
{
int n; /* 接受到的或发送的数据的字节数*/
char msg[MAX_MSG_SIZE+1]; /* 缓冲区*/
/* 接收客户端消息 */
n=recv(cli_socket,msg,MAX_MSG_SIZE,0);
if( n > 0)
{
msg[n]=0;
printf("*********************Receiving from client**************************\n");
// printf("%s\n",msg);
}
else if(n == 0)
{
printf("client connection closed!\n");
getch();
}
else if(n == SOCKET_ERROR)
{
printf("client socket error in recvieving client msg!\n");
getch();
}
/* 初始化代理服务器地址*/
addrlen=sizeof(struct sockaddr_in);
memset(&ser_addr,0,addrlen);
pro_addr.sin_family=AF_INET;
pro_addr.sin_addr.s_addr=inet_addr(proaddr);
pro_addr.sin_port=htons(PROXY_PORT);
//请求连接代理服务器
if(connect(pro_socket,(struct sockaddr *)&pro_addr,addrlen) == SOCKET_ERROR)
{
fprintf(stderr,"Listen Error:%s\n",GetLastError());
getch();
exit(1);
}
else
{
fprintf(stdout,"connect to Proxy(172.17.1.97:8080) successfully!\n");
}
/* 转发消息到代理服务器*/
n = send(pro_socket,msg,sizeof(msg),0);
if( n > 0)
{
printf("***********************Sending to proxy************************\n");
// printf("%s\n",msg);
}
else if(n == 0)
{
printf("\nproxy connection closed!\n");
getch();
}
else if(n == SOCKET_ERROR)
{
printf("proxy socket error in recvieving client msg!\n");
getch();
}
/* 从代理服务器接收消息*/
while(n=recv(pro_socket,msg,MAX_MSG_SIZE,0))
{
msg[n] = '\0';
printf("********************Receiving from proxy**********************\n");
// printf("%s\n",msg);
/* 返回数据给客户端 */
n = send(cli_socket,msg,sizeof(msg),0);
if( n > 0)
{
msg[n] = '\0';
printf("***********************Sending to client**************************\n");
// printf("%s\n",msg);
}
else if(n == 0)
{
printf("proxy connection closed!\n");
getch();
}
else if(n == SOCKET_ERROR)
{
printf("client socket error in recvieving client msg!\n");
getch();
}
}
closesocket(cli_socket);
return 1;
}
void PreExit()
{
WSACleanup();
closesocket(ser_socket);
// closesocket(cli_socket);
closesocket(pro_socket);
}
void main()
{
WSADATA WSAData;
//init WSA
if(WSAStartup(MAKEWORD(2,2),&WSAData))
{
printf("WSA start error!");
exit(0);
}
/*创建连接的SOCKET */
ser_socket = socket(AF_INET,SOCK_STREAM,0);
pro_socket = socket(AF_INET,SOCK_STREAM,0);
if(ser_socket == INVALID_SOCKET
|| pro_socket == INVALID_SOCKET)
{/*创建失败 */
fprintf(stderr,"socker Error:%s\n",GetLastError());
exit(1);
}
else
{
fprintf(stdout,"socket creating successfully!\n");
}
//初始化服务器地址
addrlen=sizeof(struct sockaddr_in);
memset(&ser_addr,0,addrlen);
ser_addr.sin_family=AF_INET;
ser_addr.sin_addr.s_addr=htonl(INADDR_ANY); //任何主机都可以访问
ser_addr.sin_port=htons(MY_SERVER_PORT);
if(bind(ser_socket,(struct sockaddr *)&ser_addr,sizeof(ser_addr)) == SOCKET_ERROR)
{/*绑定失败 */
fprintf(stderr,"Bind Error:%s\n",GetLastError());
PreExit();
exit(1);
}
else
{
fprintf(stdout,"bind socket to 172.17.1.39:5060 successfully!\n");
}
//初始化客户端地址
addrlen = sizeof(struct sockaddr_in);
memset(&pro_addr,0,addrlen);
cli_addr.sin_family=AF_INET;
cli_addr.sin_addr.s_addr=htonl(INADDR_ANY);
cli_addr.sin_port=0;
if(bind(pro_socket,(struct sockaddr *)&cli_addr,sizeof(cli_addr)) == SOCKET_ERROR)
{/*绑定失败 */
fprintf(stderr,"Bind Error:%s\n",GetLastError());
PreExit();
exit(1);
}
else
{
fprintf(stdout,"bind Proxy socket successfully!\n");
}
/*侦听客户端请求*/
if(listen(ser_socket,SOMAXCONN) == SOCKET_ERROR )
{
fprintf(stderr,"Listen Error:%s\n",GetLastError());
PreExit();
exit(1);
}
else
{
fprintf(stdout,"Start listening ....\n");
}
addrlen = sizeof(cli_addr);
while(1)
{
/*等待接收客户连接请求 */
cli_socket = accept(ser_socket,(struct sockaddr*)&cli_addr,&addrlen);
if(cli_socket == INVALID_SOCKET)
{
fprintf(stderr,"Accept Error:%s\n",GetLastError());
}
else
{/*开始服务*/
// CreateThread();
fprintf(stdout,"begin process....\n");
Server_Proc();
}
}
PreExit();
}