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

优酷视频上传网站源码家居网站模板

优酷视频上传网站源码,家居网站模板,wordpress4.7更新说明,海口网站制作案例目录 引言#xff1a;网络编程基础 一、socket介绍(套接字) 1.1 Berkeley Socket套接字 1.2 WinSocket套接字 1.3 WSAtartup函数 1.4 socket函数 1.5 字节序转换 1.6 绑定套接字 1.7 监听 1.8 连接 1.9 接收数据 1.10 发送数据 1.11 关闭套接字 二、UDP连接流程…目录 引言网络编程基础 一、socket介绍(套接字) 1.1 Berkeley Socket套接字 1.2 WinSocket套接字 1.3 WSAtartup函数 1.4 socket函数 1.5 字节序转换 1.6 绑定套接字 1.7 监听 1.8 连接 1.9 接收数据 1.10 发送数据 1.11 关闭套接字 二、UDP连接流程 2.1 接收数据 2.2 发送数据 三、阻塞与非阻塞模式 四、示例代码 4.1 TCP协议代码 4.2 UDP协议代码 引言网络编程基础 在网络编程领域实现高效、可靠的网络通信至关重要。套接字Socket作为网络通信的关键接口在其中扮演着核心角色。从最初加利福尼亚大学Berkeley分校为UNIX系统开发的Berkeley Socket到后来多家公司共同制定的Windows Sockets规范套接字不断发展完善。了解套接字的原理、相关函数的使用以及不同网络协议如TCP、UDP的连接流程对于开发稳定的网络应用程序意义重大。 一、socket介绍(套接字) 1.1 Berkeley Socket套接字 套接字Socket最初是由加利福尼亚大学Berkeley分校专门为UNIX操作系统搞出来的网络通信接口。时间回到20世纪80年代初这所学校把美国国防部高研署提供的TCP/IP整合进了Unix系统里紧接着很快就开发出了TCP/IP应用程序接口API这个接口其实就是Socket套接字接口。后来UNIX操作系统用的人越来越多套接字也跟着火了起来成了现在最常用的网络通信应用程序接口之一。  1.2 WinSocket套接字 在90年代初期Sun Microsystems、JSB Corporation、FTP software、Microdyne还有Microsoft这几家公司一起搞出了一套标准叫做Windows Sockets规范。这个规范是对Berkeley Sockets的一个重要升级。具体来说它新添了一些异步函数还弄出了符合Windows消息驱动特点的网络事件异步选择机制。  Windows Sockets规范是一套开放的网络编程接口能支持多种协议专门用于Windows系统。在实际使用中Windows Sockets规范主要有1.1版和2.0版这两个版本。1.1版只能支持TCP/IP协议而2.0版就厉害了它能支持好几种协议并且对于之前的版本也能很好地兼容老程序也能正常使用。  TCP连接流程 1. 包含必要的头文件及库 #include winsock2.h #pragma comment(lib,ws2_32.lib) 2. 指定需要使用的Winsock规范的最高版本并初始化Winsock装入Winsock.dll WSAStartup(MAKEWORD(2,2),wsaDATA); 3. 创建套接字 socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 4. 绑定IP和端口 bind(sock,(sockaddr*)addr,sizeof(sockaddr_in)); 5. 监听 listen(sock,SOMAXCONN); 6. 连接客户端 accept(sock,(sockaddr*)addrClient,nAddrSize); 7. 接收数据 recv(sockClient,buf,1024,0); 8. 发送数据 send(Sock,message,nSize,O); 9. 在调用“closesocket”函数之后但是在程序结束之前需要清理Winsock closesocket(sock); //关闭套接字 WSACleanup(); 1.3 WSAtartup函数 不管是开发客户端还是服务端的Socket应用程序都必须先加载Windows Sockets动态库通常使用WSAtartup函数来实现这个功能。 int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData );- wVersionRequested通过MAKEWORD(X,Y)宏定义来表示X高位表示次版本号Y低位表示主版本号即期望调用者使用的WinSocket版本。 - lpWSAData指向WSADATA结构体用于返回被加载动态库的有关信息。 typedef struct WSAData {WORD wVersion; //期望调用者使用的WinSocket版本WORD wHighVersion;//DLL支持的最高版本char szDescription[WSADESCRIPTION_LEN 1];//DLL的描述信息char szSystemStatus[WSASYS_STATUS_LEN 1];//DLL的状态信息unsigned short iMaxSockets;//一个进程可以打开套接字最多数量unsigned short iMaxUdpDg;char FAR* lpVendorInfo;//一个进程发送或接收的最大数据的长度 }WSADATA,*LPWSADATA; 1.4 socket函数 初始化WinSocket DLL后通过scoket函数和WSASocket函数来创建套接字。该函数调用成功后会返回一个新建的套接字句柄。 SOCKET WSAAPI socket(_In_ int af, //通信协议族_In_ int type, //套接字类型_In_ int protocol);//传输协议 af     - AF_INETinternet协议IP V4     - AF_IRDA红外协议     - AF_BTH蓝牙协议 type     - SOCK_STREAM流式socket需建立连接通信过程可靠TCP     - SOCK_DGRAM数据报socket无需建立连接通讯过程不可靠UDP     - SOCK_RAW原始套接字 Protocol     - 对于SOCK_STREAM套接字类型该字段为IPPROTO_TCP或者0。     - 对于SOCK_DGRAM套接字类型该字段为IPPROTO_UDP或者0。 1流套接字         流套接字能够提供双向的数据流服务数据传输是有序的不会重复也不存在记录边界特别适合处理大量数据的情况。在网络传输层它可以根据需要把数据分散成合适大小的数据包或者把数据包集中起来。 使用流套接字通信时双方得先建立一条通路。这么做一方面能确定双方之间的传输路线另一方面能确保双方都处于活动状态随时可以互相响应。不过建立这样一个通信信道可不容易要耗费不少资源。另外大多数面向连接的协议为了保证数据发送准确无误往往得做一些额外的计算来验证数据的正确性这又进一步增加了开销 。 2数据报套接字         数据报套接字能实现双向的数据流动。但它有个问题没办法确保数据在传输过程中是可靠的也不能保证数据按顺序到达还可能出现重复数据。打个比方一个进程通过数据报套接字接收信息时可能会发现收到的信息跟发送时的顺序不一样甚至还会收到重复的内容。 数据报套接字在工作时不需要建立连接发送端发送信息后它不管接收端是不是在监听也不关心接收端有没有按时收到信息。正因为这样数据报的可靠性比较差。所以在使用数据报套接字编程时程序员得自己想办法去管理数据报的顺序还要确保数据的可靠性 。 1.5 字节序转换 不同的计算机有时使用不同的字节顺序存储数据。任何从Winsock函数对IP地址和端口号的引用以及传送给Winsock函数的IP地址和端口都是按照网络顺序组织的。 - 将32位数从网络字节转换成主机字节大端到小端 u_long ntohl(u_long hostlong); - 将16位数从网络字节转换成主机字节大端到小端 u_short ntohs(u_short short); - 将32位数从主机字节转换成网络字节小端到大端 u_long htonl(u_long hostlong); - 将16位数从主机字节转换成网络字节小端到大端 U_short htons(u short short); 1.6 绑定套接字 bind()函数将套接字绑定到一个已知的地址上。 int bind(SOCKET s, //套接字struct sockaddr FAR*name,//地址结构体变量(IP,端口协议簇int namelen //Sockaddr结构长度 ); 示例 sockaddr_in addr; addr.sin_family AF_INET; //地址家族 addr.sin_port htons(1234); //端口号 addr.sin_addr.S_un.S_addr inet_addr(192.168.1.100); //IP地址 本地127.0.0.1 //3.绑定套接字 nErrCode bind(sock,(sockaddr*)addr, //套接字sizeof(sockaddr_in));//IP定址结构体大小 1.7 监听 listen()函数将套接字设置为监听模式。 1.8 连接 accept函数实现接收一个连接请求。 SOCKET accept(SOCKET s, //监听套接字struct sockaddr FAR*addr,int FAR*addrlen ); 该函数返回请求连接的套接字句柄。 示例 SOCKET ClientSocket accept(sock,(sockaddr*)addrClient, //返回请求连接主机的地址nAddrSize); //sockaddr_in的大小 示例2域名解析 hostent *phostent; in_addr in; //指向hostent结构的指针 //IPV4地址结构 if((phostent gethostbyname(www.15pb.com))NULL){printf(gethostbyname()错误%d,WSAGetLastError()); } else{//拷贝4字节的IP地址到IPV4地址结构memcpy(in,phostent-h_addr,4);printf(主机%s的IP地址是,phostent-h_name);printf(%s,inet_ntoa(in)); 1.9 接收数据 Recv()函数用于接收数据。 int recv(SOCKET s, char *buf, //接收数据缓冲区int len,int flags ); 该函数返回接收到的数据实际长度最后一个参数可以是0、MSG_PEEK和MSG_OOB。 - 0表示无特殊行为。 - MSG_PEEK表示会使有用的数据被复制到接收缓冲区但没有从系统中将其删除。 - MSG_OOB表示处理带外数据。 示例 char buf[1024]{0}; nRecvSize recv(sockClient, buf, 1024, 0); 1.10 发送数据 send()函数用于发送数据。 int send(SOCKET s, char *buf, //发送数据缓冲区int len,int flags ); 示例 send(Sock, message, nSize, 0); 1.11 关闭套接字 Closecocket()函数关闭套接字释放所占资源。 closecocket(SOCKET s //要关闭的套接字); 当调用该函数释放套接字后如果再使用该套接字执行函数调用则会失败并返回WSAENOTSOCK错误。 二、UDP连接流程 1. 包含必要的头文件及库 #include winsock2.h #pragma comment(lib,ws2_32.lib) 2. 指定需要使用的Winsock规范的最高版本并初始化Winsock装入Winsock.dll WSAStartup(MAKEWORD(2,2),wsaDATA); 3. 创建套接字 socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); 4. 绑定IP和端口 bind(sock,(sockaddr*)addr,sizeof(sockaddr_in)); 5. 接收数据 recvfrom(sockClient,buf,1024,0,(sockaddr*)fromAddr,fromLen); 6. 发送数据 sendto(Sock,message,nSize,0,(sockaddr*)toAddr,toLen); 7. 在调用“closesocket”函数之后但是在程序结束之前需要清理Winsock closesocket(sock); //关闭套接字 WSACleanup(); 2.1 接收数据 recvfrom()函数用于接收数据并且返回发送数据主机的地址。 recvfrom(SOCKET s, //用来接收数据的套接字char FAR*buf, //接收数据的缓冲区int len, //接收缓冲区的长度int flags, //一般为0struct sockaddr*to, //接收的地址结构int FAR*fromlen //sockaddr结构大小 ); 注函数的返回值是接收到的大小。 2.2 发送数据 sendto()函数用于发送数据。 sendto(SOCKET s,const char FAR*buf,int len,int flags,const struct sockaddr*to,int tolen ); - s用来发送数据的套接字。 - buf发送数据的缓冲区。 - len要发送数据的长度。 - flags一般为0。 - to目标地址和端口。 - tolensockaddr结构大小。 如果该函数成功则返回发送数据的字节数。 需要注意以下两点         1. 在UDP编程里从程序编写的角度来看很难明确区分出服务端和客户端。简单来说谁提供服务就把谁当作服务端。         2. 还有一点要留意当刚创建好socket时直接调用sendto函数是可行的此时不需要手动绑定系统会自动进行绑定操作。 三、阻塞与非阻塞模式 阻塞模式         在阻塞模式中一旦执行操作函数它就会一直处于等待状态不会马上给出返回结果。执行这个函数的线程也会卡在这儿只有当特定条件满足了函数才会返回。打个比方就像快递员通知你今天会有个快递送达却没告诉你具体时间。在阻塞模式下你就只能一直在校门口干等着快递这一整天别的事都做不了。 非阻塞模式         要是处于非阻塞模式操作函数执行后会立刻返回执行这个函数的线程能接着往下运行。同样拿快递的例子来说快递员告知你今天有快递没说具体时间你不用一直守在校门口而是每隔30分钟去校门口瞅瞅快递到了没要是没到就回来继续做自己原来的事。 为了避免线程长时间被阻塞提升线程的使用效率就出现了非阻塞模型。我们可以通过调用ioctlsocket()函数来让socket明确处于非阻塞模式 。 int ioctlsocket(_In_ SOCKET s,_In_ long cmd,_Inout_ u_long *argp ); 示例 //2.设置套接字非阻塞模式 unsigned long ul 1; //设置套接字选项 int nRet ioctlsocket(sSocket,FIONBIO,ul); 四、示例代码 4.1 TCP协议代码 服务端 #include winsock2.h // Winsock库头文件 #include ws2tcpip.h // 提供IP地址转换函数 #include iostream // 标准输入输出流 #pragma comment(lib, Ws2_32.lib) // 链接Winsock库// 初始化Winsock库 bool InitWinSock() {WSADATA wsaData; // 用于存储Winsock库的初始化信息// 调用WSAStartup初始化Winsock库版本2.2if (WSAStartup(MAKEWORD(2, 2), wsaData) ! 0) {std::cerr WSAStartup failed! std::endl;return false; // 初始化失败返回false}return true; // 初始化成功返回true }// 创建并绑定套接字 SOCKET CreateAndBindSocket(const char* ip, int port) {// 创建TCP套接字SOCKET sock socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sock INVALID_SOCKET) {std::cerr Socket creation failed: WSAGetLastError() std::endl;return INVALID_SOCKET; // 创建套接字失败返回INVALID_SOCKET}sockaddr_in addr{}; // 定义一个IPv4地址结构体addr.sin_family AF_INET; // 地址族为IPv4addr.sin_port htons(port); // 设置端口号转换为网络字节序// 将IP地址从字符串转换为二进制格式inet_pton(AF_INET, ip, addr.sin_addr);// 绑定套接字到指定IP和端口if (bind(sock, (sockaddr*)addr, sizeof(addr)) SOCKET_ERROR) {std::cerr Bind failed: WSAGetLastError() std::endl;closesocket(sock); // 绑定失败关闭套接字return INVALID_SOCKET; // 返回INVALID_SOCKET}return sock; // 返回绑定成功的套接字 }// 主函数 int main() {// 初始化Winsock库if (!InitWinSock()) return 1;const char* serverIp 192.168.1.100; // 服务器IP地址int serverPort 1234; // 服务器端口号// 创建并绑定套接字SOCKET serverSocket CreateAndBindSocket(serverIp, serverPort);if (serverSocket INVALID_SOCKET) {WSACleanup(); // 释放Winsock资源return 1;}// 开始监听连接请求SOMAXCONN为最大连接数if (listen(serverSocket, SOMAXCONN) SOCKET_ERROR) {std::cerr Listen failed: WSAGetLastError() std::endl;closesocket(serverSocket); // 监听失败关闭套接字WSACleanup(); // 释放Winsock资源return 1;}std::cout Server listening on serverIp : serverPort std::endl;// 主循环处理客户端连接while (true) {sockaddr_in clientAddr{}; // 存储客户端地址信息int clientAddrSize sizeof(clientAddr);// 接受客户端连接返回客户端套接字SOCKET clientSocket accept(serverSocket, (sockaddr*)clientAddr, clientAddrSize);if (clientSocket INVALID_SOCKET) {std::cerr Accept failed: WSAGetLastError() std::endl;continue; // 接受失败继续循环}char clientIp[INET_ADDRSTRLEN]; // 存储客户端IP地址字符串// 将客户端IP地址从二进制转换为字符串格式inet_ntop(AF_INET, clientAddr.sin_addr, clientIp, INET_ADDRSTRLEN);std::cout Client connected: clientIp std::endl;char buffer[1024]; // 接收数据的缓冲区while (true) {// 接收客户端发送的数据int bytesReceived recv(clientSocket, buffer, sizeof(buffer), 0);if (bytesReceived 0) {std::cerr Client disconnected or recv failed: WSAGetLastError() std::endl;break; // 接收失败或客户端断开连接退出循环}buffer[bytesReceived] \0; // 确保字符串以NULL结尾std::cout Received: buffer std::endl; // 打印接收到的数据}closesocket(clientSocket); // 关闭客户端套接字}closesocket(serverSocket); // 关闭服务器套接字WSACleanup(); // 释放Winsock资源return 0; } 客户端 #include winsock2.h // Winsock库头文件 #include ws2tcpip.h // 提供IP地址转换函数 #include iostream // 标准输入输出流 #pragma comment(lib, Ws2_32.lib) // 链接Winsock库// 初始化Winsock库 bool InitWinSock() {WSADATA wsaData; // 用于存储Winsock库的初始化信息// 调用WSAStartup初始化Winsock库版本2.2if (WSAStartup(MAKEWORD(2, 2), wsaData) ! 0) {std::cerr WSAStartup failed! std::endl;return false; // 初始化失败返回false}return true; // 初始化成功返回true }// 主函数 int main() {// 初始化Winsock库if (!InitWinSock()) return 1;const char* serverIp 127.0.0.1; // 服务器IP地址int serverPort 1234; // 服务器端口号// 创建TCP套接字SOCKET clientSocket socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (clientSocket INVALID_SOCKET) {std::cerr Socket creation failed: WSAGetLastError() std::endl;WSACleanup(); // 释放Winsock资源return 1;}sockaddr_in serverAddr{}; // 定义一个IPv4地址结构体serverAddr.sin_family AF_INET; // 地址族为IPv4serverAddr.sin_port htons(serverPort); // 设置端口号转换为网络字节序// 将IP地址从字符串转换为二进制格式inet_pton(AF_INET, serverIp, serverAddr.sin_addr);// 连接到服务器if (connect(clientSocket, (sockaddr*)serverAddr, sizeof(serverAddr)) SOCKET_ERROR) {std::cerr Connection failed: WSAGetLastError() std::endl;closesocket(clientSocket); // 连接失败关闭套接字WSACleanup(); // 释放Winsock资源return 1;}std::cout Connected to server at serverIp : serverPort std::endl;char message[1024]; // 存储发送的消息std::cout Enter message: ;std::cin.getline(message, sizeof(message)); // 从标准输入读取消息// 发送消息到服务器if (send(clientSocket, message, static_castint(strlen(message)), 0) SOCKET_ERROR) {std::cerr Send failed: WSAGetLastError() std::endl;}closesocket(clientSocket); // 关闭客户端套接字WSACleanup(); // 释放Winsock资源return 0; } 4.2 UDP协议代码 #include winsock2.h // Winsock库头文件 #include ws2tcpip.h // 提供IP地址转换函数 #include iostream // 标准输入输出流 #pragma comment(lib, Ws2_32.lib) // 链接Winsock库// 函数名称InitWinSock // 功能初始化Winsock库 // 返回值成功返回TRUE失败返回FALSE BOOL InitWinSock() {WSADATA wsaData; // 用于存储Winsock库的初始化信息// 调用WSAStartup初始化Winsock库版本2.2int nResult WSAStartup(MAKEWORD(2, 2), wsaData);if (nResult ! 0) { // 初始化失败std::cerr WSAStartup failed with error: nResult std::endl;return FALSE;}return TRUE; // 初始化成功 }// 函数名称InitServer // 功能初始化UDP服务器 // 返回值成功返回true失败返回false bool InitServer() {// 1. 初始化Winsock库if (!InitWinSock()) {return false;}// 2. 创建UDP套接字SOCKET serverSocket socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (serverSocket INVALID_SOCKET) {std::cerr Socket creation failed: WSAGetLastError() std::endl;WSACleanup(); // 释放Winsock资源return false;}// 3. 定义服务器地址sockaddr_in serverAddr{};serverAddr.sin_family AF_INET; // 地址族为IPv4serverAddr.sin_port htons(1234); // 设置端口号转换为网络字节序// 将IP地址从字符串转换为二进制格式inet_pton(AF_INET, 192.168.199.207, serverAddr.sin_addr);// 4. 绑定套接字到指定IP和端口if (bind(serverSocket, (sockaddr*)serverAddr, sizeof(serverAddr)) SOCKET_ERROR) {std::cerr Bind failed: WSAGetLastError() std::endl;closesocket(serverSocket); // 绑定失败关闭套接字WSACleanup(); // 释放Winsock资源return false;}std::cout Server started and listening on 192.168.199.207:1234 std::endl;// 5. 主循环接收客户端数据while (true) {char buffer[1024] {0}; // 接收数据的缓冲区sockaddr_in clientAddr{}; // 存储客户端地址信息int clientAddrSize sizeof(clientAddr);// 接收客户端发送的数据int bytesReceived recvfrom(serverSocket, buffer, sizeof(buffer), 0,(sockaddr*)clientAddr, clientAddrSize);if (bytesReceived SOCKET_ERROR) {std::cerr recvfrom failed: WSAGetLastError() std::endl;break; // 接收失败退出循环}// 打印接收到的数据buffer[bytesReceived] \0; // 确保字符串以NULL结尾char clientIp[INET_ADDRSTRLEN];inet_ntop(AF_INET, clientAddr.sin_addr, clientIp, INET_ADDRSTRLEN); // 将客户端IP转换为字符串std::cout Received from clientIp : buffer std::endl;}// 6. 关闭套接字并释放资源closesocket(serverSocket);WSACleanup();return true; }// 主函数 int main() {if (!InitServer()) {std::cerr Server initialization failed! std::endl;return 1;}return 0; } 这篇网络编程基础的内容全面介绍了套接字相关知识涵盖了Berkeley Socket和WinSocket的起源与发展详细阐述了TCP和UDP的连接流程包括各个步骤中涉及的函数使用方法、参数含义还介绍了阻塞与非阻塞模式的概念及设置方式并通过完整的TCP和UDP协议示例代码让读者能够更直观地理解和实践网络编程中的关键操作。
http://www.pierceye.com/news/316900/

相关文章:

  • 梅州市建设培训中心网站济南网上房地产
  • 海口网站提升排名专业做公司logo的网站
  • fm网站开发做网站自动赚钱
  • 网站二级导航制作wordpress找人做
  • 网站建设市场占有率网站开发工程师的职责
  • wordpress 单本小说站做网站前景
  • 只做网站可以在百度里收到吗平面设计是干嘛的
  • 义乌网站建设优化推广网站开发需要哪些人怎么分工
  • 关键词排行优化网站企业seo外包
  • 自适应网站怎么做广西建设局建设行政主管部网站
  • 把网站做成手机版学网页设计的培训
  • 陕西省建设厅执业资格注册中心网站报名系统网站建设重庆最加科技
  • 网站优化软件排名器wordpress E405
  • 北京建设部网站职称集约化网站建设方案
  • 常州溧阳建设工程管理中心网站惠州网站网站建设
  • 你的网站尚未进行备案中国建设银行贵州分行网站
  • 白银做网站的董事wordpress模板搬迁
  • 专业的网站开发建访动地科技登录网站
  • 网站模板素材下载如何做二维码跳转到网站
  • 自助建站免费信息发布网站wordpress 做图库栏目
  • 做网站 我们的工人怎么写哪个网站可以做照片分享
  • 做娱乐网站一个服务器可以建几个网站
  • 外包加工网站企业邮箱免费注册申请
  • jsp网站开发模式徐州手机网站制作
  • 三合一网站开发架构怎么用dw设计网站页面
  • 资源分享网站怎么做临沂住房和城乡建设厅网站
  • 住房和城乡建设部官方网站办事大厅企业展厅设计公司信息
  • 公司网站设计单页网站怎么做排名
  • 公司产品网站应该怎么做页面模板第三方应用
  • 绍兴网站建设网站站长 网站对比