C++ nvidia驱动程序使套接字在接受时失败
下面是一个使用glut和pthreads的程序的编译摘录 对于nvidia驱动程序版本295,当GLUTMAIN循环启动时,tcp接受中断(程序报告错误4) 对于版本275,程序运行良好 (ubuntu,3.0.0-17-generic#30 ubuntu SMP 3月8日星期四20:45:39 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux问题也通过3.0.0-16验证) 以任意顺序包含-lglut和-lpthread都不能解决问题 如果未调用glStuff函数,程序将按预期工作 有人遇到过类似的问题吗C++ nvidia驱动程序使套接字在接受时失败,c++,ubuntu,opengl,pthreads,nvidia,C++,Ubuntu,Opengl,Pthreads,Nvidia,下面是一个使用glut和pthreads的程序的编译摘录 对于nvidia驱动程序版本295,当GLUTMAIN循环启动时,tcp接受中断(程序报告错误4) 对于版本275,程序运行良好 (ubuntu,3.0.0-17-generic#30 ubuntu SMP 3月8日星期四20:45:39 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux问题也通过3.0.0-16验证) 以任意顺序包含-lglut和-lpthread都不能解决问题 如果未调用glStuff函数
#include <GL/glut.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <iostream>
using namespace std;
enum Error{WSASTARTUP,SOCKETCREATION,SOCKETBINDING,SOCKETLISTENING,SOCKETACCEPT};
void onError(Error err){
std::cerr<<"error"<<err<<endl;
}
void* serverrun(void*){
int mainSocket;
int port=15002;
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_addr.s_addr=htonl(INADDR_ANY);
local.sin_port=htons((u_short)port);
mainSocket=socket(AF_INET,SOCK_STREAM,0);
int val=1;
setsockopt(mainSocket,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(val));
if(mainSocket<0){
onError(SOCKETCREATION);
}
if(bind(mainSocket, (struct sockaddr*)&local,sizeof(local))!=0)
{
onError(SOCKETBINDING);
}
if(listen(mainSocket,10)!=0)
{
onError(SOCKETLISTENING);
}
struct sockaddr_in from;
socklen_t fromlen=sizeof(from);
while(true){
int cs;
cs=accept(mainSocket,(struct sockaddr*)&from,&fromlen);
if (cs!=-1){
std::cout<<"new client"<<std::endl;
}else{
onError(SOCKETACCEPT);
}
}//while running
return NULL;
}//run
void drawGLScene(){}
void idleFunc(){}
void glStuff(int& argc,char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
glutInitWindowSize(100,100);
glutInitWindowPosition(0,0);
glutCreateWindow("win");
glutDisplayFunc(drawGLScene);
glutIdleFunc(idleFunc);
glutMainLoop();
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
枚举错误{WSASTARTUP,SOCKETCREATION,SOCKETBINDING,SOCKETLISTENING,SOCKETACCEPT};
void onError(错误err){
您似乎完全忽略了errno
,您看到的确切错误是什么
如果是EINTR
,您应该重试,这是完全正常的。您似乎完全忽略了错误号,您看到的确切错误是什么
如果是EINTR
,您应该重试,这是完全正常的。打印错误时,不要只使用您自己的错误代码,也要打印errno
的值。这将告诉您错误的实际情况。打印错误时,不要只使用您自己的错误代码,也要打印errno
的值。这将导致我告诉你错误是什么。非常感谢!我得到了EINTR,并在errno是EINTR时循环解决了问题。非常感谢!我得到了EINTR,并在errno是EINTR时循环解决了问题。