linux下socket编程总是bind异常。求教~

linux下socket编程总是bind错误。求教~~
同样代码在windows下运行成功。
头文件:
C/C++ code

#ifndef SENDER_H
#define SENDER_H

#include <wx/thread.h>
#include "package.h"
#include <string>

#ifdef WIN32
#include <winsock2.h>
#else
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#endif

#ifdef WIN32
typedef int socklen_t;
typedef int ssize_t;
#endif

#ifdef __LINUX__
typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
#define FALSE 0
#define SOCKET_ERROR (-1)
#define INVALID_SOCKET (-1)
#define closesocket(_x) close(_x)
#endif

using namespace std;

class DMS_serverFrame;
class reader;

class sender : public wxThread
{
public:
    sender(DMS_serverFrame* frame);
    virtual ~sender();
    virtual wxThread::ExitCode Entry();
protected:
    void sendMsgEvent(string msg);
private:
    void sendData(SOCKET sock);
    void changeVolume(short *buf);
    void sendEmptyPackage(SOCKET sock);
    void sendDataPackage(SOCKET sock, package pack,int i);
    int send_all(SOCKET sock, char* buf, int nByte);
    void recv_all(SOCKET sock, char* buf,int nByte);

    DMS_serverFrame *m_pframe;
    reader * prd;
    SOCKET slisten;
    sockaddr_in addr;
    socklen_t addr_len;
};

#endif // SENDER_H



cpp文件:
C/C++ code

#include "sender.h"
#include "reader.h"
#include "../DMS_serverMain.h"
#include <sstream>



/** @brief sender
  *
  * @todo: document this function
  */
sender::sender(DMS_serverFrame* frame)
{

    int rval;
    this->m_pframe = frame;
    stringstream ss;

#ifdef WIN32
    WSADATA wsadata;
    if (WSAStartup(MAKEWORD(1,1), &wsadata) == SOCKET_ERROR)
    {
        this->sendMsgEvent(string("Error creating socket.\n"));
    }
#endif

    slisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    if (slisten==INVALID_SOCKET)
    {
        this->sendMsgEvent(string("socket() failed!\n"));
    }
    else
    {
        this->sendMsgEvent(string("socket() success!\n"));
#ifdef __LINUX__
        bzero(&addr, sizeof(addr));
#endif
        addr.sin_family = AF_INET;
        addr.sin_port = htons(1000);
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
        //bzero(&(addr.sin_zero), 8);
        addr_len = sizeof(addr);
        rval = bind(slisten, (sockaddr *)&addr, addr_len);

        if (rval == SOCKET_ERROR)
        {
            this->sendMsgEvent(string("Failed bind()!\n"));
            ss << errno << endl;
            this->sendMsgEvent(ss.str());
        }
        else
        {
            this->sendMsgEvent(string("bind() success!\n"));
            rval = listen(slisten, 5);
            if (rval == SOCKET_ERROR)
            {
                this->sendMsgEvent(string("Failed listen()!\n"));
            }
            else
            {
                this->sendMsgEvent(string("listen() success!\n"));
            }
        }
    }
};

其他就不贴了。



在windows下运行是正常的,可是在linux下运行结果是bind函数返回值是-1。errno值为0.google了很多资料,没发现我哪里有问题。大家帮帮忙看看吧!!

------解决方案--------------------
确切的说,是进程的 CAP_NET_BIND_SERVICE 权限

C/C++ code
/* Allows binding to TCP/UDP sockets below 1024 */
/* Allows binding to ATM VCIs below 32 */

#define CAP_NET_BIND_SERVICE 10

------解决方案--------------------
探讨
晕死,找到原因了。linux下不能使用1024以下的端口。nnd,这破问题折腾了我两天!!