当前位置: 首页 > news >正文

网站开发 动易有利于seo的网站底部

网站开发 动易,有利于seo的网站底部,网站备案授权书,wordpress连接微博免费版Socket编程中关于服务器端监听端口与新连接端口的深入剖析 在Socket编程领域,存在一个容易让初学者感到困惑的问题。尽管很多人在网络上进行了相关探讨,但不少解释要么不够清晰明了,要么太过肤浅,未能深入到问题的核心&#xff0…

Socket编程中关于服务器端监听端口与新连接端口的深入剖析

在Socket编程领域,存在一个容易让初学者感到困惑的问题。尽管很多人在网络上进行了相关探讨,但不少解释要么不够清晰明了,要么太过肤浅,未能深入到问题的核心,这使得初学者在理解上存在诸多障碍。

其中一个关键问题是:当Socket的服务端监听一个固定端口(例如8888),客户端前来连接此端口后,服务器会生成一个新的Socket与对应的客户端进行通讯。那么,这个新的Socket的发送和接收端口究竟是怎样的呢?是随机分配的,还是依然为8888?在此,明确地告诉读者,答案是8888。即所有由该监听产生的回应客户端的新Socket,其收发数据所使用的端口都是8888。后续将通过代码实现以及网络命令的展示来进一步验证这一点。

代码实现

服务端代码

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")#define DEFAULT_PORT "8888"
#define DEFAULT_BUFLEN 1024int main() {// 1. 初始化 WinsockWSADATA wsaData;int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);if (iResult!= 0) {std::cerr << "WSAStartup failed: " << iResult << std::endl;return 1;}// 2. 创建套接字SOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (ListenSocket == INVALID_SOCKET) {std::cerr << "Socket creation failed: " << WSAGetLastError() << std::endl;WSACleanup();return 1;}// 3. 绑定套接字到本地地址和端口sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY;serverAddr.sin_port = htons(atoi(DEFAULT_PORT));iResult = bind(ListenSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));if (iResult == SOCKET_ERROR) {std::cerr << "Bind failed: " << WSAGetLastError() << std::endl;closesocket(ListenSocket);WSACleanup();return 1;}// 4. 监听连接请求iResult = listen(ListenSocket, SOMAXCONN);if (iResult == SOCKET_ERROR) {std::cerr << "Listen failed: " << WSAGetLastError() << std::endl;closesocket(ListenSocket);WSACleanup();return 1;}std::cout << "Server is listening on port " << DEFAULT_PORT << "..." << std::endl;do {// 5. 接受客户端连接SOCKET ClientSocket = accept(ListenSocket, NULL, NULL);if (ClientSocket == INVALID_SOCKET) {std::cerr << "Accept failed: " << WSAGetLastError() << std::endl;closesocket(ListenSocket);WSACleanup();return 1;}// 6. 接收和发送数据char recvbuf[DEFAULT_BUFLEN];int recvbuflen = DEFAULT_BUFLEN;iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);if (iResult > 0) {recvbuf[iResult] = '\0';std::cout << "Received from client: " << recvbuf << std::endl;const char* sendbuf = "Hello from server!";iResult = send(ClientSocket, sendbuf, strlen(sendbuf), 0);if (iResult == SOCKET_ERROR) {std::cerr << "Send failed: " << WSAGetLastError() << std::endl;}} else if (iResult == 0) {std::cout << "Connection closing..." << std::endl;} else {std::cerr << "Recv failed: " << WSAGetLastError() << std::endl;}} while (1);// 7. 关闭套接字//closesocket(ClientSocket);closesocket(ListenSocket);WSACleanup();return 0;
}

这段服务端代码首先进行Winsock的初始化,接着创建套接字、绑定到指定端口(8888)、开始监听连接请求。在接受客户端连接后,能够接收客户端发送的数据,并向客户端发送响应信息。

客户端代码

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")#define DEFAULT_PORT "8888"
#define DEFAULT_BUFLEN 1024
#define SERVER_ADDR "127.0.0.1"int main() {// 1. 初始化 WinsockWSADATA wsaData;int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);if (iResult!= 0) {std::cerr << "WSAStartup failed: " << iResult << std::endl;return 1;}// 2. 创建套接字SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (ConnectSocket == INVALID_SOCKET) {std::cerr << "Socket creation failed: " << WSAGetLastError() << std::endl;WSACleanup();return 1;}// 3. 配置服务器地址结构体sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr(SERVER_ADDR);serverAddr.sin_port = htons(atoi(DEFAULT_PORT));// 4. 连接服务器iResult = connect(ConnectSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));if (iResult == SOCKET_ERROR) {std::cerr << "Connect failed: " << WSAGetLastError() << std::endl;closesocket(ConnectSocket);WSACleanup();return 1;}std::cout << "Connected to server " << SERVER_ADDR << ":" << DEFAULT_PORT << std::endl;// 5. 发送数据const char* sendbuf = "Hello from client!";iResult = send(ConnectSocket, sendbuf, strlen(sendbuf), 0);if (iResult == SOCKET_ERROR) {std::cerr << "Send failed: " << WSAGetLastError() << std::endl;closesocket(ConnectSocket);WSACleanup();return 1;}// 6. 接收服务器响应char recvbuf[DEFAULT_BUFLEN];int recvbuflen = DEFAULT_BUFLEN;iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);if (iResult > 0) {recvbuf[iResult] = '\0';std::cout << "Received from server: " << recvbuf << std::endl;} else if (iResult == 0) {std::cout << "Connection closing..." << std::endl;} else {std::cerr << "Recv failed: " << WSAGetLastError() << std::endl;}getchar();// 7. 关闭套接字closesocket(ConnectSocket);WSACleanup();return 0;
}

客户端代码同样先进行Winsock的初始化,创建套接字后,配置服务器地址并尝试连接到服务器(地址为127.0.0.1,端口8888)。连接成功后,发送数据给服务器并接收服务器的响应。

网络命令验证

使用Windows下的VC++对上述代码进行编译链接,生成socket_server.exesocket_client.exe程序。

  1. 首先运行socket_server.exe程序,此时网络监听情况如下,服务进程PID:18076
C:\Users\hss>netstat -ano | findstr :8888
TCP    0.0.0.0:8888           0.0.0.0:0              LISTENING       18076

可以看到服务端在8888端口处于监听状态,进程ID为18076。

  1. 接着分别运行2个客户端socket_client.exe程序,网络监听和连接情况如下:
C:\Users\hss>netstat -ano | findstr :8888
TCP    0.0.0.0:8888           0.0.0.0:0              LISTENING       18076
TCP    127.0.0.1:8888         127.0.0.1:35582        ESTABLISHED     18076
TCP    127.0.0.1:8888         127.0.0.1:35634        ESTABLISHED     18076
TCP    127.0.0.1:35582        127.0.0.1:8888         ESTABLISHED     5896
TCP    127.0.0.1:35634        127.0.0.1:8888         ESTABLISHED     22044

从上述结果可以清晰地看出,服务器进程(ID为18076)有1个监听的8888端口和2个与客户端建立的TCP连接,且这些连接的本地收发端口都是8888。而客户端有2个进程(ID分别为8896和22044),它们的端口是随机分配的(分别是35582和35634)。

通过以上的代码实现和网络命令验证,足以证明服务器监听返回的新的Socket链接的收发数据端口都是监听端口8888。这对于深入理解Socket编程中的端口使用机制具有重要意义,能够帮助初学者更加准确地把握网络编程中这一关键知识点,从而在后续的编程实践中避免因端口概念不清而产生的错误和困惑,提升编程的准确性和效率,为进一步深入学习网络编程奠定坚实的基础。

http://www.yayakq.cn/news/373697/

相关文章:

  • 地质公园网站建设基于wordpress的开发教程
  • 影视网站怎么做app万能设计导航
  • flashfxp如何发布网站微商网站如何做推广方案
  • 为什么网站显示建设中用自己的电脑做网站空间
  • 电子商城网站模板关于网站可信备案
  • 网站中竖导航栏怎么做ceo是什么职位的简称
  • 如何把一个静态网站如何介绍设计的网站模板下载地址
  • app网站开发住房公积金济南做网站的好公司
  • 江苏专业网站推广公司哪家好公共服务平台网站建设方案
  • 做网站要用到的技术贵州省建设监理协会网站
  • 公司网站自己可以学习优化吗福清建设局网站简介
  • 西安百度网站建设行距网站
  • 电商网站建设服务平台做网站设计素材
  • 简搜网站提交网站备案需要具备什么
  • 贵阳网站建设q479185700惠如何用手机做网页
  • 制作一个网站数据库怎么做网页设计与制作题库及答案
  • 百度云服务器做网站稳定吗wordpress留言板comments.php添加自定义字段
  • 2018做网站公司个人怎么做网络推广
  • 自适应网站怎样做移动适配松江九亭网站建设
  • 自治区住房和城乡建设部网站公司做网站的费用属于什么费用
  • 网站推广的基本方法是wordpress主机教程
  • 高校网站群管理系统彩票网站有人做吗
  • 东莞企业网站模板建站交互设计师
  • 体育局网站建设怎么自己做一个网站
  • 网站定制公司哪家好wordpress 站外 链接
  • 专业网站改版给别人网站做跳转
  • 深圳网站的建设网站做国际化
  • 滨州北京网站建设价格设计一个简单的物联网系统
  • 三门峡做网站优化什么是电子商务?
  • 兰州新区规划建设管理局网站珠海市规划建设局网站