基于TCP/IP协议的C++网络编程(API函数版)

简介: 源代码:http://download.csdn.net/detail/nuptboyzhb/4169959 基于TCP/IP协议的网络编程 定义变量——获得WINSOCK版本——加载WINSOCK库——初始化——创建套接字 ——设置套接字选项——关闭套接字——卸载WINSOCK库——释放所有资源 整个程序架构分为两大部分,服务器端客户端。

源代码:http://download.csdn.net/detail/nuptboyzhb/4169959

基于TCP/IP协议的网络编程

定义变量——获得WINSOCK版本——加载WINSOCK——初始化——创建套接字 ——设置套接字选项——关闭套接字——卸载WINSOCK——释放所有资源

整个程序架构分为两大部分,服务器端客户端。

服务器SOCKET程序流程:

socket()→bind()→listen→accept()→recv()/send()→closesocket()

客户端:

socket→bind()→connect()→send()/recv()→closesocket()

 

编程举例:

约定发送消息的格式为如下结构体:

typedef struct

{

         int ID;

         char data[255];

}TcpMessage;

应用程序的头文件如下:

#include <winsock2.h>

#pragma comment(lib,"ws2_32")

#include <stdio.h>

端口号为:4500

服务器端:

1、  初始化:

         WSADATA wsaData;

    WORD sockVersion = MAKEWORD(2, 2);

         if(WSAStartup(sockVersion, &wsaData) != 0)

                   return 0;

2、  创建套接字:

         SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

         if(sListen == INVALID_SOCKET)

{

printf("socket error\n");

return 0;

}

3、  使套接字和本地地址绑定

// sockaddr_in结构中装入地址信息

         sockaddr_in sin;

         sin.sin_family = AF_INET;

         sin.sin_port = htons(4500); // htons函数将主机的无符号短整形数转换成网络

         //字节顺序

         sin.sin_addr.S_un.S_addr = INADDR_ANY;

if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

         {

                   printf(" bind error \n");

                   closesocket(sListen);

                   return 0;

         }

4、监听端口

         if(listen(sListen, 5) == SOCKET_ERROR)

         {

                   printf("listen error\n");

                   closesocket(sListen);

                   return 0;

         }

5、等待接受连接,(如无连接,一直等待)

SOCKET sClient;//用于保存accept返回的套接字

sClient = accept(sListen,0,0);//accept函数调用失败则继续等待连接。

if(sClient == INVALID_SOCKET)

{

                            printf("accept() error");

         }

6、用第5步中accept函数返回的套接字进行收发通信

 6.1、接收:(如果没有接到,会等待!

      TcpMessagerevData;//定义接收消息的结构体变量

      int ret=recv(sClient,(char *)&revData,sizeof(revData),0);

      if(ret>0)//说明,收到字节

      {

         switch (revData.ID)//对不同的ID,可以有不同的反应

{

   case 1:

   ……..

case 2:

……..

}

}

 6.2、发送:

      TcpMessage sendData;

           memset((char*)&sendData,0,sizeof(sendData));//初始化为0

      sendData.ID=1;//ID成员变量赋值

      strcpy(sendData.data,"\r\n..要发送的字符信息 ");

      if(send(sClient,(char*)&sendData,sizeof(sendData),0)==SOCKET_ERROR)

           {

                   char error[10];

                   int errorcode=WSAGetLastError();

                   itoa(errorcode,error,10);

                   MessageBox(NULL,error,"发送失败,错误码为:",MB_OK);

                   printf("send error!");

           }

7、关闭

         closesocket(sClient);//accept生成的套接字

         closesocket(sListen);//服务端套接字

         WSACleanup();

客户端

1、   初始化

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 2);

       if(WSAStartup(sockVersion, &wsaData) != 0)

                        return 0;

2、   创建套接字

SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

          if(sClient == INVALID_SOCKET)

          {

                   printf("socket error\n");

                   return 0;

       }

3、   使套接字和本地地址绑定

// sockaddr_in结构中装入服务器端地址信息

          sockaddr_in servAddr;

          servAddr.sin_family = AF_INET;

          servAddr.sin_port = htons(4500);// htons函数将主机的无符号短整形数转换成网络

          //字节顺序,4500端口为要连接服务器端的端口

       servAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");//服务器端ip

4、   连接服务器

          if(connect(sClient,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)

          {

                   printf("connect error\n");

                   closesocket(sClient);

                   return 0;

       }

//注意,要先把服务器打开,否则连接失败

5、   收发通信

sendrecv函数,这一点和服务器端一样

6、   关闭

closesocket(sClient);//客户端只有一个连接套接字

          WSACleanup();

目录
相关文章
|
30天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
170 0
|
1月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
38 8
C++ Qt开发:QTcpSocket网络通信组件
|
1月前
|
数据可视化 Linux API
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
如何在Linux使用docker部署Swagger Editor并实现无公网IP远程协同编辑API文档
|
1月前
|
消息中间件 网络协议 C++
C/C++网络编程基础知识超详细讲解第三部分(系统性学习day13)
C/C++网络编程基础知识超详细讲解第三部分(系统性学习day13)
|
14天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
38 6
|
1月前
|
网络协议 Linux API
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
Linux网络编程:shutdown() 与 close() 函数详解:剖析 shutdown()、close() 函数的实现原理、参数说明和使用技巧
88 0
|
6天前
|
API Go
使用Go语言通过API获取代理IP并使用获取到的代理IP
使用Go语言通过API获取代理IP并使用获取到的代理IP
|
7天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
9天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
11天前
|
数据采集 API 数据安全/隐私保护
畅游网络:构建C++网络爬虫的指南
本文介绍如何使用C++和cpprestsdk库构建高效网络爬虫,以抓取知乎热点信息。通过亿牛云爬虫代理服务解决IP限制问题,利用多线程提升数据采集速度。示例代码展示如何配置代理、发送HTTP请求及处理响应,实现多线程抓取。注意替换有效代理服务器参数,并处理异常。
畅游网络:构建C++网络爬虫的指南