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

源代码: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、   收发通信

用send和recv函数,这一点和服务器端一样

6、   关闭

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

          WSACleanup();

时间: 2024-11-02 05:24:17

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

标准C实现基于TCP/IP协议的文件传输

TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如下: 1.Socket系统调用  为了进行网络I/O,服务器和客户机两端的UNIX进程要做的第一件事是调用socket()系统调用,建立软插座,指明合适的通讯协议.格式为:  1 2 3 #include >sys/types.h> #include >sys/socket.h>    int socket(int family,int type,int 

《OSPF网络设计解决方案(第2版)》一1.4 TCP/IP协议簇

1.4 TCP/IP协议簇 OSPF网络设计解决方案(第2版)所谓协议,是指管理网络中设备之间交换信息的规则约定的集合.本节将对最为常用的一个协议簇--TCP/IP进行讨论,但并不涉及TCP/IP深层次的内容.即便如此,为了更好地掌握全面的网络协议原理,你依然需要对TCP/IP有较为深刻地理解:这些深入的内容会在后续OSPF章节中进行穿插. TCP/IP协议簇也被称为TCP/IP栈,它是当今被最为广泛实施的互联网络标准之一.TCP/IP的全称为传输控制协议/互联网络协议,其中TCP和IP是TCP

TCP/IP协议 详解

Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成.TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准.协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到

《Linux高性能服务器编程》——第1章 TCP/IP协议族 1.1 TCP/IP协议族体系结构以及主要协议

第1章 TCP/IP协议族 现在Internet(因特网)使用的主流协议族是TCP/IP协议族,它是一个分层.多协议的通信体系.本章简要讨论TCP/IP协议族各层包含的主要协议,以及它们之间是如何协作完成网络通信的. TCP/IP协议族包含众多协议,我们无法一一讨论.本书将在后续章节详细讨论IP协议和TCP协议,因为它们对编写网络应用程序具有最直接的影响.本章则简单介绍其中几个相关协议:ICMP协议.ARP协议和DNS协议,学习它们对于理解网络通信很有帮助.读者如果想要系统地学习网络协议,那么R

《Linux高性能服务器编程》——1.7 socket和TCP/IP协议族的关系

1.7 socket和TCP/IP协议族的关系 前文提到,数据链路层.网络层.传输层协议是在内核中实现的.因此操作系统需要实现一组系统调用,使得应用程序能够访问这些协议提供的服务.实现这组系统调用的API(Application Programming Interface,应用程序编程接口)主要有两套:socket和XTI.XTI现在基本不再使用,本书仅讨论socket.图1-1显示了socket与TCP/IP协议族的关系. 由socket定义的这一组API提供如下两点功能:一是将应用程序数据从

透视你的网络 完美测试TCP/IP协议简介

安装网络硬件和网络协议之后,我们一般要进行TCP/IP协议的测试工作,那么怎样测试才算是比较全面的测试呢?我们认为,全面的测试应包括局域网和互联网两个方面,因此应从局域网和互联网两个方面测试,以下是我们在实际工作中利用命令行测试TCP/IP配置的步骤: 1. 单击"开始"/"运行",输入CMD按回车,打开命令提示符窗口. 2. 首先检查IP地址.子网掩码.默认网关.DNS服务器地址是否正确,输入命令ipconfig /all,按回车.此时显示了你的网络配置,观查是否

怎样解决网络无法链接TCP/IP协议变灰色

  1.使用注册表来设置 步骤1.开始--运行--regedit.exe,打开注册表编辑器,删除以下两个键: HKEY_LOCAL_MACHINESystemCurrentControlSetServicesWinsock HKEY_LOCAL_MACHINESystemCurrentControlSetServicesWinsock2 步骤2.用记事本打开%winroot%infnettcpip.inf文件,找到:[MS_TCPIP.PrimaryInstall]Characteristics

什么是TCP IP 网络TCP IP协议

什么是TCP.IP协议?概括的说TCP/IP协议是(传输控制协议/网间协议)TCP/IP 协议集确立了 Internet 的技术基础.全称Transmission Control Protocol/Internet Protocol.中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.Internet国际互联网络的基础,由 网络层的IP协议和传输层的TCP协议组成.TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准.协议采用了4层的层

网络基础二 tcp/ip协议簇 端口 三次握手 四次挥手 11种状态集

第1章 概念介绍 1.1 VLAN 1.1.1 什么是VLAN VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN所指的LAN特指使用路由器分割的网络--也就是广播域. 1.1.2 划分VLAN的目的 1.     提高安全性 a)       举个例子:没有划分VLAN前,交换机端口连接下的所有PC都处于一个VLAN中即一个广播域中,实现ARP中间人攻击太简单了.划分了VLAN之