linux下socket编程总是bind错误。求教~~

playfishisme 2009-12-14 01:58:11
同样代码在windows下运行成功。
头文件:

#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文件:

#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了很多资料,没发现我哪里有问题。大家帮帮忙看看吧!!
...全文
1114 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
playfishisme 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cattycat 的回复:]
linux下有 <wx/thread.h>这个头文件吗,我还没见过。

[/Quote]
是用的wxWidgets的线程库。
cattycat 2009-12-14
  • 打赏
  • 举报
回复
linux下有<wx/thread.h>这个头文件吗,我还没见过。进程以root权限执行能用1024以下端口了,当然这个不推荐。


另外,结贴:
[Quote=引用 2 楼 playfishisme 的回复:]
怎样才可以自己结贴?
[/Quote]

找你发的帖子,标题下面就有结贴按钮。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 playfishisme 的回复:]
晕死,找到原因了。linux下不能使用1024以下的端口。nnd,这破问题折腾了我两天!!
[/Quote]

这是一个原因,此外你还要注意,重连相同ip的TIME_WAIT状态也可能导致bind出错。
do_fork 2009-12-14
  • 打赏
  • 举报
回复
确切的说,是进程的 CAP_NET_BIND_SERVICE 权限

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

#define CAP_NET_BIND_SERVICE 10
do_fork 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 playfishisme 的回复:]
晕死,找到原因了。linux下不能使用1024以下的端口。nnd,这破问题折腾了我两天!!
[/Quote]

no, 是只有root权限才能使用1024以下端口
playfishisme 2009-12-14
  • 打赏
  • 举报
回复
怎样才可以自己结贴?
playfishisme 2009-12-14
  • 打赏
  • 举报
回复
晕死,找到原因了。linux下不能使用1024以下的端口。nnd,这破问题折腾了我两天!!

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧