RECV插座类型参数的问题
Issue with recv socket type argument
你好,我需要从插座接收消息,我对recv((有问题,它需要一个void*帮助您将不胜感激。我使用的代码在下面列出。
#include "server.h"
using namespace std;
//Actually allocate clients
vector<Client> Server::chatClients;
Server::Server() {
//Initialize the mutex
Thread::initMut();
int yes = 1;
//https://www.cs.cmu.edu/afs/cs/academic/class/15213-f99/www/class26/tcpserver.c
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
memset(&serverAddr, 0, sizeof(sockaddr_in));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(PORT);
//check if socket was closed last time;
setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
if(::bind(serverSocket, (struct sockaddr *) &serverAddr, sizeof(sockaddr_in)) < 0)
cerr << "Failed during the binding process";
listen(serverSocket, 5);
}
void Server::receiveAndSend() {
Client *client;
Thread *thread;
socklen_t cliSize = sizeof(sockaddr_in);
//run forever
while(true) {
client = new Client();
thread = new Thread();
client->socket = accept(serverSocket, (struct sockaddr *) &clientAddr, &cliSize);
if(client->socket < 0) {
cerr << "Error while accepting";
}
else {
thread->generate((void *) Server::ClientHandler, client);
}
}
}
//todo use one lock, and change everything to a string.
void *Server::ClientHandler(void *args) {
//client Pointer
Client *client = (Client *) args;
string buffer;
string message;
int index;
int n;
//Add client to the clients vector
Thread::lockMut((const string) client->clientName);
//set the id of the client by getting the largest index of the vector
client->setClientId(Server::chatClients.size());
client->setClientName(buffer);
cout << "Adding client with id: " << client->clientId << endl;
Server::chatClients.push_back(*client);
Thread::unlockMut((const string) client->clientName);
while(1) {
// memset(buffer, 0, sizeof buffer);
n = recv(client->socket, buffer.c_str(), sizeof buffer, 0);
//Client disconnected?
if(n == 0) {
cout << "Client " << client->clientName << " diconnected" << endl;
close(client->socket);
//Remove client in Static clients <vector> (Critical section!)
Thread::lockMut((const char *) client->clientName);
index = Server::getClientIndex(client);
cout << "earse user with index: " << index << "andid is: "
<< Server::chatClients[index].clientId << endl;
Server::chatClients.erase(Server::chatClients.begin() + index);
Thread::unlockMut((const char * ) client->clientName);
break;
}
else if(n < 0) {
cerr << "receive error: " << client->clientName << endl;
}
else {
//Message is here now broadcast.
cout << message.c_str() << " " << client->clientName << " " << buffer;
cout << "Will send to all: " << message << endl;
Server::PublicBroadcast(message);
}
}
//End thread
return NULL;
}
void Server::PublicBroadcast(string message) {
int size;
//Acquire the lock
Thread::lockMut("'PublicBroadcast()'");
for(size_t i=0; i<chatClients.size(); i++) {
// ssize_t send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send);
cout << message << endl ;
size = send(Server::chatClients[i].socket, message.c_str(), message.length(),0);
cout << size << " sent bytes." << endl;
}
//Release the lock
Thread::unlockMut("'PublicBroadcast()'");
}
void Server::ListClients() {
for(size_t i=0; i<chatClients.size(); i++) {
cout << chatClients.at(i).clientName << endl;
}
}
/*
Should be called when vector<Client> clients is locked!
*/
int Server::getClientIndex(Client *client) {
for(size_t i=0; i<chatClients.size(); i++) {
if((Server::chatClients[i].clientId) == client->clientId) return (int) i;
}
cerr << "clientId not found." << endl;
return -1;
}
std :: string buffer.c_str((是一个常数。因此,它只能以这种方式工作:C 从插座读取到std :: string
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 在不同的模板参数包之间分发非类型参数包
- 如何在使用容器和字符串时强制使用显式分配器类型参数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 作为模板类型参数,为什么 type[N] 与其专用版本不匹配----模板<类 T>类 S<T[]>
- RECV插座类型参数的问题