#include <iostream>
#include <thread>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
void error(const char *msg)
{
perror(msg);
exit(1);
}
int serverTask(int port){
int n;
char buffer[256];
/* Socket File Descriptors */
int socketFd, socketFdNew;
socklen_t clientLength;
struct sockaddr_in serverAddress, clientAddress;
/* TCP Socket */
socketFd = socket(AF_INET, SOCK_STREAM, 0);
if(socketFd < 0){
error("ERROR opening socket\n");
}
/* Fills serverAddress with zeroes */
bzero((char *) &serverAddress, sizeof(serverAddress));
/* ServerAddress configuration */
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(port);
/* Biding socket to server address */
if(bind(socketFd, (struct sockaddr *) &serverAddress,sizeof(serverAddress)) < 0){
error("ERROR on binding");
}
/* Listen for incoming connections, 5 is the number of queued devices */
listen(socketFd,5);
/* accept freezes the running thread until a client is found */
clientLength = sizeof(clientAddress);
socketFdNew = accept(socketFd, (struct sockaddr *) &clientAddress, &clientLength);
if (socketFd < 0){
error("ERROR on accept");
}
/* Fill buffer with zeroes */
bzero(buffer,256);
/* Reads up to 255 characters in the socket */
n = read(socketFdNew, buffer, 255);
if (n < 0){
error("ERROR reading from socket");
}
printf("Received: %s\n",buffer);
/* Responds with placeholder value */
n = write(socketFdNew,"40.12\n",7);
if (n < 0){
error("ERROR writing to socket");
}
close(socketFdNew);
close(socketFd);
return 0;
}
int main()
{
std::thread serverTask(7000);
std::cout <<"Hello World!\n";
serverTask.join();
return 0;
}
因此,我尝试使用c++11
,然后使用g++-wall-std=c++0x-pthread-o“main”“main.cpp”
重新编译,得到以下结果:
在包含于/usr/include/c++/4.6/thread:39:0,from main.cpp:2:/usr/include/c++/4.6/functional:在成员函数中'void std::_bind_result<_result,_functor(_bound_args...)>::__call(std::tuple<_args...>&&,std::_index_tuple<_index...>,typename std::_bind_result<_result,,_functor=int,_bound_args={},typename std::_bind_result<_result,_functor(_bound_args...)>::_enable_if_void<_result>::type=int]':/usr/include/C++/4.6/function:1378:24:实例化自'std::_bind_result<_result,_functor(_bound_args...)>::result_type},std::_bind_result<_result,_functor(_bound_args...)>::result_type=void]“/usr/include/C++/4.6/thread:117:13:实例化自'void std::thread::_impl<_callable>::_m_run()[with_callable=std::_bind_result]'main.cpp:86:1:从这里实例化/usr/include/c++/4.6/functional:1287:4:error:'((std::_bind_result*)this)->std::_bind_result::_m_f'不能用作函数编译失败。
我最后的办法是安装G++4.9。安装完成后,我尝试使用g++-4.9-wall-std=gnu++0x-pthread-o“main”“main.cpp”
,得到以下结果:
在文件include from/usr/include/c++/4.9/thread:39:0、from main.cpp:2:/usr/include/c++/4.9/functional:在'struct std::_bind_simple':/usr/include/c++/4.9/thread:140:47:required from'std::thread::thread(_callable&&,_args&&...)[with_callable=int;_args={}]'main.cpp:79:29:required from able(_args...)>::type result_type;^/usr/include/c++/4.9/functional:1695:9:错误:“class std::result_of”_m_invoke(_index_tuple<_indexes...>)中没有名为“type”的类型^编译失败。
现在我很困惑,我不知道我做错了什么。
#include <iostream>
#include <thread>
#include <stdio.h>
int serverTask(int port){
return 0;
}
int main()
{
std::thread serverTask(7000);
std::cout <<"Hello World!\n";
serverTask.join();
return 0;
}
结果保持不变:
g++-4.9-wall-std=gnu++0x-pthread-o“test”“test.cpp”(在目录:/home/pi/tempserver中)包含在/usr/include/c++/4.9/thread:39:0,from test.cpp:2:/usr/include/c++/4.9/functional:在'struct std::_bind_simple'的实例化中:/usr/include/c++/4.9/thread:140:47:required from'std::thread::thread(_callable&&,C++/4.9/functional:1665:61:错误:“class std::result_of”typedef typename result_of<_callable(_args...)>::type result_type中没有名为“type”的类型;^/usr/include/c++/4.9/functional:1695:9:错误:“class std::result_of”_m_invoke(_index_tuple<_indexes...>)中没有名为“type”的类型^编译失败。
这一行:
std::thread serverTask(7000);
声明一个名为ServerTask
的变量,并尝试传递7000
作为要在线程中运行的函数的名称。但是7000
不是函数。不幸的是,G++在这里给出了非常神秘的错误消息。
你可能是说:
std::thread foo(serverTask, 7000);
问题内容: 在Linux上是否使用线程安全写入stdout ?使用下级命令怎么办? 问题答案: 它不是C标准指定的-取决于您对C标准库的实现。实际上,C标准甚至根本没有提到线程,因为某些系统(例如嵌入式系统)没有多线程。 在GNU实现()中,stdio中处理对象的大多数高级函数都是线程安全的。通常没有名字的(例如)。但是,线程安全性处于每个函数调用级别:例如,如果您多次调用,则保证每个调用都是原子
问题内容: 我最近安装了Ubuntu 11.10,并安装了CodeBlocks IDE,并且我知道默认情况下我具有gcc和std库。 我的问题是: 您对在Ubuntu上使用新的C ++程序员有什么建议吗? 我应该从一开始就获得任何库? 我缺少一个非常好的IDE?(YMMV,但我更喜欢在IDE中工作) 从一开始我就应该意识到任何编程上的陷阱或陷阱吗? 问题答案: 在Ubuntu上,无需IDE即可使用
在Linux上如何使用gcc编译c程序 如何安装gcc 编辑c代码 编辑代码 运行代码
问题内容: 我正在尝试从线程中设置文本对象的字符串,但这给了我这个错误: 处理程序类: 我尝试使用,它确实可以工作,但是它使我的程序崩溃。我也尝试在该方法上创建一个Timer,但它给了我与以前相同的错误。 问题答案: 包起来。在它的外面,在while循环中,添加Thread.sleep(1000); 非法状态异常的原因是你试图在JavaFX Application线程以外的其他线程上更新UI。 添
问题内容: 我正在用这个 但是这个: 给我这个错误: 而且我真的不明白怎么了 问题答案: 可能是因为您误解了工作原理。 正确的代码段为: 但: 我强烈建议您不要使用,而是使用!它是JavaFX API的一部分,您不必执行这些调用。这只是很快就被黑了,但是您知道了: