winsocket<一> 套接字基础
来源:互联网 发布:17报表数据分析实例 编辑:程序博客网 时间:2024/05/17 21:05
最近在学习winsocket整理一下:
IP与端口:
1、网络中有很多的主机,怎么区分主机?
用IP来标识不同的主机,其中现在主要用的是IPV4(32位),随着发展,IPV4无法满足连入的主机数量——地址不够用,所以以后应用更强大的IPV6(128为)。
2、同一台主机中有很多的服务,如何区分不同的服务?
用端口号来区分不同的服务,端口号是一个整数,范围是:0 ~ 65535;对应于TCP和UDP有相应的TCP端口和UDP端口
其中:0-1023为通用端口,这些端口已经绑定了某些服务;
1024-49151 为已注册端口号,供一般程序使用,我们开发winsocket程序时使用这个范围内的端口;
49152-65535为动态或私有端口
在winsocket中套接字SOCKET的定义:
typedef unsigned int u_int;
typedef u_int SOCKET;
从上面的定义我们可以得知其实,SOCKET就是一个无符号的整数,并且INVALID_SOCKET是唯一一个无效的套接字,其他所有的 0 - INVALID_SOCKET-1都是有效的(INVALID_SOCKET = 4294967295,这是我直接把INVALID_SOCKET打印出来的结果);由于INVALID_SOCKET是一个无效的套接字,所以我们可以利用这个值来判断我们创建的套接字是否有效。
INVALID_SOCKET的申明:#define INVALID_SOCKET (SOCKET)(~0)
一、TCP套接字基础
基本的模式:
Server端:创建socket->绑定地址->设置为监听->接受链接->交互数据(收发数据)->关闭
Client端:创建socket->连接服务器->交互数据(收发数据)->关闭
<span style="font-size:14px;">//Server端#include<iostream>#include <WINSOCK2.H>#pragma comment(lib, "ws2_32.lib")using namespace std;int main(){//<1>创建SocketWORD wVersionRequested;//版本WSADATA wsaData;//int nErrorCode;//错误代码wVersionRequested = MAKEWORD(2, 2);//生成版本nErrorCode = WSAStartup(wVersionRequested, &wsaData);if (nErrorCode != 0){//winsocket异步套接字启动失败情况cout << "WinSocket fail startup!" << endl;return 1;}//check versionif (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2){WSACleanup();//delete datareturn 1;}SOCKET sockServer;sockServer = socket(AF_INET, SOCK_STREAM, 0);//<2>绑定地址SOCKADDR_IN addrServer;addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);addrServer.sin_family = AF_INET;addrServer.sin_port = htons(8888);bind(sockServer, (SOCKADDR *)&addrServer, sizeof(SOCKADDR));//<3>打开监听listen(sockServer, 5);SOCKADDR_IN addrClient;int nLen = sizeof(SOCKADDR);cout << "here is Server" << endl;while (true){//<4>接受链接SOCKET sockConn = accept(sockServer, (SOCKADDR *)&addrClient, &nLen);char sendBuf[1024] = {0};sprintf_s(sendBuf, sizeof(sendBuf), "Welcome %s to here!\nwhat can I help you?");send(sockConn, sendBuf, strlen(sendBuf)+1, 0);char recvBuf[1024] = {0};//<5>数据交互while (true){//收数据recv(sockConn, recvBuf, sizeof(recvBuf) - 1, 0);cout << "Client: " << recvBuf << endl;if (recvBuf[0] == 'n'){ break; }cout << "Server: ";cin >> sendBuf;//发数据send(sockConn, sendBuf, strlen(sendBuf)+1, 0);}//<6>关闭socketclosesocket(sockConn);}system("pause");return 0;}</span>
<span style="font-size:14px;">//Client端#include<iostream>#include<WINSOCK2.H>#pragma comment(lib, "ws2_32.lib")using namespace std;int main(){//<1>创建socketWORD wVersion;WSADATA wsaData;int nErrorCode;wVersion = MAKEWORD(2, 2);nErrorCode = WSAStartup(wVersion, &wsaData);if (nErrorCode != 0){cout << "WinSocket fail startup !" << endl;return 1;}if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){WSACleanup();return 1;}SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);SOCKADDR_IN addrServer;addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");addrServer.sin_family = AF_INET;addrServer.sin_port = htons(8888);//<2>链接服务器connect(sockClient, (SOCKADDR *)&addrServer, sizeof(SOCKADDR));char sendBuf[1024] = { 0 };char recvBuf[1024] = { 0 };cout << "here is Client !" << endl;//<3>数据交互while (true){//收recv(sockClient, recvBuf, sizeof(recvBuf) - 1, 0);cout << "Server: " << recvBuf << endl;if (recvBuf[0] == 0){break;}cout << "Client: ";cin >> sendBuf;//发send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);}//<4>关闭socketclosesocket(sockClient);WSACleanup();system("pause");return 0;}</span>
二、UDP套接字基础
server端:创建socket->绑定地址->数据交互->关闭
Client端:创建socket->数据交互->关闭
- winsocket<一> 套接字基础
- Winsocket编程之套接字原理
- WinSocket编程——原始套接字
- Winsocket编程之套接字原理
- Winsocket编程之套接字原理
- Winsocket编程之套接字原理
- WinSocket编程——原始套接字
- 套接字网络编程基础(一)
- 套接字编程基础
- 套接字基础
- 套接字基础
- 套接字基础
- 套接字基础
- UDP套接字基础
- 套接字编程基础
- CSocket以及winsocket套接字的使用步骤(网络通信的重点知识)
- WinSocket的select函数的用法(windows套接字比较研究)
- linux异步套接字基础
- c语言中很有意思的union讲解
- android虚拟机SD卡文件的操作
- 7zip暗色系图标(windows下)
- 第17周项目3-胖子伤不起
- 2048控制台版。
- winsocket<一> 套接字基础
- 工作生活中需要知道的常识名词
- Android动画库
- android虚拟机上安装SD卡(转载)
- Jmeter使用流程及简单分析监控
- snprintf使用一例
- iOS之UIScrollView详解
- AsyncSocket使用心得
- Android_开源框架_Volley实例