簡體   English   中英

NVIDIA驅動程序使套接字無法接受

[英]nvidia drivers make socket fail on accept

這是使用glut和pthread的程序的摘錄。

使用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驗證)

如果未調用glStuff函數,則以任何順序包括-lglut和-lpthread都不能解決問題,程序將按預期工作

有人遇到過類似的問題嗎?

#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 ,看到的確切錯誤是什么?

如果是EINTR ,則應重試,這是完全正常的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM