您的位置:首页 > 理论基础 > 计算机网络

C++网络编程之——简易的服务器端与客户端

2010-10-18 06:28 357 查看
服务器端:

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

#include "stdafx.h"
#include "CSexample.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 severthread(LPVOID pParam);

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

//按下ESC键退出

cout<<"Press ESCAPE to teminate program/r/n";

//创建处理线程

AfxBeginThread(severthread,0);

while(getchar()!=27);

return nRetCode;
}

UINT severthread(LPVOID pParam)
{
cout<<"starting up tcp sever"<<endl<<endl;

SOCKET server; //服务器端套接字

WSADATA wsadata; //用于WSAstartup填充

sockaddr_in local; //本地端口信息

int wsaret=WSAStartup(0x101,&wsadata); //WSAstartup初始化WINDOWS SOCKET API

if(wsaret!=0)
{
return 0;
}

//描述本地信息
local.sin_addr.S_un.S_addr=INADDR_ANY;
local.sin_family=AF_INET;
local.sin_port=htons((u_short)80); //本地服务器端口号

server=socket(AF_INET,SOCK_STREAM,0); //创建套接字

if(server==INVALID_SOCKET)
{
return 0;
}

if(bind(server,(sockaddr*)&local,sizeof(local))!=0) //绑定套接字
{
return 0;
}

if(listen(server,10)!=0) //设置监听状态
{
return 0;
}

SOCKET client; //客户端套接字

sockaddr_in from; //客户端端口信息

int fromlen=sizeof(from);

//永真循环,接收客户端连接,并发送相应信息

while(1)
{
char temp[512];

client=accept(server,(sockaddr*)&from ,&fromlen);

sprintf(temp,"YOUR ip is %s/n",inet_ntoa(from.sin_addr));

send(client,temp,strlen(temp)+1,0);

cout<<"connection from "<<inet_ntoa(from.sin_addr)<<endl<<endl;

closesocket(client);
}

//关闭套接字

closesocket(server);

//撤销WINDOWS SOCKET API
WSACleanup();

return 0;
}


客户端:

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

#include "stdafx.h"
#include "CSclient2.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;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode=0;
SOCKET conn; //客户端套接字

WSADATA wsadata; //用于WSAstartup填充

sockaddr_in server; //服务器端端口信息

int wsaret=WSAStartup(0x101,&wsadata);

if(wsaret!=0)
{
return 0;
}

conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建客户端套接字

if(conn==INVALID_SOCKET)
{
return 0;
}

char servername[100]; //服务器端名称或IP地址
struct hostent *hp; //服务器端信息
unsigned long addr; //服务器端IP地址

end1:
//既许可输入服务器端名称,亦允许通过输入服务器IP地址来连接服务器

cout<<"please input servername "<<endl;

cin>>servername;

if(inet_addr(servername)==INADDR_NONE)
{
hp=gethostbyname(servername);
}

else
{
addr=inet_addr(servername);
hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);
}

if(hp==NULL)
{
goto end1;
closesocket(conn);
return 0;
}

//设置欲连接服务器信息
server.sin_addr.S_un.S_addr=*((unsigned long*)hp->h_addr);
server.sin_family=AF_INET;
server.sin_port=htons(80);

//连接服务器
if(connect(conn,(struct sockaddr*)&server,sizeof(server)))
{
goto end1;
closesocket(conn);
return 0;
}

char buff[512];

//连接成功,接收服务器发来信息

recv(conn,buff,512,0);
cout<<buff<<endl;

//关闭客户端
closesocket(conn);

//撤销WINDOWS SOCKET API
WSACleanup();

return nRetCode;
}


在客户端输入服务器端IP地址后

服务器端显示:

Press ESCAPE to teminate program
starting up tcp sever

connection from 222.210.8.222

客户端显示:

please input servername
222.210.8.222
YOUR ip is 222.210.8.222

Press any key to continue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: