基于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();

目录
相关文章
|
28天前
|
API 数据库 C语言
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
【C/C++ 数据库 sqlite3】SQLite C语言API返回值深入解析
167 0
|
7天前
|
网络协议 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)简化开发,助力高效、高并发的网络通信。
|
12天前
|
编译器 C语言 C++
【C++初阶(九)】C++模版(初阶)----函数模版与类模版
【C++初阶(九)】C++模版(初阶)----函数模版与类模版
18 0
|
22天前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
|
24天前
|
存储 安全 编译器
【C++】类的六大默认成员函数及其特性(万字详解)
【C++】类的六大默认成员函数及其特性(万字详解)
35 3
|
27天前
|
安全 程序员 C++
【C++ 基本知识】现代C++内存管理:探究std::make_系列函数的力量
【C++ 基本知识】现代C++内存管理:探究std::make_系列函数的力量
101 0
|
28天前
|
设计模式 安全 C++
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
71 2
|
29天前
|
安全 编译器 程序员
【C++ 泛型编程 高级篇】C++ 编程深掘:静态成员函数检查的艺术与实践
【C++ 泛型编程 高级篇】C++ 编程深掘:静态成员函数检查的艺术与实践
63 0
|
29天前
|
存储 安全 编译器
【C++ 函数设计的艺术】深挖 C++ 函数参数的选择 智能指针与 std::optional:最佳实践与陷阱
【C++ 函数设计的艺术】深挖 C++ 函数参数的选择 智能指针与 std::optional:最佳实践与陷阱
108 0
|
29天前
|
安全 算法 编译器
【C++中的const函数】何时与如何正确声明使用C++ const函数(三)
【C++中的const函数】何时与如何正确声明使用C++ const函数
26 0