利用winsock简单c/s架构编程:vc 6.0
2013-07-06 21:01
218 查看
服务器端:
//第二版本的winsock 库
#include <winsock2.h>
//ws2_32.lib静态库
//ws2_32.dll动态链接库
#pragma comment (lib,"ws2_32")
//指针的概念,指针的使用方式。一些符号的含义。
//主函数引用了两个参数,这个地方是有问题的
int main(int argc,char* argv[])//这两个参数有什么用呢?
{ //定义一个结构体类型的变量进行存放“windows sockets”初始化信息。
//结构体中包含的成员数据为,wVersion动态链接库规范的信息
//wHighVersion动态链接库最大支持的windows sockets规范的信息
//结构体包含很多内容....此处略过...
WSADATA wsaData;
//初始化动态链接库,并且使用函数“MAKEWORD”合并短整数函数
WSAStartup(MAKEWORD(2,2),&wsaData);
//创建套接字,通信协议为“PF_INET”TCP/IP协议族。
//套接字的类型为“SOCK_STREAM”流套接字类型。
//所使用的协议为TCP协议
//s:是socket()函数创建的套接字描述符,该函数返回值是一个新创建的类型为SOCKET的套接字的描述符。
SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
//定义IP地址和端口号等信息的结构体
sockaddr_in sockaddr;
//成员变量sin_family为:PF_INET
sockaddr.sin_family = PF_INET;
//在结构体中保存网卡ip地址!这个ip地址是监听的ip地址吗?
sockaddr.sin_addr.S_un.S_addr = inet_addr("0.0.0.0");
//监听端口为827
sockaddr.sin_port = htons(827);
//绑定IP地址和端口号
bind(s,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));
//监听端口,使得套接字s处于监听状态。为处于监听状态状态的流套接字s维护一个客户连接请求队列
listen(s,1);
//定义sockaddr的结构体
SOCKADDR clientAddr;
//提取SOCKADDR的长度
int nSize = sizeof(SOCKADDR);
//创建套接字
SOCKET clientSock;
//服务器程序调用accept函数从处于监听状态的流套接字的客户端请求队列中取出第一个请求,
//并创建一个新的套接字和客户端进行连接通信。
clientSock = accept(s,(SOCKADDR*)&clientAddr,&nSize);
//基于TCP的发送函数,clientSock指定发送端套接字描述符
send(clientSock,
//指明一个存放应用程序要发送数据的缓冲区
"hello client \r\n",
//指明实际要发送到数据的字节数
strlen("hello client \r\n") + sizeof(char),
//标记为一般设置为“0”
NULL);
//关闭套接字“clientSock”
closesocket(clientSock);
//关闭套接字“s”
closesocket(s);
//释放动态链接库
WSACleanup();
return 0;
}
客户端:
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib,"ws2_32")
//依旧不明白主函数中的两个变量使用来干什么的。
int main(int argc,char* argv[])
{
//生命用于存储动态链接库的初始化数据信息的变量
WSADATA wsaData;
//使用函数执行动态链接库执行初始化工作
WSAStartup(MAKEWORD(2,2),&wsaData);
//新建tcp类型的套接字变量
SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
//新建端口,IP信息的存放结构体
sockaddr_in sockAddr;
//在结构体中存储的信息是使用TCP协议进行连接
sockAddr.sin_family = PF_INET;
//指定结构体中存放的目标IP
sockAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.143");
//指定目标端口
sockAddr.sin_port = htons(827);
//连接指定的端口和IP,协议,进行连接
//#########################################################
//下面这句话我不是很理解,有哪位大神可以帮助解释下!??????????
//#########################################################
connect(s,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));
//初始化字符串变量的值为“0”
char szBuffer[MAXBYTE] = { 0 };
//指定接收端套接字描述符“s”,指定一个缓冲区,用来存放接收到的数据,标记为空。
recv(s,szBuffer,MAXBYTE,NULL);
//输出字符串类型变量的内容。
printf("szBuffer = %s \r\n ",szBuffer);
//关闭套接字“s”
closesocket(s);
//释放动态加链接库
WSACleanup();
return 0;
}
编译后成功通讯如下图所示
//第二版本的winsock 库
#include <winsock2.h>
//ws2_32.lib静态库
//ws2_32.dll动态链接库
#pragma comment (lib,"ws2_32")
//指针的概念,指针的使用方式。一些符号的含义。
//主函数引用了两个参数,这个地方是有问题的
int main(int argc,char* argv[])//这两个参数有什么用呢?
{ //定义一个结构体类型的变量进行存放“windows sockets”初始化信息。
//结构体中包含的成员数据为,wVersion动态链接库规范的信息
//wHighVersion动态链接库最大支持的windows sockets规范的信息
//结构体包含很多内容....此处略过...
WSADATA wsaData;
//初始化动态链接库,并且使用函数“MAKEWORD”合并短整数函数
WSAStartup(MAKEWORD(2,2),&wsaData);
//创建套接字,通信协议为“PF_INET”TCP/IP协议族。
//套接字的类型为“SOCK_STREAM”流套接字类型。
//所使用的协议为TCP协议
//s:是socket()函数创建的套接字描述符,该函数返回值是一个新创建的类型为SOCKET的套接字的描述符。
SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
//定义IP地址和端口号等信息的结构体
sockaddr_in sockaddr;
//成员变量sin_family为:PF_INET
sockaddr.sin_family = PF_INET;
//在结构体中保存网卡ip地址!这个ip地址是监听的ip地址吗?
sockaddr.sin_addr.S_un.S_addr = inet_addr("0.0.0.0");
//监听端口为827
sockaddr.sin_port = htons(827);
//绑定IP地址和端口号
bind(s,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));
//监听端口,使得套接字s处于监听状态。为处于监听状态状态的流套接字s维护一个客户连接请求队列
listen(s,1);
//定义sockaddr的结构体
SOCKADDR clientAddr;
//提取SOCKADDR的长度
int nSize = sizeof(SOCKADDR);
//创建套接字
SOCKET clientSock;
//服务器程序调用accept函数从处于监听状态的流套接字的客户端请求队列中取出第一个请求,
//并创建一个新的套接字和客户端进行连接通信。
clientSock = accept(s,(SOCKADDR*)&clientAddr,&nSize);
//基于TCP的发送函数,clientSock指定发送端套接字描述符
send(clientSock,
//指明一个存放应用程序要发送数据的缓冲区
"hello client \r\n",
//指明实际要发送到数据的字节数
strlen("hello client \r\n") + sizeof(char),
//标记为一般设置为“0”
NULL);
//关闭套接字“clientSock”
closesocket(clientSock);
//关闭套接字“s”
closesocket(s);
//释放动态链接库
WSACleanup();
return 0;
}
客户端:
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib,"ws2_32")
//依旧不明白主函数中的两个变量使用来干什么的。
int main(int argc,char* argv[])
{
//生命用于存储动态链接库的初始化数据信息的变量
WSADATA wsaData;
//使用函数执行动态链接库执行初始化工作
WSAStartup(MAKEWORD(2,2),&wsaData);
//新建tcp类型的套接字变量
SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
//新建端口,IP信息的存放结构体
sockaddr_in sockAddr;
//在结构体中存储的信息是使用TCP协议进行连接
sockAddr.sin_family = PF_INET;
//指定结构体中存放的目标IP
sockAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.143");
//指定目标端口
sockAddr.sin_port = htons(827);
//连接指定的端口和IP,协议,进行连接
//#########################################################
//下面这句话我不是很理解,有哪位大神可以帮助解释下!??????????
//#########################################################
connect(s,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));
//初始化字符串变量的值为“0”
char szBuffer[MAXBYTE] = { 0 };
//指定接收端套接字描述符“s”,指定一个缓冲区,用来存放接收到的数据,标记为空。
recv(s,szBuffer,MAXBYTE,NULL);
//输出字符串类型变量的内容。
printf("szBuffer = %s \r\n ",szBuffer);
//关闭套接字“s”
closesocket(s);
//释放动态加链接库
WSACleanup();
return 0;
}
编译后成功通讯如下图所示
相关文章推荐
- 利用WinSock实现简单网络编程
- 利用WinSock实现简单网络编程
- 利用vc 6.0目录下的cl.exe直接编译程序的方法
- 10年磨一剑,软件编程走火入魔之:把简单的功能做个彻彻底底、把劳动成果重复利用
- 简单介绍Python中利用生成器实现的并发编程
- VC利用ADO简单读写数据库
- 利用vc 6.0目录下的cl.exe直接编译程序的方法[整理]
- 利用VC++编程实现程序自动启动
- 利用C语言编程:有一个分数序列 2/1+3/2+5/3+8/5+13/8+...,求此序列前N项和的简单解法,
- Vc++编程winsock ---Socket(套接字)
- 10年磨一剑,软件编程走火入魔之:把简单的功能做个彻彻底底、把劳动成果重复利用
- 关于进程或线程间通信(利用内存映射)vc++ 6.0
- 简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)
- 利用vc 6.0目录下的cl.exe直接编译程序的方法[整理]
- 在VC中利用ADO编程
- 利用vc6.0进行ADO编程的简单例子
- vc编程中经常用到的简单处理搜集
- 判断VC 6.0装了哪些补丁的一个简单方法
- 简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)
- 如何利用单台计算机(可能只有一个或没有串口)学习VC串口编程