C++网络编程

一些网络编程方面的知识,主要是socket的创建、网络连接方面的知识。以便了解和学习使用。

1、加载头文件和库文件

#include <windows.h>
#pragma comment(lib, "ws2_32.lib")

2、服务器端socket的建立、绑定以及监听

WSADATA wsa;//WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息

// 加载winsock库并确定winsock版本,系统会把数据填入wsaData中  
if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){
    MessageBoxA(NULL, "套接字初始化失败!", "", MB_OK);
    Sleep(3000);
    exit(-1);
}

//创建套接字
SOCKET serverSocket;
if((serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){
    MessageBoxA(NULL, "创建套接字失败!", "", MB_OK);
    Sleep(3000);
    exit(-1);
}

short port = 9000;
struct sockaddr_in serverAddress;
//初始化指定的内存区域
memset(&serverAddress,0,sizeof(sockaddr_in));
serverAddress.sin_family=AF_INET; // 使用IPv4地址,tcp/ip协议族
serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // INADDR_ANY是指任意地址,意指后面监听的是任意地址
serverAddress.sin_port = htons(port);

//绑定
if(bind(serverSocket,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){
    MessageBoxA(NULL, "套接字绑定到端口失败!", "", MB_OK);
    Sleep(3000);
    exit(-1);
}

//进入侦听状态,SOMAXCONN表示最多有5个连接队列
if(listen(serverSocket,SOMAXCONN)==SOCKET_ERROR){
    MessageBoxA(NULL, "侦听失败!", "", MB_OK);
    Sleep(3000);
    exit(-1);
}
SOCKET clientSocket;//用来和客户端通信的套接字
struct sockaddr_in clientAddress;//用来和客户端通信的套接字地址
memset(&clientAddress,0,sizeof(clientAddress));//初始化存放客户端信息的内存
int addrlen =sizeof(clientAddress);

//接受连接
if((clientSocket=accept(serverSocket(sockaddr*)&clientAddress,&addrlen))==INVALID_SOCKET){
    MessageBoxA(NULL, "接受客户端连接失败!", "", MB_OK);
    Sleep(3000);
    exit(-1);
}

3、客户端socket的建立、绑定以及连接

SOCKET m_sock;

bool CreatConnect(const std::string &ServerIP, const std::string &ServerPort)
{
    WSADATA wsadata;

    // 初始化套接字
    if ( WSAStartup(MAKEWORD(2,2), &wsadata) != 0 )
    {
        MessageBox(NULL, "套接字初始化失败!", "", MB_OK);
        return false;
    }

    // 创建套接字

    if ( (m_sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET )
    {
        MessageBox( NULL,"创建套接字失败!", "", MB_OK);
        return false;
    }
    bool bConnect = Connect(m_sock, ServerIP, ServerPort);
    g_MarkReceive = 1;

    return bConnect;
}

//获取服务器IP
unsigned long GetServerIP(const std::string &ServerIP)
{
    //把字符串的IP地址转化为u_long
    std::string strIP = ServerIP;
    unsigned long ip;
    if((ip=inet_addr(strIP.c_str()))==INADDR_NONE){
        MessageBox(NULL, "不合法的IP地址", "",MB_OK);
        Sleep(3000);
        return 0;
    }
    return ip;
}

bool Connect(SOCKET &sock, const std::string &ServerIP, const std::string &ServerPort)
{
    unsigned long ip = GetServerIP(ServerIP);
    if ( !ip )
        return false;
    short sPort = (short)std::atoi(ServerPort.c_str());
    struct sockaddr_in serverAddress;
    memset(&serverAddress, 0, sizeof(sockaddr_in));
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_addr.S_un.S_addr = ip;
    serverAddress.sin_port = htons(sPort);

    // 建立和服务器的连接
    if ( connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR )
    {
        MessageBox(NULL, "建立连接失败!", "", MB_OK);
        return false;
    }
    return true;
}

bool RecvData()
{
    _beginthread(Receive,0,&m_sock);//启动接收数据线程
    return true;
}


// 发送信息
void SendMsg(std::string strSendData, const int &iChangData)
{
    if ( 1 == iChangData )
    {
        if(send(m_sock, strSendData.c_str(), strSendData.length(), 0)==SOCKET_ERROR)
        {
            MessageBox(NULL, "发送数据失败!", "", MB_OK);
            return;
        }
    }
    else
        return;
}

// 接受数据
void Receive(void *param)
{
    while(1)
    {
        char buf[32768];
        SOCKET* sock=(SOCKET*)param;
        int nNetTimeout=5000;   //规定时间5秒
        int ret = setsockopt(*sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));
        int bytes = recv(*sock, buf, sizeof(buf), 0);
        if (bytes == SOCKET_ERROR)
        {
            Sleep(5);
            if(errno == EAGAIN)
                MessageBoxA(NULL, "接受数据失败(接收超时)!", "", MB_OK);//超时这个进不去,需要再研究研究,返回值和判断问题
            else
                MessageBoxA(NULL, "接受数据失败(客户端已断开)!", "", MB_OK);
            return;
        }

        buf[bytes]='\0';
        std::string strTmp = buf;
    }
    return;
}

3、客户端和服务器端的主要不同

1、创建sockaddr_in 时有一点不一样,关于IP那一部分:server端是htonl(INADDR_ANY);意指任意IP地址,也可以指定地址端,但是client端必须指定服务器地址;
2、服务器端在建立后要设置监听,以便与客户端连接;而客户端建立连接就可以
这是个人认为server端和client端不同的地方(在代码方面)

接下来是setsockopt、recv、send的介绍

这个网址中有对[setsockopt]完整的介绍(http://blog.csdn.net/maotianwang/article/details/52101634)
对[recv和send]的完整介绍(http://www.cnblogs.com/jianqiang2010/archive/2010/08/20/1804598.html)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.网络编程概要.mkv 2.一个TCP的简单实验.mkv 3.课程内容大纲.mkv 4.回顾基础的Sockets API.mkv 5.TTCP码概览.mkv 6.使用TTCP进行网络传输性能测试.mkv 7.阻塞IO下的TTCP实验.mkv 8.TCP自连接.mkv 9.扩展练习.mkv 10.时钟概述.mkv 11.时钟精确度和校准.mkv 12.网络时间同步.mkv 13.Roundtrip码分析.mkv 14.其他测试方案.mkv 15.UDP vs TCP.mkv 16.扩展知识.mkv 17.如何正确使用TCP.mkv 18.TCP使用的注意事项.mkv 19.多个版本的Netcat概览.mkv 20.第一个Netcat的实现.mkv 21.IO-multiplexing方式实现Netcat.mkv 22.使用非阻塞IO 1.mkv 23.使用非阻塞IO 2.mkv 24.进程监控概述.mkv 25.实现前要考虑的问题.mkv 26.procmon码解析.mkv 27.dummyload实现原理和码解析.mkv 28.procmon性能测试.mkv 29.知识扩展和总结.mkv 30.功能描述.mkv 31.数据结构设计与分析.mkv 32.数据结构码解读.mkv 33.网络IO模型与码解读.mkv 34.性能测试 1.mkv 35.性能测试 2.mkv 36.性能分析.mkv 37.定制数据结构以减小内存使用.mkv 38.数独求解服务简介.mkv 39.并发模型和测试工具.mkv 40.批处理模型及疑似内存泄露.mkv 41.内置性能监控.mkv 42.延迟测量与禁用Nagle_s算法.mkv 43.最大容量及伸缩性测试.mkv 44.延迟分布于请求数及并发模型的关系.mkv 45.过载保护.mkv 46.负载均衡.mkv 47.负载均衡实例.mkv 48.如何进一步适应生产环境.mkv 49.码阅读1:客户端.mkv 50.码阅读2:服务端.mkv 51.苏迪曼杯羽毛球比赛.mkv 52.记分系统设计.mkv 53.聊天服务器.mkv 54.聊天服务器码改进.mkv 55.hub服务器[new!].mkv 56.设计难点[new!].mkv 57. TCP relay功能描述及Python实现.mkv 58. TCP半关连接.mkv 59. 非阻塞TCP relay实现.mkv 60. 源码及运行.mkv 61. 竞态条件及修复.mkv 62. SOCKS4a服务器实现.mkv 63. 非阻塞IO之外的选择.mkv 64. 用 GO 语言实现 TCP relay.mkv 65. 事件驱动与多线程的取舍.mkv 66. 第七层以外的实现方式.mkv 67. 正确理解TCP的可靠性.mkv 68. Muduo与C++11.mkv 69. N皇后问题及单机求解方法.mkv 70. 并行算法与MapReduce.mkv 71. RPC简介与接口定义.mkv 72. 码实现与运行实例.mkv 73. Go语言客户端.mkv 74. RPC 负载均衡.mkv 75. 多机求平均数和中位数的算法.mkv 76. 码实现及运行实例.mkv 77. 实现RCP框架:服务端.mkv 78. 实现RPC框架:客户端.mkv 79. 单词计数及按频度排序,单机算法.mkv 80. 单机版码阅读.mkv 81. 多机单词计数算法与码.mkv 82. 多机找出最常见的K个单词.mkv 83. 复活《TCPIP 详解第2卷》讲的4.4BSD协议栈.mkv 84. 课程总结.mkv muduo-examples-in-go-master.zip muduo-master.zip muduo-protorpc-cpp11.zip recipes-master.zip 官网地址-课程大纲 .txt

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值