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

利用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”字符串,服务器接收到该字符串,并显示出来。 客户端发送字符串后退出,...

    精通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 2规范解释小组负责人亲自执笔。)总共4个包,part1

    借助于此框架,读者可理解WinSock的具体细节,包括WindowsSockets概述、OSI网络参考模型、TCP/IP协议簇中的协议和可用的服务、WinSock网络应用程序的框架及其工作机制、WinSock的三种操作模式、socket通信机制等;...

    Windows Sockets网络编程 总计4个包,part2

    借助于此框架,读者可理解WinSock的具体细节,包括WindowsSockets概述、OSI网络参考模型、TCP/IP协议簇中的协议和可用的服务、WinSock网络应用程序的框架及其工作机制、WinSock的三种操作模式、socket通信机制等;...

    TCP/IP Sockets in C second edition

    TCP/IP Sockets in C 第二版。详细介绍TCP/IP协议原理 着重讲解C语言的socket编程。代码示例,文字清晰,带书签,方便查阅。

    PHP编程实现的TCP服务端和客户端功能示例

    本文实例讲述了PHP编程实现的TCP服务端和客户端功能。分享给大家供大家参考,具体如下: 1、修改php.ini,打开extension=php_sockets.dll 2、服务端程序SocketServer.php &lt;?php //确保在连接客户端时不会超时 ...

    nodejs简单实现TCP服务器端和客户端的聊天功能示例

    本文实例讲述了nodejs简单实现TCP服务器端和客户端的聊天功能。分享给大家供大家参考,具体如下: 服务器端 var net = require('net'); var server = net.createServer(); //聚合所有客户端 var sockets = []; //...

    Visual C++2010开发权威指南.part07

    15.3 MFC对Windows Sockets的 15.3 支持 583 15.3.1 Socket的定义 584 15.3.2 CAsyncSocket类介绍 584 15.3.3 CSocket类介绍 592 15.4 一个基于UDP的聊天室示例 593 15.4.1 MFC对Windows Sockets的 15.4.1 初始化 ...

    visual C++_Turbo C串口通信编程实践

    9.5.2 利用Windows Sockets API和第三方提供的类进行编程 9.6串口通信用于遥控操作简例 第10章 计算机串口与其它通信协议设备的联接 10.1 串口与其它通信协议模块的调试与设备 10.1.1 Windows超级终端 ...

    Visual C++6.0网络编程技术

    2.2.3 berkeley sockets和windows sokets比较 38 2.3 Winsock编程实例 41 2.3.1 主机地址查询程序 41 2.3.2 一个简单的FTP程序 43 2.3.3 小结 48 第三章 Visual C++6.0编程基础 49 3.1 Visual C++6.0编程工具简介 49...

    C# Winform Sockets收发Json样例

    参照博客C# JSON和对象之间互相转换用Winform进行了JSON和对象之间转化的呈现,并用Socket来传输JSON。原文链接:http://www.cnblogs.com/HCCZX/p/5238556.html

    Visual C++/Turbo C串口通信编程实践及源代码-3

    9.5.2 利用windows sockets api和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 sms编码规范及编码与解码例程...

    Visual C++_Turbo C 串口通信编程实践.(电子工业.龚建伟.熊光明) 第二版 电子版

    9.5.2 利用Windows Sockets API和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 SMS编码规范及编码与解码例程 266...

    Python基于Socket实现简易多人聊天室的示例代码

    套接字可以通过多种不同的通道类型实现:Unix域套接字,TCP,UDP等。 套接字库提供了处理公共传输的特定类,以及一个用于处理其余部分的通用接口。 socket模块: 要创建套接字,必须使用套接字模块中的socket.socket...

    Visual C++/Turbo C串口通信编程实践及源代码-2

    9.5.2 利用windows sockets api和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 sms编码规范及编码与解码例程...

    Visual C++/Turbo C串口通信编程实践 及源代码-1

    9.5.2 利用windows sockets api和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 sms编码规范及编码与解码例程...

    Visual C++_Turbo C 串口通信编程实践.(电子工业.龚建伟.熊光明) 源码光盘

    9.5.2 利用Windows Sockets API和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 SMS编码规范及编码与解码例程 266...

    VB网络编程实例

    ◆ 88.htm 用VB创建自己的通信程序 ◆ 89.htm 用VB构建Internet的应用[微软提供] ◆ 90.htm 用VB开发标准CGI程序 ◆ 91.htm 用VB实现客户——服务器(TCP IP)编程实例 ◆ 92.htm 用VB实现...

    Visual C++2010开发权威指南(共三部分).part1.rar

    2.7 MFC新功能——Windows资源管理器风格程序分析 98 2.8 应用程序框架类对象分析 100 2.8.1 视图类对文档类的调用 100 2.8.2 在框架类中获得当前的文档类和视图类对象指针 101 2.8.3 获得应用程序类对象的指针 101 ...

Global site tag (gtag.js) - Google Analytics