- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我创建了一个连接到 C++ 服务器的 C++ 客户端。它连接并正确地将数据发送到服务器。我创建了一个单独的线程来从服务器接收数据,这是我无法弄清楚的问题。我收到此错误:
WSAGetLastError 10038
我发现这个错误是因为描述符不是套接字。
服务器发送方法工作正常,我用 telnet 客户端测试它。
这是我的客户端代码:
#include <winsock2.h>
#include <windows.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <conio.h>
#include<iostream>
using namespace std;
int hsock;
void *SocketHandler(void*);
int main(int argv, char** argc){
//The port and address you want to connect to
int host_port= 2000;//1101;
char* host_name="10.188.126.198";
pthread_t recept;
//Initialize socket support WINDOWS ONLY!
unsigned short wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 || ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 )) {
fprintf(stderr, "Could not find useable sock dll %d\n",WSAGetLastError());
return 0;
}
//Initialize sockets and set any options
int * p_int ;
hsock = socket(AF_INET, SOCK_STREAM, 0);
if(hsock == -1){
printf("Error initializing socket %d\n",WSAGetLastError());
return 0;
}
p_int = (int*)malloc(sizeof(int));
*p_int = 1;
if( (setsockopt(hsock, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )||
(setsockopt(hsock, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) ){
printf("Error setting options %d\n", WSAGetLastError());
free(p_int);
return 0;
}
free(p_int);
//Connect to the server
struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET ;
my_addr.sin_port = htons(host_port);
memset(&(my_addr.sin_zero), 0, 8);
my_addr.sin_addr.s_addr = inet_addr(host_name);
int *csock ;
csock = (int*)malloc(sizeof(int));
if( (*csock =connect( hsock, (struct sockaddr*)&my_addr, sizeof(my_addr))) == SOCKET_ERROR ){
fprintf(stderr, "Error connecting socket %d\n", WSAGetLastError());
return 0;
}
cout<<"Client connect to :"<< htons(host_port)<<endl;
//Create thread to receive data from the server
// the problem is here as I think
pthread_create(&recept,NULL,SocketHandler,(void *)csock);
/// Send data to the server
char buffer[1024];
int buffer_len = 1024;
int bytecount;
int c;
while(true){
memset(buffer, '\0', buffer_len);
for(char* p=buffer ; (c=getch())!=13 ; p++){
printf("%c", c);
*p = c;
}
if( (bytecount=send(hsock, buffer, strlen(buffer),0))==SOCKET_ERROR){
fprintf(stderr, "Error sending data %d\n", WSAGetLastError());
return 0;
}
printf("Sent bytes %d\n", bytecount);
}
closesocket(hsock);
return 0;
}
void *SocketHandler(void* lp){
int *csock= (int*)lp;
cout<<"Start Listening Thread"<<endl;
char buffer[1024];
int buffer_len = 1024;
int bytecount;
memset(buffer, 0, buffer_len);
while(1){
memset(buffer, 0, buffer_len);
if((bytecount = recv(*csock, buffer, buffer_len, 0))==SOCKET_ERROR){
fprintf(stderr, "Error receiving data %d\n", WSAGetLastError());
break;
}
printf("Received bytes %d\nReceived string \"%s\"\n", bytecount, buffer);
}
free(csock);
return 0;
}
最佳答案
函数“connect”返回结果,而不是套接字句柄 (https://msdn.microsoft.com/en-us/library/windows/desktop/ms737625%28v=vs.85%29.aspx)。将其更改为:
...
if (connect(hsock, (struct sockaddr*)&my_addr, sizeof(my_addr)) == SOCKET_ERROR) {
fprintf(stderr, "Error connecting socket %d\n", WSAGetLastError());
return 0;
}
*csock = hsock;
...
关于c++ - C++ 客户端中的 WSAGetLastError 10038,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35433288/
我正在调用 ConnectEx() 方法。它返回 FALSE 值,因此我使用 WSAGetLastError 调用检查错误代码。有时会出现返回值为零的情况。这是什么意思? 最佳答案 发生错误时应立即调
如何从 WinAPI 调用 WSAGetLastError() 以便获得有效的文本错误? 最佳答案 [DllImport("ws2_32.dll", CharSet = CharSet.Auto, S
好吧..我不太确定那是什么意思,但我的系统运行并运行再运行而不会因内存不足而哭泣... 我猜这与系统错误 122 有关,因为在 winsock 错误代码(MSDN)中没有 122... 有人知道吗?.
我正在将一些套接字代码从 Linux 移植到 Windows。 在 Linux 中,我可以使用 strerror() 将 errno 代码转换为人类可读的字符串。 MSDN 文档显示了从 WSAGet
我的代码中有这样的东西 WSADATA wsadata; int error = WSAStartup(0x0202, &wsadata); SOCKADDR_IN targe
你好,我是一名初学者 socket/c 程序员,在本教程中我发现连接函数返回 10038 错误。请帮忙。我做错了什么? 还有什么 winsock 和 winsock2 之间的区别?同样在 connec
在我的代码中,我有带 I/O 完成端口的异步 I/O,对于读/写完成回调,我得到一个 HANDLE(当然可以是套接字、文件句柄、命名管道等)。 所以如果在这样的例程中出现问题,我想检查错误,但是如何知
我创建了一个连接到 C++ 服务器的 C++ 客户端。它连接并正确地将数据发送到服务器。我创建了一个单独的线程来从服务器接收数据,这是我无法弄清楚的问题。我收到此错误: WSAGetLastError
我正在从 Visual Studio 2013 更新到 Visual Studio 2015 并注意到这种行为差异。 #include #include #include int main()
我正在编写一个简单的套接字程序,我想在某些情况下抛出一个错误,以便更容易地捕获错误。为了得到错误,我使用了 WSAGetLastError()。这仅返回与错误关联的代码,我无法抛出该代码,因为抛出错误
我的代码在 Windows 上表现得很奇怪,但在 Linux 上工作...这是我的 server.cpp: #include #include "packet.h" #include "socket
这可能是一个重复的问题,但我已经阅读了其他线程和解决方案,并没有发现代码中遗漏任何内容。那里有些我无法弄清楚的东西。 下面是UDP服务器的代码 #pragma once #pragma comment
我调用了 WSARecv(),它返回了 WSA_IO_PENDING。然后我从另一端发送了一个 RST 数据包。存在于另一个线程中的 GetQueuedCompletionStatus() 函数按预期
总有一天。我为 C++ (Visual Studio 2015) 编写了类似于 Python 内置套接字库的套接字包装器类 所有功能都运行良好。但是,我发现我写的一些函数有问题。 使用后std::st
标题也许说明了一切? Windows 10、Visual Studio Community 2017。 C++ 服务器监听一个端口,并将生成的 FD 放入一个 fd_set 中用于输入,一个用于异常。
这个片段是一个函数的一部分,当套接字连接(或连接)时应该返回 true,如果有任何失败则返回 false。 if(bind(socket_, reinterpret_cast(&any), s
我有一段代码在 Windows 上调用 recv()。 recv() 有时会返回 -1。调用 WSAGetLastError() 返回 0。这似乎是非常奇怪的行为。以前有没有人注意到这一点。 最佳答案
我目前正在将一些 Windows 移动 C++ 代码移植到标准 C++。 所以我正在尝试为 Windows 特定功能寻找替代方案。 我很幸运地找到了一个可以帮助我替换 WSAGetLastError(
我是一名优秀的程序员,十分优秀!