VC之socket套接字编程
来源:互联网 发布:装修攻略 知乎 编辑:程序博客网 时间:2024/05/19 20:45
网络编程中,通常使用socket套接字编程,那么该如何使用呢?接下来我们做一个最基本的小程序实现其功能。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
服务器端
// SocketTestService.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <Winsock2.h>#include <iostream>#include <string>#pragma comment(lib,"ws2_32.lib")using namespace std;void main(){ //加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData );//该函数的功能是加载一个Winsocket库版本 if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } //创建套接字 SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000); //将套接字绑定到端口上 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); char recvBuffer[300];//接收字符数据 memset((void*)recvBuffer,'\0',300); cout<<"等待对方发送数据... "<<endl; //接收数据 recvfrom(sockSrv,recvBuffer,300,0,(SOCKADDR*)&addrClient,&len); cout<<"对方的地址为: "<<inet_ntoa(addrClient.sin_addr)<<endl; cout<<"接收的内容为: "<<recvBuffer<<endl; //发送数据 string sendBuffer = "this is server"; cout<<"向客户端方发送数据: "<<sendBuffer.c_str()<<endl; sendto(sockSrv,sendBuffer.c_str(),sendBuffer.length() +1,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR)); closesocket(sockSrv);//关闭服务器套接字 WSACleanup();//结束套接字库的调用 system("pause");}
客户端
// SocketTestClient.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <Winsock2.h>#include <iostream>#include <string>#pragma comment(lib,"ws2_32.lib")//加载动态连接库ws2_32.dll,提供了网络相关API的支持using namespace std;void main(){ //加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData );//该函数的功能是加载一个Winsocket库版本 if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } //建立通讯 socket SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.68"); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000);//htons(DEFAULT_PORT) //发送数据 string sendBuffer = "this is client!"; cout<<"向服务器方发送数据: "<<sendBuffer.c_str()<<endl; sendto(sockClient,sendBuffer.c_str(),sendBuffer.length()+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //接收数据 char recvBuffer[300];//接收字符数据 memset((void*)recvBuffer,'\0',300); int len = sizeof(SOCKADDR); cout<<"等待对方发送数据... "<<endl; recvfrom(sockClient,recvBuffer,300,0,(SOCKADDR*)&addrSrv,&len); cout<<"主机的地址为: "<<inet_ntoa(addrSrv.sin_addr)<<endl; cout<<"接收的内容为: "<<recvBuffer<<endl; //结束通信 closesocket(sockClient);//关闭服务器套接字 WSACleanup();//结束套接字库的调用 system("pause");}
首先服务器端运行
然后客户端运行
查看服务器变化
源码下载
0 0
- VC之socket套接字编程
- VC网络编程 Socket套接字编程
- Vc++编程winsock ---Socket(套接字)
- Vc++编程winsock ---Socket(套接字)
- C#编程之Socket套接字编程
- 初识windows编程之socket套接字
- windows编程之socket套接字2
- 网络套接字socket编程之TCP
- 网络套接字socket编程之UDP
- Socket套接字编程
- socket套接字编程
- socket 套接字编程
- socket套接字编程
- Java编程思想之网络编程(二)套接字Socket
- Java网络编程之套接字(Socket编程)
- PHP套接字编程(socket)
- 套接字socket高级编程
- WinCE Socket套接字编程
- 插入排序之直接插入排序
- EditText设置最大输入长度并设置密码效果
- 231个javascript特效分享(上)
- Codeforces Round #116 (Div. 2, ACM-ICPC Rules)---E. Cubes
- 常用linux命令
- VC之socket套接字编程
- 理解设备对象
- 完整java开发中JDBC连接数据库代码和步骤
- UVA - 12096 The SetStack Computer STL的大集合
- http状态代码含义
- UVA - 11988 Broken Keyboard (a.k.a. Beiju Text)
- Fortinet Single Sign On Stack Overflow
- 【算法】基于优先级的排班算法实现
- 第四周 项目一三角形类的构造函数