`
java-mans
  • 浏览: 11981719 次
文章分类
社区版块
存档分类
最新评论

利用windows sockets实现TCP通讯示例程序

 
阅读更多

参考《精通Windows Sockets网络开发--基于Visual C++实现》

源代码下载链接

该程序由客户端和服务器端组成,实现的功能是客户端向服务器发送“MyTcp”字符串,服务器接收到该字符串,并显示出来。

客户端发送字符串后退出,服务器显示字符串后退出。

服务器实现,也即当前的TcpExample

1、新建console程序TcpExample。A simple Application,

添加库文件ws2_32.lib为2.2版,1.1版socket为wsock32.lib,


#include <stdio.h>
#include <WINSOCK2.H>
#define BUF_SIZE 64          //缓冲区大小
char buf[BUF_SIZE];           //接收数据缓冲区
SOCKET sClient;

2、WSAStartUp()初始化套接字动态库

WSADATA wsd;	//WSADATA变量
	
	int retVal;		//返回值
	if (WSAStartup(MAKEWORD(2,2),&wsd) != 0)
	{
		printf("WSAStartup 失败!\n");
		return 1;
	}

3、socket()创建套接字

//创建套接字

//创建套接字
	SOCKET sServer;	//服务器套接字
	sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if (INVALID_SOCKET == sServer)
	{
		printf("创建套接字失败!\n");
		WSACleanup();//释放套接字资源
		return -1;
	}

4、绑定套接字

//首先定义服务地址
SOCKADDR_IN addrServ;
       //服务器套接字地址
       addrServ.sin_family=AF_INET;
       addrServ.sin_port=htons(4999);
/*    addrServ.sin_addr.S_addr=INADDR_ANY;
       addrServ.sin_addr.S_addr=INADDR_ANY;
原书错误见winsock2.h,in_addr只有一个联合体类型的S_un成员变量
 *    struct in_addr {
       union {
                     struct{ u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                     struct{ u_short s_w1,s_w2; } S_un_w;
                     u_longS_addr;
       } S_un;
       */
       addrServ.sin_addr.S_un.S_addr=INADDR_ANY;
       //绑定套接字
       retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
       if(SOCKET_ERROR == retVal)
       {
              printf("绑定失败!\n");
              closesocket(sServer);//关闭套接字
              WSACleanup();//释放套接字资源
              return-1;
       }


5、监听

//开始监听,设置等待接受连接的队列长度为1
       retVal=listen(sServer,1);
       if(SOCKET_ERROR == retVal)
       {
              printf("监听失败!\n");
              closesocket(sServer);
              WSACleanup();
              return-1;
       }


6、接受客户端连接

 //accept函数处于阻塞状态,直到接受了一个客户端请求。当该函数返回时,新建一个套接字,同时返回该客户端的地址
       //如果调用失败,则返回INVALID_SOCKET
       sockaddr_inaddrClient;
       intaddrClientlen =sizeof(addrClient);
       sClient=accept(sServer,(sockaddrFAR*)&addrClient,&addrClientlen);
       if(INVALID_SOCKET == sClient)
       {
              printf("接受客户端连接失败!\n");
              closesocket(sServer);
              WSACleanup();
              return-1;
       }

7、接受客户端数据

//接收并显示数据
       //调用recv() 函数接收客户端发送的数据。在调用该函数前首先调用ZeroMemory()函数将接收数据缓冲区设置为0,最后调用printf显示数据
       charbuf[128];
       intBUF_SIZE=128;
       ZeroMemory(buf,BUF_SIZE);
       retVal=recv(sClient,buf,BUF_SIZE,0);
       if(SOCKET_ERROR ==retVal)
       {
              printf("接收数据失败!\n");
              closesocket(sServer);
              closesocket(sClient);
              WSACleanup();
              return-1;
       }
       printf("%s\n",buf);//输出数据
 


8、退出

  closesocket(sServer);
       closesocket(sClient);
       WSACleanup();

实现客户端

客户端主要功能是连接服务器,向服务器发送“MyTcp”字符串。客户端的实现包括

初始化套接字动态库、创建套接字、连接服务器、发送数据和退出。

1、console程序TcpClient,选中Add to current workspace,A simple Application ,


2、#include <stdio.h>,添加库文件

3、定义全局变量

#include <WINSOCK2.H>
#define BUF_SIZE 64          //缓冲区大小
WSADATA wsd;                  //WSADATA变量
SOCKET sHost;                   //服务器套接字
SOCKADDR_IN servAddr;   //服务器地址
char buf[BUF_SIZE];           //接收数据缓冲区
int retval;                            //返回值


4、初始化套接字动态库

//初始化套接字动态库
       if(WSAStartup(MAKEWORD(2,2),(LPWSADATA)&wsd)!=0)
       {
              printf("WSAStartup失败!\n");
              return-1;
       }


5、创建套接字

//创建套接字
       sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
       if(INVALID_SOCKET == sHost)
       {
              printf("创建套接字失败!\n");
              WSACleanup();
              return-1;
       }


6、连接服务器

设置IP地址为127.0.0.1,服务器端口为4999.调用connect() 函数连接服务器。

//设置服务器地址
       servAddr.sin_family=AF_INET;
       servAddr.sin_port=htons((short)4999);
       servAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
       intnServAddlen=sizeof(servAddr);
       //连接服务器
       retval=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
       if(SOCKET_ERROR == retval)
       {
              printf("连接服务器失败! \n");
              closesocket(sHost);
              WSACleanup();
       }


7、发送数据

 //首先利用ZeroMemory设置发送数据缓冲区为0
       ZeroMemory(buf,BUF_SIZE);
       strcpy(buf,"MyTcp");
       retval=send(sHost,buf,strlen(buf),0);
       if(SOCKET_ERROR == retval)
       {
              printf("向服务器发送数据失败! \n");
              closesocket(sHost);
              WSACleanup();
              return-1;
       }

8、退出

 closesocket(sHost);
       WSACleanup();

先运行TcpExample,再运行TcpClient。




分享到:
评论

相关推荐

    windows sockets Tcp 网络程序示例

    参考《精通Windows Sockets网络开发--基于Visual C++实现》 该程序由客户端和服务器端组成,实现的功能是客户端向服务器发送“MyTcp”字符串,服务器接收到该字符串,并显示出来。 客户端发送字符串后退出,...

    C# 实现与汇川H5U PLC Modbus-TCP通讯示例

    在本文中,我们将深入探讨如何使用C#编程语言实现与汇川H5U PLC(可编程逻辑控制器)的Modbus-TCP通信。Modbus-TCP是一种广泛使用的工业通信协议,它允许不同设备在网络中交换数据。汇川H5U PLC是一款高效能的工业...

    精通Windows Sockets网络开发:基于Visual C++实现

    《精通Windows Sockets网络开发:基于Visual C++实现》是一本深入探讨网络编程技术的专著,主要聚焦于使用Microsoft的Visual C++编程环境来构建网络应用。Windows Sockets(通常简称为Winsock)是微软为Windows操作...

    C#实现串口通讯和TCP/IP通讯的示例程序

    本示例程序聚焦于C#实现串口通讯和TCP/IP通讯,这两大通信方式在工业自动化、物联网(IoT)和嵌入式系统中扮演着核心角色。 **串口通讯**(Serial Communication)是指通过串行接口进行数据传输。在C#中,我们可以...

    C#实现Tcp通讯源代码、示例程序

    本资源"**C#实现Tcp通讯源代码、示例程序**"提供了一个全面的C# TCP通信解决方案,包括库工程和实例应用,非常适合开发者深入理解和实践TCP通信机制。 首先,我们要理解TCP协议的基本概念。TCP是一种面向连接的、...

    vb.net实现tcp通讯

    最后,文档中的"TCP通讯代码.doc"可能包含了完整的示例代码,包括客户端和服务端的实现,以及可能的错误处理和性能优化策略。研究这个文档可以帮助你更好地理解VB.NET中的TCP通讯实现。 总之,VB.NET实现TCP通讯...

    Windows Sockets 及其MFC 实现

    应用程序利用 WinSock 的 API 实现相互之间的通信,每个 Socket 与一个进程相关联,并利用下层的网络通信协议功能和操作系统调用来实现实际的通信工作。应用程序与 Windows Sockets 的关系如图 1 所示。 **图 1 ...

    Windows Sockets网络程序设计大全_0.rar

    《Windows Sockets网络程序设计大全》是一本深入探讨在Windows平台上使用Windows Sockets(Winsock)接口进行网络编程的专业书籍。Winsock是Windows系统提供的一个API,它为开发者提供了标准的接口来实现跨平台的...

    精通Windows Sockets网络开发:基于Visual C++实现-带源码

    3.5tcp示例程序 3.5.1服务器实现 3.5.2客户端实现 3.6基本udp套接字编程 3.6.1recvfrom()函数 3.6.2sendto()函数 3.7udp示例程序 3.7.1服务器实现 3.7.2客户端实现 3.8套接字选项41 3.8.1getsockopt()函数 ...

    Windows Sockets 规范及应用

    Windows Sockets,通常简称为Winsock,是微软在Windows操作系统上实现的一套网络通信API(应用程序接口),它为开发者提供了一种标准的方式来访问网络协议,如TCP/IP,从而进行网络编程。这个规范允许程序员创建跨...

    Windows Sockets.doc

    **Windows Sockets (Winsock)** 是Windows操作系统中的一个应用程序接口(API),它允许程序员进行网络通信,实现客户端和服务器之间的数据交换。这个接口是基于Berkeley Sockets模型的,因此也常被称为Berkeley ...

    Windows Sockets网络程序设计指南.rar

    Windows Sockets,简称Winsock,是微软为Windows平台提供的一个API,它遵循Berkeley Sockets接口,允许程序员创建网络通信应用程序。这本书的核心内容可能包括以下几个方面: 1. **Winsock基本概念**:首先会介绍...

    精通Windows+Sockets网络开发 基于Visual+C++实现. 源代码

    《精通Windows+Sockets网络开发:基于Visual+C++实现》是一本深入探讨网络编程的专业书籍,其核心内容是利用Microsoft的Visual C++环境进行Windows Sockets(Winsock)的应用开发。Winsock是Windows平台上用于实现...

    TCPTest C# TCP通讯示例

    在本文中,我们将深入探讨TCP通讯过程,通过C#编程语言实现一个简单的TCP客户端和服务端示例。这个示例适用于理解TCP通信的基础原理以及如何在实际项目中应用。 首先,TCP客户端是发起连接请求的一方,而服务端则是...

    Network Programming with Windows Sockets

    《使用Windows Sockets进行网络编程》一书深入探讨了如何在Microsoft Windows和Windows NT操作系统上构建网络感知应用程序,特别强调了使用Windows Sockets(WinSock)应用编程接口(API)。本书通过一系列实用示例...

    TCP通信示例-C#源码

    本示例专注于使用C#语言实现TCP(传输控制协议)通信,这是一种面向连接的、可靠的网络通信协议。TCP确保数据包按顺序发送,并在数据传输过程中处理错误,确保数据的完整性。 在"TCP通信示例-C#源码"中,有两个关键...

    C#网络编程TCP通信实例程序简单设计

    总之,C#中的TCP通信是构建网络应用程序的重要部分,理解其基本原理和实现方式对于开发复杂的网络应用至关重要。通过学习和实践,你可以熟练掌握TCP通信在C#中的应用,为你的项目带来更高效、可靠的网络通信能力。

    Microsoft的Windows Sockets API是Windows下的网络应用程序接口

    Windows Sockets API是微软为Windows平台设计的一套网络编程接口,它旨在提供一种跨平台、统一的网络编程方式,使得开发者能够更轻松地创建基于TCP/IP协议的网络应用程序。Winsock API支持多种网络协议,包括但不...

    Windows Sockets网络编程.pdf

    为了满足Windows平台上的网络编程需求,微软和其他网络软件供应商共同开发了一套标准的TCP/IP编程接口——Windows Sockets,旨在为Windows用户提供类似于UNIX下Sockets的功能。 **WinSock的组成**: - **开发组件**...

Global site tag (gtag.js) - Google Analytics