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

网络安全编程_面向连接的套接字_C/S模式

2016-06-09 00:51 363 查看
通过此程序,可以简单的实现客户端跟服务端之间的通信,基于面向连接(TCP协议)的套接字。

所需函数说明:

服务器端:

WSAStartup() //初始化套接字

socket() //创建套接字

bind() //绑定套接字

listen() // 监听套接字,是否有客户端连接请求

accept() //接收客户端请求

recv() //接收数据

send() //发送数据

WSACleanup() //释放套接字

客户端:

WSAStartup() //初始化套接字

socket() //创建套接字

connct() // 连接服务器,成功后即可收发数据

recv() //接收数据

send() //发送数据

WSACleanup() //释放套接字

下面是代码的实现:

客户端:

// Client.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include<WinSock2.h>

#pragma comment(lib,"ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])

{

WSADATA wsaData;//初始化套接字函数的参数
SOCKET ClientSocket;//客户端自己的套接字
SOCKADDR_IN ServerAddr;//服务器地址信息

int ServerPort = 8888;//连接服务器8888端口
char ServerIPAddr[50] = "127.0.0.1";//127.0.0.1这个IP地址代表本机
char *SendData = "Hello World";//发送数据
char ReceiveBuffer[1024] = "";//接收数据缓冲区
int SendLength = 1;
int Result = -1;

if(Result = WSAStartup(MAKEWORD(2 ,1) ,&wsaData) != 0)//初始化套接字
{
printf("WSAStartup error, %d" ,Result);
return -1;
}

//绑定套接字,第一个参数指定IP地址类型为IPV4,第二个为数据流,第三个为TCP协议
ClientSocket = socket(AF_INET ,SOCK_STREAM ,IPPROTO_TCP);
if(ClientSocket < 0)
{
printf("socket failed ,%d\n" ,WSAGetLastError());
return -1;
}

memset(&ServerAddr ,0 ,sizeof(ServerAddr));//套接字清零。
ServerAddr.sin_family = AF_INET;//IPV4结构
ServerAddr.sin_port = htons(ServerPort);//端口转换为16位网络字节顺序,并赋值给要连接的服务器套接字的
ServerAddr.sin_addr.S_un.S_addr = inet_addr(ServerIPAddr);//转换服务器IP地址并赋值

//连接服务器,第一个参数为本地套接字;第二个为服务器套接字;第三个为服务器套接字长度
Result = connect(ClientSocket ,(SOCKADDR*)&ServerAddr ,sizeof(ServerAddr));
if(Result < 0)
{
printf("connect failed ,%d\n" ,WSAGetLastError());
return -1;
}
//发送数据函数。第一个参数为本地套接字,第二个为发送数据的缓冲区,第三个为实际数据长度,第四个为标志,一般设为0
SendLength = send(ClientSocket ,SendData ,strlen(SendData) ,0);
if(SendLength < 0)
{
printf("send data failed ,%d\n" ,WSAGetLastError());
return -1;
}
else
{
printf("send Data: %s\n" ,SendData);
}

//接收数据
int ReceiveLen;
memset(ReceiveBuffer ,0 ,sizeof(ReceiveBuffer));//清零接收缓冲区
//跟send基本差不多,唯一不同的是长度参数,代表最高能接收多少字节的数据
if((ReceiveLen = recv(ClientSocket ,ReceiveBuffer ,1024 ,0)) < 0)
{
printf("recv failed ,%d" ,WSAGetLastError());
return -1;
}

else
{
printf("recv data: %s\n" ,ReceiveBuffer);
}

//关闭套接字
if(closesocket(ClientSocket) ==SOCKET_ERROR)
{
printf("closesocket failed ,%d\n" ,WSAGetLastError());
return -1;
}
//释放套接字
if(WSACleanup() == SOCKET_ERROR)
{
printf("WSACleanup error ,%d" ,WSAGetLastError());
return -1;
}
system("pause");
return 0;

}

服务端:

// Server.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include<WinSock2.h>

#pragma comment(lib,"ws2_32.lib")

int _tmain(int argc, _TCHAR* argv[])

{
WSADATA wsaData;//初始化用的参数
SOCKET ServerSocket;//服务器套接字
SOCKET NewSocket;//请求连接的客户端套接字
SOCKADDR_IN ServerAddr;//服务器地址结构
SOCKADDR_IN ClientAddr;//客户地质结构

int ClientAddrLen;
int ServerPort = 8888;//开放8888端口接收客户连接
char ReceiveBuffer[2048];//接收数据缓冲区
int ReceiveLen = 0;
int Result = 0;

if(Result = WSAStartup(MAKEWORD(2 ,1) ,&wsaData) != 0)//初始化数据
{
printf("WSAStartup error, %d" ,Result);
return -1;
}

ServerSocket = socket(AF_INET ,
SOCK_STREAM ,IPPROTO_TCP);//绑定套接字
if(ServerSocket < 0)
{
printf("Socket failed ,%d\n",WSAGetLastError());
return -1;
}

//填充本地服务器地址结构信息
memset(&ServerAddr ,0 ,sizeof(ServerAddr));
ServerAddr.sin_family = AF_INET;//IPV4
ServerAddr.sin_port = htons(ServerPort);//开放端口
ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//127.0.0.1代表每台电脑自己本身的IP

Result = bind(ServerSocket ,(SOCKADDR*)&ServerAddr ,sizeof(ServerAddr));//绑定服务器地址结构到服务器套接字
if(Result < 0)
{
printf("bind failed ,%d\n" ,WSAGetLastError());
return -1;
}

Result = listen(ServerSocket ,5);//监听客户连接
if(Result < 0)
{
printf("listen failed ,%d\n" ,WSAGetLastError());
return -1;
}

ClientAddrLen = sizeof(SOCKADDR);
int SendLength;

do{
//接收客户端连接,NewSocket代表连接的客户的地址结构信息
NewSocket = accept(ServerSocket ,(SOCKADDR*)&ClientAddr ,&ClientAddrLen);
if(NewSocket < 0)
{
printf("accept failedn ,%d\n" ,WSAGetLastError());
return -1;
}
else do
{
memset(ReceiveBuffer ,0 ,sizeof(ReceiveBuffer));
//接收数据
if((ReceiveLen = recv(NewSocket ,ReceiveBuffer ,1024 ,0)) < 0)
{
printf("recv failed ,%d\n" ,WSAGetLastError());
return -1;
}
if(ReceiveLen == 0)
{
printf("recv finished\n");

}
else
{
ReceiveBuffer[1024] = '\0';
printf("Receive Data: %s\n" ,ReceiveBuffer);
//发送数据
SendLength = send(NewSocket ,ReceiveBuffer ,strlen(ReceiveBuffer) ,0);
if(SendLength < 0)
{
printf("send failed ,%d\n" ,WSAGetLastError());
return -1;
}
else
{
printf("send data: %s\n" ,ReceiveBuffer);
}
}
}while(ReceiveLen !=0);

if(closesocket(NewSocket) == SOCKET_ERROR)
{
printf("close socket failed ,%d\n",WSAGetLastError());
return -1;
}
}while(1);

if(closesocket(ServerSocket) == SOCKET_ERROR)
{
printf("close socket failed ,%d\n",WSAGetLastError());
return -1;
}

if(WSACleanup() == SOCKET_ERROR)
{
printf("WSACleanup error ,%d" ,WSAGetLastError());
return -1;
}
system("pause");
return 0;

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