您的位置:首页 > 科技 > IT业 > 微信公众平台怎么开发_西宁疫情最新消息今天新增病例_我对网络营销的理解_平台推广引流

微信公众平台怎么开发_西宁疫情最新消息今天新增病例_我对网络营销的理解_平台推广引流

2025/2/25 8:12:44 来源:https://blog.csdn.net/caz28/article/details/142835123  浏览:    关键词:微信公众平台怎么开发_西宁疫情最新消息今天新增病例_我对网络营销的理解_平台推广引流
微信公众平台怎么开发_西宁疫情最新消息今天新增病例_我对网络营销的理解_平台推广引流

前面文章,介绍了一个简单socket通讯Demo, 客户端和服务器进行简单的交互。两个代码都很简单,如果情况一复杂,就会出错。这节我们把代码完善一下,实现一个客户端输入,发送,服务器echo的交互。本文介绍服务器端代码修改。

前面代码很多函数都有返回值,我们都没有检查,完善代码,添加检查。

    servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);if (servSock == INVALID_SOCKET){std::cout << "socket error." << std::endl;return;}

socket如果出错,Linux返回-1,Windows的SOCKET是unsigned,返回INVALID_SOCKET(~0).

    int ret = bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));if (ret == SOCKET_ERROR){std::cout << "bind error." << std::endl;return;}

bind如果出错,返回SOCKET_ERROR(-1). 通常是端口占用,权限,地址错误等问题。

    ret = listen(servSock, 1);if (ret == SOCKET_ERROR){std::cout << "listen error." << std::endl;return;}

listen如果出错,返回-1,第二个参数是backlog,可排队个数,客户端connect,可以放到这个队列里,等待服务器accept。

        clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);if (clntSock == INVALID_SOCKET){std::cout << "accept error." << std::endl;return;}

accept如果出错,Windows返回INVALID_SOCKET,Linux返回-1.

        ret = send(clntSock, str, strlen(str) + sizeof(char), NULL);if (ret != strlen(str) + sizeof(char)){std::cout << "send error." << std::endl;}

send正常返回发送的字节数,如果不相等,我们这里简单打印了一下。实际工作中可以做一些重发等处理。

            memset(szBuffer, 0, MAXBYTE);ret = recv(clntSock, szBuffer, MAXBYTE, NULL);if (ret == 0){std::cout << "recv == 0." << std::endl;closesocket(clntSock);clntSock = INVALID_SOCKET;break;}else{std::cout << szBuffer << std::endl;ret = send(clntSock, szBuffer, strlen(szBuffer) + sizeof(char), NULL);if (ret != strlen(szBuffer) + sizeof(char)){std::cout << "send error." << std::endl;}}

recv返回的是接收的字节数。如果socket被close了,recv会返回0,我们需要关闭我们这边的socket。

server这边需要不停接收,发送,实现echo。所以需要一个while循环。当客户端断开后,还需要继续accept等待客户端,外面还需要一个循环。

最后形成如下代码:

    while (1){        clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);const char* str = "connected.";send(clntSock, str, strlen(str) + sizeof(char), NULL);while (1){memset(szBuffer, 0, MAXBYTE);ret = recv(clntSock, szBuffer, MAXBYTE, NULL);if (ret == 0){std::cout << "recv == 0." << std::endl;closesocket(clntSock);clntSock = INVALID_SOCKET;break;}else{std::cout << szBuffer << std::endl;ret = send(clntSock, szBuffer, strlen(szBuffer) + sizeof(char), NULL);if (ret != strlen(szBuffer) + sizeof(char)){std::cout << "send error." << std::endl;}}}}

最后整个Server端代码如下:

#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>#pragma comment (lib, "ws2_32.lib")#define SOCKET_ADDR "127.0.0.1"
#define SOCKET_PORT 1234void runSocketServer()
{SOCKET servSock = INVALID_SOCKET;SOCKET clntSock = INVALID_SOCKET;servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);if (servSock == INVALID_SOCKET){std::cout << "socket error." << std::endl;return;}struct sockaddr_in sockAddr;memset(&sockAddr, 0, sizeof(sockAddr));sockAddr.sin_family = PF_INET;inet_pton(AF_INET, SOCKET_ADDR, &sockAddr.sin_addr.s_addr);sockAddr.sin_port = htons(SOCKET_PORT);int ret = bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));if (ret == SOCKET_ERROR){std::cout << "bind error." << std::endl;return;}ret = listen(servSock, 1);if (ret == SOCKET_ERROR){std::cout << "listen error." << std::endl;return;}char szBuffer[MAXBYTE] = { 0 };while (1){SOCKADDR clntAddr;int nSize = sizeof(SOCKADDR);clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);if (clntSock == INVALID_SOCKET){std::cout << "accept error." << std::endl;return;}const char* str = "connected.";ret = send(clntSock, str, strlen(str) + sizeof(char), NULL);if (ret != strlen(str) + sizeof(char)){std::cout << "send error." << std::endl;}while (1){memset(szBuffer, 0, MAXBYTE);ret = recv(clntSock, szBuffer, MAXBYTE, NULL);if (ret == 0){std::cout << "recv == 0." << std::endl;closesocket(clntSock);clntSock = INVALID_SOCKET;break;}else{std::cout << szBuffer << std::endl;ret = send(clntSock, szBuffer, strlen(szBuffer) + sizeof(char), NULL);if (ret != strlen(szBuffer) + sizeof(char)){std::cout << "send error." << std::endl;}}}}if (clntSock != INVALID_SOCKET){closesocket(clntSock);clntSock = INVALID_SOCKET;}if (servSock != INVALID_SOCKET){closesocket(servSock);servSock = INVALID_SOCKET;}
}int main()
{WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);runSocketServer();WSACleanup();return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com