请教各位一个关于winsock的问题

hugett 2012-04-01 04:46:16
刚开始学习winsock,写了一个最简单的服务器/客户端程序。但发现即使我没有打开客户端的程序,服务器端的accept一样会成功。但我看了一些资料说accept是会阻塞的。。
下面是我的服务器端代码,请各位大牛帮忙看一下,谢谢!

#pragma comment(lib,"WS2_32.lib")

#include <WinSock.h>
#include <cstdio>

int main(){
WSADATA wsa;
WSAStartup(MAKEWORD(1,1),&wsa);

SOCKET listensocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

SOCKADDR_IN saddr;
saddr.sin_family=AF_INET;
saddr.sin_port=htons(35150);
saddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
bind(listensocket,(SOCKADDR*)&saddr,sizeof(saddr));

listen(listensocket,5);

SOCKET connectsocket;
SOCKADDR_IN caddr;
int caddr_len=0,recvlen=0;
while(1){
connectsocket=accept(listensocket,(SOCKADDR*)&caddr,&caddr_len);//没有客户端连接,程序不是应该阻塞在这里的么?

char buf[100];
recvlen=recv(connectsocket,buf,100,0);
printf("%d\n",recvlen);
closesocket(connectsocket);
}

closesocket(listensocket);

WSACleanup();

return 0;
}

以上代码会陷入死循环,不断输出-1
...全文
80 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
hugett 2012-04-01
  • 打赏
  • 举报
回复
解决了,谢谢各位~结贴散分~
zhanshen2891 2012-04-01
  • 打赏
  • 举报
回复
上大学时去网吧坐在一大排机子的末端,不大一会整排机子都停电了。玩家各种闹呀,摔鼠标的砸键盘的。网管过来看看是我把插座踢开了。他插上了也没说什么,过了一会我又踢开了,网管过来说:你走吧!要是玩游戏的知道了我们保证不了你安全!
zhanshen2891 2012-04-01
  • 打赏
  • 举报
回复
有一A女挺色的。一天她去城里,路上遇一赶驴车的老农。便请求搭顺风车,老农同意了。路上A女说:大哥,你看天挺热的,你让驴去吃点草,咱俩去凉快凉快吧。老农觉得也没什么不可以的就说行。休息的功夫A女便把老农拿下。一路10多里地,俩人凉快了20多回。眼看快到城了。A女又说:大哥你看快到了,咱俩也要分开了咱再让驴吃点草,咱俩再凉快凉快呗。老农:大妹子你看这样行不,我去吃点草,你跟驴去凉快凉快行不?
zhanshen2891 2012-04-01
  • 打赏
  • 举报
回复
去年冬天晚上去买烤地瓜。晚上很冷,卖地瓜的大哥穿着棉袄戴着耳包。称了一个烤地瓜,三块一,大哥说一毛不要了。我掏掏兜拿出一角硬币,和大哥说晚上冷这么辛苦,有零的我一定给。大哥说声谢谢,我拿起地瓜就走,才一转身大哥说:“姑娘,没给三块”
Lactoferrin 2012-04-01
  • 打赏
  • 举报
回复
没看到,那你就caddr_len=sizeof caddr
hugett 2012-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
建议你找几个例子看一下
accept是在listen后用的,你没调用listen
[/Quote]
我有看过一些例子了。。觉得没什么不一样。。
还有。。我有调用listen啊。。
stjay 2012-04-01
  • 打赏
  • 举报
回复
int caddr_len=sizeof(SOCKADDR);

看MSDN,winsock的accept比较特别

SOCKET accept(
__in SOCKET s,
__out struct sockaddr* addr,
__inout int* addrlen // 这是个输入输出参数
);
lijianli9 2012-04-01
  • 打赏
  • 举报
回复
connectsocket=accept(listensocket,(SOCKADDR*)&caddr,&caddr_len);//
中caddr_len没有初始化为sizeof(SOCKADDR_IN);
Lactoferrin 2012-04-01
  • 打赏
  • 举报
回复
建议你找几个例子看一下
accept是在listen后用的,你没调用listen

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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