`
hereson
  • 浏览: 1449695 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Dev-cpp下的一个socket的例子

阅读更多

这个例子很简单,服务端是单线程的,一般来说实际应用中多采用多线程方式监听客户请求的。

先列客户端的代码:Client.h

#ifndef _SERVERSOCKET_H
#define _SERVERSOCKET_H
#i nclude 
<sys/types.h>
//! 下面是根据操作系统自动加载所需的库和头文件
#ifdef   WIN32   
          #i nclude   
<winsock2.h>   
          
#pragma   comment(lib,"ws2_32.lib")   
#else   
          #i nclude   
<sys/socket.h>   
#endif
#i nclude 
<string>
#i nclude 
<iostream>
int WSAStartup

    WORD wVersionRequested, 
    LPWSADATA lpWSAData 
);

using namespace std; 
class CClient
...{
    
int                 m_sockfd;
    
struct sockaddr_in  m_addr;
public:
    CClient(
const string& strAddr, int iPort);
    
~CClient();
    BOOL Connect(); 
}

#endif

定义文件Client.cpp

#i nclude "Client.h" 
CClient::CClient(
const string& strAddr, int iPort)
...{
    WSADATA   wsaData;
    
int err = WSAStartup( MAKEWORD(22), &wsaData ); 
    
if (err == SOCKET_ERROR)
        cout 
<< "WSAStartup error" << endl; 
        m_sockfd = socket(AF_INET, SOCK_STREAM, 0); /*需要错误检查 */
    
if (m_sockfd == -1)
    
...{
        cout 
<< "socket fail!" << endl;
        
return;
    }

    cout 
<< "socket success!socket:" << m_sockfd << endl; 
    memset(
&m_addr, 0x00sizeof(m_addr)); 
    m_addr.sin_family 
= AF_INET; /**//* host byte order */ 
    m_addr.sin_port 
= htons(iPort); /**//* short, network byte order */ 
    m_addr.sin_addr.s_addr 
= inet_addr(strAddr.c_str());
}


CClient::
~CClient()
...{
    WSACleanup(); 
}


BOOL CClient::Connect()
...{
    
int iRet = connect(m_sockfd, (struct sockaddr *)&m_addr, sizeof(m_addr));
    
if (iRet == -1
    
...{
        cout 
<< "connect fail!" << endl; 
        
return FALSE;
    }

    
return TRUE; 
}


BOOL CClient::Send(
const string& strSend)
...{    
    
int iRet = send(m_sockfd, strSend.c_str(), strSend.length(), 0);
    
if (iRet == -1)
    
...{
        cout 
<< "connect fail!" << endl; 
        
return FALSE;
    }

    cout 
<< "Send is OK!";
    
return TRUE; 
}
 

        上面的例子中我把较多的初始化处理直接放在了构造函数中,这个习惯不是很好。不过只是一个简单举例,所以我就不修改它了。客户端的主文件如下:

#i nclude <stdlib.h>
#i nclude 
"Client.h" 

int main(int argc, char *argv[])
...{
  CClient cc(
"127.0.0.1"8001);    //! 第一个参数是本机IP地址,第二参数是自选的端口号
  cc.Connect();
  cc.Send(
"Send Message!"); 
  system(
"PAUSE");    
  
return 0;
}

下面是服务端的头文件:Server.h

#ifndef _SERVERSOCKET_H
#define _SERVERSOCKET_H
#i nclude 
<sys/types.h>
#ifdef   WIN32   
          #i nclude   
<winsock2.h>   
          
#pragma   comment(lib,"ws2_32.lib")   
#else   
          #i nclude   
<sys/socket.h>   
#endif   
#i nclude 
<string>
#i nclude 
<iostream>
#define SERVER_PORT 8001 
#define MAX_BUFFER_LENGTH 2048 

using namespace std; 
class CServer
...{
    
int                 m_sockfd;
    
struct sockaddr_in  m_addr;public:
    CServer(
const string& strAddr);
    
~CServer();
    BOOL Start();
    BOOL Stop();  
}

#endif 

对应的定义文件:

#i nclude "Server.h"

CServer::CServer(
const string& strAddr)
...{    
    WSADATA   wsaData;
    
int err = WSAStartup( MAKEWORD(22), &wsaData ); 
    
if (err == SOCKET_ERROR)
    
...{
        cout 
<< "WSAStartup error" << endl;
        
return;
    }

    m_sockfd 
= socket(AF_INET, SOCK_STREAM, 0); /**//*需要错误检查 */
    m_addr.sin_family 
= AF_INET; /**//* host byte order */ 
    m_addr.sin_port 
= htons(SERVER_PORT); /**//* short, network byte order */ 
    m_addr.sin_addr.s_addr 
= inet_addr(strAddr.c_str());
}


CServer::
~CServer()
...{
    WSACleanup();
}


BOOL CServer::Start()
...{
    
int iret = bind(m_sockfd, (struct sockaddr *)&m_addr, sizeof(struct sockaddr));
    
if (iret == -1)
    
...{
        cout 
<< "bind fail" << endl; 
        
return FALSE;
    }

    cout 
<< "bind OK" << endl; 
    listen(m_sockfd, 
3);
    cout 
<< "listening..." << endl;
    
struct sockaddr_in their_addr;
    
int sin_size = sizeof(struct sockaddr_in); 
    
int getsockfd = accept(m_sockfd,(struct sockaddr *)&their_addr,&sin_size);
    cout 
<< "accepted" << endl;
    
char buf[MAX_BUFFER_LENGTH] = ...{0};
    
if (!getsockfd)
    
...{
        
return FALSE; 
    }

    cout 
<< "Starting Server...!" << endl; 
    
int recvLen = 0
    
do
    
...{
        recvLen 
= recv(getsockfd, buf, sizeof(buf)/sizeof(buf[0]), 0);
    }
while(recvLen == -1); 
    cout 
<< buf << endl; 
    
return TRUE; 
}


BOOL CServer::Stop()
...{
    
//close(m_sockfd);    //! 这个地方如果去掉前面的注释符,编译会报错。
                                      
//! 我暂时还没有去了解原因。按道理应该要关闭的。
分享到:
评论

相关推荐

    Dev-Cpp 5.11 TDM-GCC 4.9.2

    软件:Dev-Cpp 5.11 TDM-GCC 4.9.2 这个软件我相信大部分人都认识 Dev-C++是一款C++开发工具 Dev C++也是一个Windows下的C和C++程序的集成开发环境 但大家应该遇到这个问题 在访问Dev-Cpp下载的网站: ...

    Dev-Cpp 5.6.1 MinGW 4.8.1 Setup

    Dev-Cpp 5.6.1 版本是这个IDE的一个特定迭代,它可能包含了对旧版本的改进、错误修复以及性能优化。 使用Dev-Cpp 5.6.1 MinGW 4.8.1,用户可以享受以下优势: 1. **源代码编辑**:内置的文本编辑器支持语法高亮、...

    Dev-Cpp-5.11-TDM-GCC-4.9.2-Setup.exe

    标题中的"Dev-Cpp-5.11-TDM-GCC-4.9.2-Setup.exe"和描述中的"Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.exe"指向的是同一款软件的安装程序,名为Dev-Cpp,这是一个集成开发环境(IDE),专门用于编写C++语言的程序。...

    Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exe

    Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exeDev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exeDev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exeDev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exeDev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exeDev-Cpp 5.11 TDM-GCC...

    Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.zip 2024年更新

    总的来说,Dev-Cpp 5.11 TDM-GCC 4.9.2 是一个全面的开发环境,适合初学者入门学习C++,也适合经验丰富的程序员进行快速开发。通过这个2024年的更新,用户可以期待更稳定的性能、更多的兼容性和改进的用户体验。无论...

    Dev-Cpp 5.9.2 TDM-GCC 4.8.1 Setup.zip

    Dev-Cpp 5.9.2 TDM-GCC 4.8.1 是一个集成开发环境(IDE),专为C++编程设计。这个版本的Dev-Cpp包含了TDM-GCC编译器,这是一个针对Windows平台优化的GCC(GNU Compiler Collection)版本。在本篇文章中,我们将深入...

    Dev-Cpp.rar

    《Dev-Cpp:轻量级C++开发环境的探索与应用》 Dev-Cpp是一款针对初学者和专业开发者设计的轻量级C++集成开发环境...如果你正在寻找一个不占用过多系统资源、易于上手的C++开发环境,Dev-Cpp无疑是一个值得尝试的选择。

    Dev-Cpp v5.11 TDM-GCC 4.9.2 Setup.exe.zip

    Dev-Cpp是一个开源项目,它基于MinGW和GCC,提供了一个包括编辑器、编译器、链接器以及调试器在内的全套开发工具。它的界面简洁易用,支持多文档界面(MDI),使得用户可以同时处理多个源代码文件,提高编程效率。 ...

    Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.zip

    在描述中提到的"Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.zip"是一个压缩包文件,其中包含的主要内容是Dev-Cpp的安装程序,即"Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.exe"。这个可执行文件是用于在用户的Windows系统上安装Dev-...

    Embarcadero 最新 Dev-Cpp 6.3版 包含TDM-GCC_9.2

    总的来说,Embarcadero Dev-Cpp 6.3结合TDM-GCC 9.2为C++开发者提供了一个强大的工具链,它不仅具备现代C++语言的特性支持,而且在Windows环境下提供了便捷的开发环境,是初学者和专业人士的理想选择。通过这个版本...

    编程工具:Dev-Cpp_5.9.2_TDM-GCC_4.8.1_Setup.1425957545

    在安装文件列表中,我们看到的是"Dev-Cpp_5.9.2_TDM-GCC_4.8.1_Setup.1425957545.exe",这是一个.exe执行文件,用于在Windows系统上安装Dev-Cpp。用户只需双击这个文件,按照向导提示进行操作,即可完成安装过程。 ...

    Dev-Cpp 5.9.2 TDM-GCC 4.8.1 Setup.rar

    标题中的“Dev-Cpp 5.9.2 TDM-GCC 4.8.1 Setup.rar”指的是一个软件安装包,这是一款名为Dev-Cpp的集成开发环境(IDE)的版本,版本号为5.9.2,它基于TDM-GCC编译器,其内嵌的GCC版本为4.8.1。Dev-Cpp是一个轻量级的...

    Dev-Cpp_5.11 安装包.zip

    这个"Dev-Cpp_5.11 安装包.zip"文件包含了版本5.11的安装程序,是Windows平台上用户友好的编程工具之一,特别适合初学者和专业人士进行C++开发。 1. **Dev-Cpp概述**: Dev-Cpp是由Bloodshed Software开发的一款轻...

    Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup

    Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup 是一个集成开发环境(IDE)的安装程序,特别针对C++编程语言设计。这个版本是基于Dev-Cpp,一个轻量级且免费的C++ IDE,它包含了TDM-GCC 4.9.2编译器套件,这是一个针对Windows...

    Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.exe

    《Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.exe:一个集成开发环境的深度解析》 Dev-Cpp_5.11_TDM-GCC_4.9.2_Setup.exe是一款针对C语言和C++编程的集成开发环境(IDE),由Bloodshed Software公司开发,其核心编译器是...

    Dev-Cpp 5.4.0 MinGW 4.7.2 Setup

    **Dev-Cpp 5.4.0 MinGW 4.7.2 Setup** 是一个针对C和C++编程语言的集成开发环境(IDE),专为初学者和专业开发者设计。这个版本结合了Dev-Cpp IDE与MinGW编译器套件,其中MinGW是Minimalist GNU for Windows的缩写,...

    Dev-Cpp 5.11 TDM-GCC 4.9.2 Setup.exe.zip

    对于初学者,Dev-Cpp提供了一个友好的学习环境,可以快速上手C和C++编程。对于有经验的开发者,它可以作为一个快速原型开发或轻量级项目的工具,尤其是那些不需要大型IDE功能的项目。 总的来说,Dev-Cpp 5.11 TDM-...

    Dev-Cpp.5.10.TDM-GCC.4.8.1.Setup

    这个软件包的名称"Dev-Cpp.5.10.TDM-GCC.4.8.1.Setup"表明它是一个安装程序,版本为5.10,内嵌了TDM-GCC编译器版本4.8.1。TDM-GCC是GCC(GNU Compiler Collection)的一个定制版,专门为Windows平台优化,提供了GCC...

    Dev-Cpp 5.11版本(Dev-c++)安装包

    Dev-Cpp 5.11 是一款经典的C和C++集成开发环境,也被称为Dev-C++。这款轻量级的IDE特别适合初学者和专业开发者使用...总之,Dev-Cpp 5.11 提供了一个简洁、高效的开发环境,无论你是编程新手还是老手,都可以从中受益。

Global site tag (gtag.js) - Google Analytics