参考《精通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网络开发--基于Visual C++实现》 该程序由客户端和服务器端组成,实现的功能是客户端向服务器发送“MyTcp”字符串,服务器接收到该字符串,并显示出来。 客户端发送字符串后退出,...
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()函数 ...
借助于此框架,读者可理解WinSock的具体细节,包括WindowsSockets概述、OSI网络参考模型、TCP/IP协议簇中的协议和可用的服务、WinSock网络应用程序的框架及其工作机制、WinSock的三种操作模式、socket通信机制等;...
借助于此框架,读者可理解WinSock的具体细节,包括WindowsSockets概述、OSI网络参考模型、TCP/IP协议簇中的协议和可用的服务、WinSock网络应用程序的框架及其工作机制、WinSock的三种操作模式、socket通信机制等;...
TCP/IP Sockets in C 第二版。详细介绍TCP/IP协议原理 着重讲解C语言的socket编程。代码示例,文字清晰,带书签,方便查阅。
本文实例讲述了PHP编程实现的TCP服务端和客户端功能。分享给大家供大家参考,具体如下: 1、修改php.ini,打开extension=php_sockets.dll 2、服务端程序SocketServer.php <?php //确保在连接客户端时不会超时 ...
本文实例讲述了nodejs简单实现TCP服务器端和客户端的聊天功能。分享给大家供大家参考,具体如下: 服务器端 var net = require('net'); var server = net.createServer(); //聚合所有客户端 var sockets = []; //...
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 初始化 ...
9.5.2 利用Windows Sockets API和第三方提供的类进行编程 9.6串口通信用于遥控操作简例 第10章 计算机串口与其它通信协议设备的联接 10.1 串口与其它通信协议模块的调试与设备 10.1.1 Windows超级终端 ...
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# JSON和对象之间互相转换用Winform进行了JSON和对象之间转化的呈现,并用Socket来传输JSON。原文链接:http://www.cnblogs.com/HCCZX/p/5238556.html
9.5.2 利用windows sockets api和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 sms编码规范及编码与解码例程...
9.5.2 利用Windows Sockets API和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 SMS编码规范及编码与解码例程 266...
套接字可以通过多种不同的通道类型实现:Unix域套接字,TCP,UDP等。 套接字库提供了处理公共传输的特定类,以及一个用于处理其余部分的通用接口。 socket模块: 要创建套接字,必须使用套接字模块中的socket.socket...
9.5.2 利用windows sockets api和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 sms编码规范及编码与解码例程...
9.5.2 利用windows sockets api和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 sms编码规范及编码与解码例程...
9.5.2 利用Windows Sockets API和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 SMS编码规范及编码与解码例程 266...
◆ 88.htm 用VB创建自己的通信程序 ◆ 89.htm 用VB构建Internet的应用[微软提供] ◆ 90.htm 用VB开发标准CGI程序 ◆ 91.htm 用VB实现客户——服务器(TCP IP)编程实例 ◆ 92.htm 用VB实现...
2.7 MFC新功能——Windows资源管理器风格程序分析 98 2.8 应用程序框架类对象分析 100 2.8.1 视图类对文档类的调用 100 2.8.2 在框架类中获得当前的文档类和视图类对象指针 101 2.8.3 获得应用程序类对象的指针 101 ...