accept: Invalid argument linux 网络编程

今天测试一个本地网络通讯,在ubuntu虚拟机下出现的问题,警报:accept: Invalid argument 

初始化地方:

socklen_t clilen;
struct sockaddr_in clientaddr;

问题点:

connfd = accept(listenfd,(sockaddr *)&clientaddr,&clilen);

后面google网络上相关问题之后原来是    

http://blog.csdn.net/xbl1986/article/details/3525621

问题就出在accept的第3个参数:必须为正数,由于没有初始化,得到的值可能是负数。

把那个变量初始化一下就好了

 

  先尝试修改clilen 参数为正,运行表明没有出现这个问题了:

  clilen= 1;                               //假如改为正

    struct sockaddr_in clientaddr;

 

    connfd = accept(listenfd,(sockaddr *)&clientaddr,&clilen);

    但是要做如下修改:

    socklen_t clilen= sizeof(struct sockaddr);   // 这样才是正确的设置    
    struct sockaddr_in clientaddr;


    connfd = accept(listenfd,(sockaddr *)&clientaddr,&clilen);

---------------------------------------------------------------------------------------------------------

更详细的了解原因,上面的答案可以解决问题,如果想知道更了解细节,可以看下面的个人总结

-----------------------------------------------------------------------------------------------------------

从本函数的描述上看,长度不能小于0 ,否则会出错,如果没有对长度初始化,可能会得到负值。

可以在运行的时候打印addrlen 这个值,当没有初始化的时候,打印得到的是负值。

posted @ 2014-04-24 11:34  johnny_shi  阅读(1500)  评论(0编辑  收藏  举报