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

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

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 WIN32typedef 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)#endifusing 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,这破问题折腾了我两天!!