gpt4 book ai didi

c++ - C++ 客户端中的 WSAGetLastError 10038

转载 作者:太空狗 更新时间:2023-10-29 20:55:32 25 4
gpt4 key购买 nike

我创建了一个连接到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com