linux下socket编程总是bind异常。求教~
linux下socket编程总是bind错误。求教~~
同样代码在windows下运行成功。
头文件:
cpp文件:
在windows下运行是正常的,可是在linux下运行结果是bind函数返回值是-1。errno值为0.google了很多资料,没发现我哪里有问题。大家帮帮忙看看吧!!
------解决方案--------------------
确切的说,是进程的 CAP_NET_BIND_SERVICE 权限
同样代码在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
------解决方案--------------------