无法使用 winsock2.lib 将数据发送到客户端
Can't send data to client using winsock2.lib
我们有tcp/ip应用项目,使用winsock2。在我们的源代码库中,服务器和客户端函数如下:
服务器:#undef UNICODE
#define WIN32_LEAN_AND_MEAN
#include <iostream>
#include<string>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#pragma comment (lib, "Ws2_32.lib")
using namespace::std;
int server()
{
string SERVER_ADDRESS= "172.17.11.138";
int PORT_NUMBER = 27015;
sockaddr_in server;
server.sin_family=AF_INET;
server.sin_port=htons(PORT_NUMBER);
server.sin_addr.S_un.S_addr=inet_addr(&SERVER_ADDRESS[0]);
WSADATA wsaData;
int iResult;
SOCKET ListenSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed with error: %dn", iResult);
return 1;
}
int iSendResult;
char recvbuf[256];
int recvbuflen = 256;
// Create a SOCKET for connecting to server
ListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
printf("socket failed with error: %ldn", WSAGetLastError());
WSACleanup();
return 1;
}
// Setup the TCP listening socket
iResult = bind( ListenSocket, (struct sockaddr*)&server,sizeof(server));
if (iResult == SOCKET_ERROR) {
printf("bind failed with error: %dn", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
iResult = listen(ListenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR) {
printf("listen failed with error: %dn", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
// Accept a client socket
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
printf("accept failed with error: %dn", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
// No longer need server socket
closesocket(ListenSocket);
// Echo the buffer back to the sender
iSendResult = send( ClientSocket, recvbuf, iResult, 0 );
if (iSendResult == SOCKET_ERROR) {
printf("send failed with error: %dn", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
}
客户:#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
int client()
{
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
string SERVER_ADDRESS= "172.17.11.138";
char *sendbuf = "this is a test";
char recvbuf[256];
int PORT_NUMBER = 27015;
int iResult;
sockaddr_in server;
server.sin_family=AF_INET;
server.sin_port=htons(PORT_NUMBER);
server.sin_addr.S_un.S_addr=inet_addr(&SERVER_ADDRESS[0]);
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed with error: %dn", iResult);
return 1;
}
// Create a SOCKET for connecting to server
ConnectSocket = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
printf("socket failed with error: %ldn", WSAGetLastError());
WSACleanup();
return 1;
}
iResult = connect( ConnectSocket,(struct sockaddr*)&server,sizeof(server));
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket);
printf("socket failed with error: %ldn", WSAGetLastError());
WSACleanup();
return 1;
}
if (ConnectSocket == INVALID_SOCKET) {
printf("Unable to connect to server!n");
WSACleanup();
return 1;
}
iResult = recv(ConnectSocket, recvbuf, 256, 0);
if ( iResult > 0 )
printf("Bytes received: %dn", iResult);
else if ( iResult == 0 )
printf("Connection closedn");
else
printf("recv failed with error: %dn", WSAGetLastError());
}
我们编译了上面的代码,服务器和客户端可以相互连接(用tcpview应用程序检查),但是,我们想从服务器发送数据到客户端,winsock2返回错误10057(如果我们关闭侦听套接字,错误将是10038),发送函数返回-1。
好的,一个问题是,您从服务器发送什么?这段代码:
iSendResult = send( ClientSocket, recvbuf, iResult, 0 );
似乎正在发送未初始化缓冲区recvbuf
的iResult
字节(从上次listen
调用开始为0)。客户端似乎有一个不在任何地方使用的sendbuf
。似乎有几个bug需要清理,你就能正常工作了。
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 将相机数据从服务器实时流式传输到客户端
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- Java 客户端C++服务器数据发送/接收问题
- 如何从客户端在 gsoap C++ 的标头中传递非 xml 数据?
- 将数据发送到多个客户端 UDP 时不支持地址族
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 在 MySQL 中运行 HTTP 服务器以从客户端接收数据
- cpp / c ++中的grpc客户端代码,元数据x-api-key/x-goog-api-key不起作用,给了我语音A
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 如何使用 asio 本地数据报构建回显服务器和客户端?
- 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据
- 通过TCP将数据从C++客户端发送到JSON服务器
- 如何使客户端在将数据写入 C++ 管道之前检查服务器是否完成了从管道的读取操作
- C++中从客户端到服务器的数据传输问题
- Qt TCP服务器不从客户端读取数据
- UDP 客户端(接收器)未按预期接收数据报
- 无法在java(客户端)的套接字上正确写入数据(类),也无法在c ++(服务器)上读取数据(类)