C++:无法使套接字、螺纹和结构工作
C++: Can t get sockets, threads and structures to work
我目前正在尝试学习套接字和线程的工作原理,为此,我开始编写一个程序来制作某种聊天室:
#include <iostream>
#include <windows.h>
#include <process.h>
#include <winsock2.h>
#include <vector>
using namespace std;
struct par {
SOCKET* s;
string* buffer;
bool keep = 1;
};
struct HANDLES {
HANDLE hRecv;
HANDLE hSend;
};
unsigned int WINAPI recvThread(LPVOID param) {
par* data = (par*)param;
char* inBuf;
unsigned short int inSize;
string aux = inBuf;
string* auxptr = data->buffer;
SOCKET* s = data->s;
while(true) {
inSize = recv(*s, inBuf, 2000, 0);
inBuf[inSize] = ' ';
*auxptr = aux; // ???
}
}
unsigned int WINAPI sendThread(LPVOID param) {
par* data = (par*)param;
string auxBuf = "NULL";
string* auxptr = data->buffer;
SOCKET* s = data->s;
while (true) {
if(auxBuf != (*auxptr)) {
string auxstring = *auxptr;
const char* auxchar = auxstring.c_str();
send(*s, auxchar, strlen(auxchar), 0);
auxBuf = auxstring;
}
Sleep(200);
}
}
int main()
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,2), &wsa);
string buf = "NULL";
vector<HANDLES> hVec;
SOCKET s;
s = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(8888);
server.sin_addr.s_addr = INADDR_ANY;
bind(s, (sockaddr*)&server, sizeof(server));
listen(s, 5);
sockaddr_in clientdir;
int siz = sizeof(clientdir);
SOCKET cliente;
while((cliente = accept(s, (sockaddr*)&clientdir, &siz))) {
par* newParams;
newParams->s = &cliente;
newParams->buffer = &buf;
if(cliente != INVALID_SOCKET) {
HANDLES aux;
aux.hRecv = (HANDLE)_beginthreadex(NULL, 0, recvThread, (void*)newParams, 0, 0);
aux.hSend = (HANDLE)_beginthreadex(NULL, 0, sendThread, (void*)newParams, 0, 0);
hVec.push_back(aux);
}
}
}
它遇到的第一个问题出现在:newParams->s = &cliente; 使服务器崩溃。 如果有人能告诉我我做错了什么以及应该实施的任何其他修复程序,我将不胜感激。
第一个问题是你有一个未初始化的指针(newParams
),它不指向任何有效的地方。然后你使用它,这将导致未定义的行为。
当您修复上述问题时(通过分配带有new
的新par
结构并将newParams
指向该对象),您会遇到另一个问题:指向结构中SOCKET
和string
成员的指针。所有指针,无论您有多少(或很少)连接和线程,都将指向相同的SOCKET
或string
。
如果接收和发送线程应共享SOCKET
和string
则这些成员不是指针,而是在需要时复制的值,但线程共享结构,这是通过将相同的newParams
指针传递给两个线程来解决的。
未初始化的指针以及数据争用也存在更多问题(因为您不保护线程共享的资源)。
我的建议是退后几步,废弃所有代码。然后重新编码它,同时采取小的婴儿步骤,一次添加一点点,同时确保它有效,并且你了解它是如何工作的。橡皮鸭调试以及使用实际的调试器非常有帮助。还有看书。和练习。而不是着急,尝试一次做所有事情。
相关文章:
- 如何使我的 sizeof sum 结构与空参数包一起工作
- sizeof 函数如何在带和不带位字段的结构上工作?(填充)
- 在下面的示例中,结构名称和函数如何工作?
- <string> 结构中的矢量无法正常工作
- 静态 constexpr 函数在模板结构中工作,但不能在结构中工作.为什么?
- 试图使模板用于C 中结构的元素工作
- 指向成员结构的指针如何工作
- 字频 strcmp 使用结构数组无限工作
- 这个 c++ 结构是如何工作的,我如何使用它
- 结构在C++中如何工作
- C++:无法使套接字、螺纹和结构工作
- cudaMemcpy 结构设备主机不工作
- 返回一个结构数组(部分工作)C++
- 现代C++.从继续执行的工作线程返回数据结构
- "within"结构 C/C++ 工作
- 此C/C 的结构初始化器如何使用足够的字段工作
- 如何与CUDA中的结构内部结构一起工作
- 结构是如何工作的
- 工作线程队列的这种变体是某种模式或通用结构吗?
- 基于PHP示例,与C 中数据结构一起工作的多态性示例