Socket的最简单TCP服务器问题

tastynoodle 2012-11-24 05:32:59
初学Socket,书上举的是Socket写TCP的服务端和客户端。
客户端的代码不重要,下面是服务端的代码:

int main()
{
WSADATA data;
WORD w = MAKEWORD(2, 0);
char sztext[] = "Welcome\r\n";
WSAStartup(w, &data);
SOCKET s, s1;
s = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr, addr2;
int n = sizeof(addr2);
addr.sin_family = AF_INET;
addr.sin_port = htons(1025);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
bind(s, (sockaddr*)&addr, sizeof(addr));
listen(s, 5);
printf("服务端已启动\r\n");
while(true)
{
s1 = accept(s, (sockaddr*)&addr2, &n);
if (s1 != NULL)
{
printf("%s connected\r\n", inet_ntoa(addr2.sin_addr));
send(s1, sztext, sizeof(sztext), 0);
}
closesocket(s);
closesocket(s1);
WSACleanup();
if (getchar())
{
return 0;
}
else
{
Sleep(100);
}
}
}

先运行服务端再运行客户端的话就会显示通信成功。
小弟有个疑问,就是红色的那行代码,当第1次运行while循环时若客户端还未连接,那么就会运行closesocket(s),那么到第2次运行while循环时,为什么accept还是能调用成功呢?
...全文
96 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tastynoodle 2012-11-24
  • 打赏
  • 举报
回复
引用 2 楼 WUDAIJUN 的回复:
你试着不关闭服务器 多运行几次客户端 应该就会出问题了。 既然用了while(true) 自然是想随时接受客户端请求 但是你却在接受到第一个客户端请求后关闭监听套接字了。 之后的客户端的连接和服务器的接受都会出问题
我搞懂了,是阻塞的问题...谢谢了。
wudaijun 2012-11-24
  • 打赏
  • 举报
回复
你试着不关闭服务器 多运行几次客户端 应该就会出问题了。 既然用了while(true) 自然是想随时接受客户端请求 但是你却在接受到第一个客户端请求后关闭监听套接字了。 之后的客户端的连接和服务器的接受都会出问题
wudaijun 2012-11-24
  • 打赏
  • 举报
回复
你那个代码有问题吧。连接一次就关闭监听套接字了。你测试都没出错?

64,676

社区成员

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

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