当前位置:文档之家› 基于socket通信系统设计

基于socket通信系统设计

基于Socket通信系统设计实验报告
一、实验目的和要求
1、掌握VC++集成开发环境编写网络程序的方法;
2、掌握客户/服务器(C/S)应用的工作方式;
3、学习网络中进程之间通信的原理和实现方法;
二、实验内容
所编写的程序应具有如下功能:
1. 具有点对点通信功能,服务器向客户端发送消息,客户端接收服务器发送的消息并显示;
2、具有广播功能,服务器能够向连接到服务器的所有客户端广播消息;
三、编程语言和环境
1. 编程语言C/C++;
2. 编程环境Windows Visual Studio 2010。

四、Socket通信的实现
Windows Sockets是一套开放的、支持多种协议的Windows下的网络编程接口,利用Sockets套接字能够实现不同主机间的网络通信。

Socket实际是在计算机中建立一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。

目前常用的套接字类型是基于TCP/IP协议的流式套接字,其特点是提供一种可靠的、面向连接的数据传输服务。

本实验采用基于TCP/IP协议的流式套接字实现发送方与接收方之间的安全通信。

其程序实现流程如下图所示:
服务器端客户端
1.服务器端
首先调用socket函数来建立一个套接字;套接字创建成功后,调用bind函数将一个IP地址和端口号绑定到己经建立的socket上;绑定完成之后,服务器等待接收客户端的连接请求,调用listen函数实现监听的功能;监听到连接请求之后,服务器调用accept函数生成一个新的套接口描述符,以接受客户的连接请求,之后调用send/receive 函数在套接字上进行数据的读/写,直至完成交换;通信结束之后,调用close函数关闭套接字。

服务器socket通信程序:
//创建socket套接字连接
if(m_hSocket != NULL){
closesocket(m_hSocket);
m_hSocket = NULL; }
if(m_hSocket == NULL){
m_hSocket = socket(AF_INET, SOCK_STREAM,0);
ASSERT(m_hSocket != NULL); }
m_addr.sin_family = AF_INET;
m_addr.sin_addr.S_un.S_addr = INADDR_ANY;
m_addr.sin_port = htons(m_nPort);
int ret = 0,error = 0;
ret = bind(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));
if(ret == SOCKET_ERROR){
TRACE("Bind Error: %d \n", (error = WSAGetLastError()));
return ; }
ret = listen(m_hSocket, 2);
if(ret == SOCKET_ERROR){
TRACE("Listen Error: %d \n", (error = WSAGetLastError()));
return ; }
SOCKET s = accept(m_hSocket, NULL, NULL);
if(s == SOCKET_ERROR){
TRACE("Accept Error: %d \n", (error = WSAGetLastError()));
return ; }
//监听接收到信息
char buff[256];
ret = recv(s, buff, 256, 0);
if(ret == 0 || ret == SOCKET_ERROR ){
TRACE("Recv data error: %d\n", WSAGetLastError());
return ; }
char* name = NULL;
char* pass = NULL;
int len = 0;
len = buff[0];
name = new char[len + 1];
for(int i = 0; i < len; i++)
name[i] = buff[i+1];
int len2 = buff[len + 1];
pass = new char[len2 + 1];
for(int i = 0; i < len2; i++)
pass[i] = buff[i + 2 + len];
//发送消息代码
CString str;
if(strcmp(name, "ware") != 0){
str = _T("用户名不正确!");
TRACE(_T("用户名不正确!\n")); }
else{
if(strcmp(pass, "11111") != 0){
str = _T("用户密码不正确!");
TRACE(_T("用户密码不正确!\n")); } }
if(str.IsEmpty())
{ str =_T("我是马琰");
str +=SendMsg; }
char* buf = str.GetBuffer(0);
ret = send(s, buf, str.GetLength(), 0);
if(ret != str.GetLength()){
TRACE("Send data error: %d\n", WSAGetLastError());
return ; }
2.客户端
首先调用socket函数来建立一个套接字;成功创建套接字之后,再调用bind函数,将一个端口绑定到已经建立的socket上;之后客户端便可调用connect函数向服务器请求连接;通信连接建立之后,客户端则可通过调用send/receive函数完成数据交换;通信结束之后,关闭套接字。

客户端socket通信程序:
//创建socket套接字
if(m_hSocket != NULL){
closesocket(m_hSocket);
m_hSocket = NULL; }
if(m_hSocket == NULL){
m_hSocket = socket(AF_INET, SOCK_STREAM,0);
ASSERT(m_hSocket != NULL); }
m_addr.sin_family = AF_INET;
m_addr.sin_addr.S_un.S_addr = inet_addr(m_strServer.GetBuffer(0));
m_addr.sin_port = htons(m_nPort);
int ret = 0;
int error = 0;
ret = connect(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));
if(ret == SOCKET_ERROR){
TRACE("Connect Error: %d \n", (error = WSAGetLastError()));
if(error == 10061)
AfxMessageBox(_T("请确认服务器确实已经打开并工作在同样的端口!"));
return ; }
//监听接收到的信息并显示
CString str;
str += char(m_strUser.GetLength());
str += m_strUser;
str += char(m_strPass.GetLength());
str += m_strPass;
char* buf = str.GetBuffer(0);
ret = send(m_hSocket, buf, str.GetLength(), 0);
if(ret != str.GetLength()){
TRACE("Send data error: %d\n", WSAGetLastError());
return ; }
char buff[256];
ret = recv(m_hSocket, buff, 256, 0);
if(ret == 0){
TRACE("Recv data error: %d\n", WSAGetLastError());
return ; }
buff[ret] = '\0';
AfxMessageBox(buff);。

相关主题