【问题标题】:nvidia drivers make socket fail on acceptnvidia 驱动程序使套接字在接受时失败
【发布时间】:2012-04-30 19:12:58
【问题描述】:

这是一个使用 glut 和 pthreads 的程序的编译摘录。

使用 nvidia 驱动程序版本 295,当 glutmainloop 启动时 tcp 接受中断(程序报告错误 4)

使用 275 版,程序运行良好。

(ubuntu,3.0.0-17-generic #30-Ubuntu SMP Thu Mar 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();
}

【问题讨论】:

  • 打印错误时,不要只使用自己的错误代码,还要打印errno的值。这将告诉您实际的错误是什么。

标签: c++ ubuntu opengl pthreads nvidia


【解决方案1】:

您似乎完全忽略了errno,您看到的确切错误是什么?

如果是EINTR,你应该重试,这很正常。

【讨论】:

  • 非常感谢!我得到了 EINTR,并且在 errno 是 EINTR 时循环解决了这个问题。
猜你喜欢
  • 2012-11-15
  • 2016-06-16
  • 1970-01-01
  • 2017-08-16
  • 2014-03-06
  • 1970-01-01
  • 2018-08-17
  • 2019-03-25
  • 2023-04-07
相关资源
最近更新 更多