鱼C论坛

 找回密码
 立即注册
查看: 2721|回复: 2

关于Win32控制台下C的socket编程

[复制链接]
发表于 2012-4-12 12:42:40 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 稀薄_▍memory 于 2012-4-12 12:43 编辑

这个是服务端的代码
  1. // Win32Server.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include <WINSOCK2.H>
  5. #include <stdio.h>
  6. #pragma comment(lib,"ws2_32.lib")
  7. void main()
  8. {
  9. //创建套接字
  10. WORD myVersionRequest;
  11. WSADATA wsaData;
  12. myVersionRequest=MAKEWORD(1,1);
  13. int err;
  14. err=WSAStartup(myVersionRequest,&wsaData);
  15. if (!err)
  16. {
  17. printf("已打开套接字\n");

  18. }
  19. else
  20. {
  21. //进一步绑定套接字
  22. printf("嵌套字未打开!");
  23. return;
  24. }
  25. SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字
  26. //需要绑定的参数
  27. SOCKADDR_IN addr;
  28. addr.sin_family=AF_INET;
  29. addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址
  30. addr.sin_port=htons(6000);//绑定端口

  31. bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成
  32. listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数

  33. //////////////////////////////////////////////////////////////////////////
  34. //开始进行监听
  35. //////////////////////////////////////////////////////////////////////////
  36. SOCKADDR_IN clientsocket;
  37. int len=sizeof(SOCKADDR);
  38. while (1)
  39. {
  40. SOCKET serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听
  41. char sendBuf[100];
  42. sprintf(sendBuf,"welcome %s to bejing",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里
  43. send(serConn,sendBuf,strlen(sendBuf)+1,0);
  44. char receiveBuf[100];//接收
  45. recv(serConn,receiveBuf,strlen(receiveBuf)+1,0);
  46. printf("%s\n",receiveBuf);
  47. closesocket(serConn);//关闭
  48. WSACleanup();//释放资源的操作
  49. }
  50. }
复制代码

这个是客户端的代码

  1. // Win32Client.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include <WINSOCK2.H>
  5. #include <stdio.h>
  6. #pragma comment(lib,"ws2_32.lib")
  7. void main()
  8. {
  9. int err;
  10. WORD versionRequired;
  11. WSADATA wsaData;
  12. versionRequired=MAKEWORD(1,1);
  13. err=WSAStartup(versionRequired,&wsaData);//协议库的版本信息
  14. if (!err)
  15. {
  16. printf("客户端嵌套字已经打开!\n");
  17. }
  18. else
  19. {
  20. printf("客户端的嵌套字打开失败!\n");
  21. return;//结束
  22. }
  23. SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,0);
  24. SOCKADDR_IN clientsock_in;
  25. clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
  26. clientsock_in.sin_family=AF_INET;
  27. clientsock_in.sin_port=htons(6000);
  28. //bind(clientSocket,(SOCKADDR*)&clientsock_in,strlen(SOCKADDR));//注意第三个参数
  29. //listen(clientSocket,5);
  30. connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
  31. char receiveBuf[100];
  32. recv(clientSocket,receiveBuf,101,0);
  33. printf("%s\n",receiveBuf);
  34. char msg[100];
  35. sprintf(msg,"hello,this is client");
  36. send(clientSocket,msg,strlen(msg)+1,0);
  37. closesocket(clientSocket);
  38. WSACleanup();
  39. }




复制代码

问题是我启动服务端后,再启动客户端,接收都正常,而关闭了客户端以后,服务端仍然可以接受到客户端发的信息,这是为何?不是断开连接了吗?为什么服务端还能找到刚才的客户端?


最佳答案

查看完整内容

服务器端的这个循环,一次循环处理一个客户端。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-12 12:42:41 | 显示全部楼层
  1. 42.while (1)

  2. 43.{

  3. 44.SOCKET serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听

  4. 45.char sendBuf[100];

  5. 46.sprintf(sendBuf,"welcome %s to bejing",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里

  6. 47.send(serConn,sendBuf,strlen(sendBuf)+1,0);

  7. 48.char receiveBuf[100];//接收

  8. 49.recv(serConn,receiveBuf,strlen(receiveBuf)+1,0);

  9. 50.printf("%s\n",receiveBuf);

  10. 51.closesocket(serConn);//关闭

  11. 52.WSACleanup();//释放资源的操作

  12. 53.}
复制代码
服务器端的这个循环,一次循环处理一个客户端。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-12 18:40:07 | 显示全部楼层
一个客户端退出后,服务器开始新的一轮循环,将被语句
SOCKET serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);
阻塞住,知道有新的客户端连接进来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 13:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表