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_Hcpp文件:
- 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
[解决办法]
