为什么socket 返回-1?

ThinkInDelphi 2006-04-20 02:56:20
#include <winsock2.h>

class server
{public:
virtual int run(int argc,char ** argv);
protected:
virtual int open(short port=0);
virtual int wait_for_multiple_events();

virtual int handle_data(int sock=0);

private:
int serverfd;
};
int server::run(int argc,char ** argv)
{
if (open(argc>1?atoi(argv[1]):10000)==-1) return -1;

for(;;)
{
if(wait_for_multiple_events()==-1) return -1;

}
return 0;
}

server::open(short port)
{
struct sockaddr_in serveraddr;

if((serverfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{printf("socket error!");return -1;}//单步运行到这里serverfd==-1,为什么??
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(port);
serveraddr.sin_addr.s_addr=INADDR_ANY;
// bzero(&(serveraddr.sin_zero),8);
if (bind(serverfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr))==-1)
{printf("bind error!");return -1;}
if (listen(serverfd,1)==-1){printf("bind error!");return -1;}


return 0;
};

int server::handle_data(int sock)
{ char buf[22],spare[22];
int n;
return 0;
};

int server::wait_for_multiple_events()
{ int newfd,size;
struct sockaddr_in clientaddr;
size=sizeof(struct sockaddr_in);
newfd=accept(serverfd,(struct sockaddr *)&clientaddr,&(size));

handle_data(newfd);
return 0;
} ;

int main(int argc, char* argv[])
{
server s;
s.run(argc,argv);
return 0;
}
...全文
733 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
redf0x_1 2006-04-20
  • 打赏
  • 举报
回复
嗯,socket程序设计中的WSAStartup一定要先调用,以便初始化该进程的socket信息
包括socket版本号,描述信息,进程能够开启的最大Socket个数等等
很简单的原因,假若socket版本号都不知道,怎么使用socket?
sms88 2006-04-20
  • 打赏
  • 举报
回复
一定要WSAStartup先于其他的winsock函数?


是的,虽然我只是看了<<widows网络编程》的第一章,但是书上说了需第一个调用的就是WSAStartup
ThinkInDelphi 2006-04-20
  • 打赏
  • 举报
回复
一定要WSAStartup先于其他的winsock函数?
healer_kx 2006-04-20
  • 打赏
  • 举报
回复 1
别用 -1 ,0 啥的,显得不专业。

用INVALID_SOCKET, 和SOCKET_ERROR
ThinkInDelphi 2006-04-20
  • 打赏
  • 举报
回复
不是这个意思啦。我是问干吗要写这句话:typedef unsigned int u_int;
typedef u_int SOCKET;
sms88 2006-04-20
  • 打赏
  • 举报
回复
相当于:
typedef unsigned int SOCKET;
ThinkInDelphi 2006-04-20
  • 打赏
  • 举报
回复
在winsock2.h里面由如下定义:

typedef unsigned int u_int;
typedef u_int SOCKET;
是什么意思?
一定要WSAStartup先于其他的winsock函数?
sankt 2006-04-20
  • 打赏
  • 举报
回复
在winsock2.h里面由如下定义:

typedef unsigned int u_int;
typedef u_int SOCKET;
wind19 2006-04-20
  • 打赏
  • 举报
回复
WSAStartup应先于其他的winsock函数
zhousqy 2006-04-20
  • 打赏
  • 举报
回复
WSAStartup?

65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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