原始套接字(C/S代码)

一、服务器端:

 

//  test_server.cpp : Defines the entry point for the console application.
//

#include 
" stdafx.h "
#include 
" test_server.h "

#ifdef _DEBUG
#define  new DEBUG_NEW
#undef  THIS_FILE
static   char  THIS_FILE[]  =  __FILE__;
#endif

/////
//  The one and only application object

CWinApp theApp;

using   namespace  std;

UINT MainFunc( LPVOID pParam );
UINT RecvFunc( LPVOID pParam );

int  _tmain( int  argc, TCHAR *  argv[], TCHAR *  envp[])
{
 
int nRetCode = 0;

 cout
<<"server started<<endl<<press ESC to stop server..."<<endl;
 AfxBeginThread(MainFunc,
0);

 
while(_getch()!=27);

 
return nRetCode;
}


UINT MainFunc( LPVOID pParam )
{
 
int nRet;

 
//WSAStartup
 WSADATA wsaData;
 nRet 
= WSAStartup(0x101,&wsaData);
 
if(nRet!=0)
 
{
  cout
<<"Fail:WSAStartup"<<endl;
  
return 1;
 }


 
//socket
 SOCKET socket_Server;
 socket_Server 
= socket(AF_INET,SOCK_STREAM,0);
 
if(socket_Server==INVALID_SOCKET)
 
{
  cout
<<"Fail:socket"<<endl;
  
return 1;
 }


 
//bind
 sockaddr_in sockaddr_local;
 sockaddr_local.sin_family 
= AF_INET;
 sockaddr_local.sin_port 
= htons((u_short)20480);
 sockaddr_local.sin_addr.s_addr 
= INADDR_ANY;
 nRet 
= bind(socket_Server,(sockaddr *)&sockaddr_local,sizeof(sockaddr_local));
 
if(nRet!=0)
 
{
  cout
<<"Fail:bind"<<endl;
  
return 1;
 }


 
//listen
 nRet = listen(socket_Server,5);
 
if(nRet!=0)
 
{
  cout
<<"Fail:listen"<<endl;
  
return 1;
 }


 SOCKET socket_Client;
 sockaddr_in sockaddr_client;
 
int len = sizeof(sockaddr_client);

 
//accept
 char temp[512];
 socket_Client 
= accept(socket_Server,(sockaddr *)&sockaddr_client,&len); 
 sprintf(temp,
"Connect from :%s",inet_ntoa(sockaddr_client.sin_addr));
 cout
<<temp<<endl;
 AfxBeginThread(RecvFunc,(LPVOID)socket_Client);

 sprintf(temp,
"Your IP is : %s",inet_ntoa(sockaddr_client.sin_addr));
 send(socket_Client,temp,strlen(temp),
0);
 
while(true)
 
{
 }

 closesocket(socket_Client);
 WSACleanup();
 
return 0;
}


UINT RecvFunc( LPVOID pParam )
{
 SOCKET socket_Client 
= (SOCKET)pParam;
 
char temp[512];
 
int nRet;
 
while(true)
 
{
  memset(temp,
0,512);
  nRet 
= recv(socket_Client,temp,sizeof(temp),0);
  
if(nRet<0)
  
{
   exit(
0);
  }

  cout
<<temp<<endl;
  send(socket_Client,
"message received by server",strlen("message received by server")+1,0);
 }

 
return 0;
}


 

二、客户机端

 

//  test_client.cpp : Defines the entry point for the console application.
//

#include 
" stdafx.h "
#include 
" test_client.h "

#ifdef _DEBUG
#define  new DEBUG_NEW
#undef  THIS_FILE
static   char  THIS_FILE[]  =  __FILE__;
#endif

/////
//  The one and only application object

CWinApp theApp;

// using namespace std;

UINT RecvFunc( LPVOID pParam );

int  _tmain( int  argc, TCHAR *  argv[], TCHAR *  envp[])
{
 cout
<<"Client started"<<endl;
 cout
<<"Try to connect server..."<<endl;
 
 
int nRet;

 
//WSAStartup
 WSADATA wsaData;
 nRet 
= WSAStartup(0x101,&wsaData);
 
if(nRet!=0)
 
{
  cout
<<"Fail:WSAStartup"<<endl;
  
return 1;
 }


 
//socket
 SOCKET sock;
 sock 
= socket(AF_INET,SOCK_STREAM,0);
 
if(sock==INVALID_SOCKET)
 
{
  cout
<<"Fail:socket"<<endl;
  
return 1;
 }

 
 
//connect
 HOSTENT *hp;
 sockaddr_in server;
 unsigned 
int addr = inet_addr("127.0.0.1");
 hp 
= gethostbyaddr((char *)&addr,sizeof("127.0.0.1"),AF_INET);
 
if(hp==NULL)
 
{
  closesocket(sock);
  cout
<<"can not reach host 127.0.0.1"<<endl;
  
return 1;
 }

 server.sin_addr.s_addr 
= *((unsigned long*)hp->h_addr);
 
//server.sin_addr.s_addr = inet_addr("127.0.0.1");
 server.sin_family = AF_INET;
 server.sin_port 
= htons(20480);
 nRet 
= connect(sock,(sockaddr *)&server,sizeof(server));
 
if(nRet!=0)
 
{
  cout
<<"Fail:conncet"<<endl;
  
return 1;
 }

 cout
<<"Login server OK"<<endl;

 
char temp[512];
 memset(temp,
0,512);
 sprintf(temp,
"I'm client");
 send(sock,temp,strlen(temp),
0);
 AfxBeginThread(RecvFunc,(LPVOID)sock);

 
while(true)
 
{
  memset(temp,
0,512);
  cin
>>temp;
  send(sock,temp,strlen(temp)
+1,0);
 }


 closesocket(sock);
 WSACleanup();
 
return 0;
}


UINT RecvFunc( LPVOID pParam )
{
 SOCKET sock 
= (SOCKET)pParam;
 
char temp[512];
 
int nRet;
 
while(true)
 
{
  memset(temp,
0,512);
  nRet 
= recv(sock,temp,sizeof(temp),0);
  
if(nRet<0)
  
{
   exit(
0);
  }

  cout
<<temp<<endl;
 }

 
return 0;
}
 

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值