ZBLOG

#include #include #include #include #include #include #include #include #include #include #include #define ...

在Windows上实现相同功能的代码需要做一些修改,因为Windows使用不同的网络API(如Winsock)。以下是基于你提供的Linux代码转换后的Windows版本。

注意:这个示例仍然是一个基础版本,你可能需要根据具体情况进行优化和调整。请确保在Windows环境中包含winsock2.h和其他必要的头文件。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winsock2.h>
  5. #include <ws2tcpip.h>
  6. #include <errno.h>
  7. #include <time.h>
  8. #define MAX_BUFFER 128
  9. #define MAX_EPOLLSIZE (384*1024)
  10. #define MAX_PORT 100
  11. #define TIME_SUB_MS(tv1, tv2) ((tv1.tv_sec - tv2.tv_sec) * 1000 + (tv1.tv_usec - tv2.tv_usec) / 1000)
  12. int isContinue = 0;
  13. static int ntySetNonblock(SOCKET fd) {
  14. u_long mode = 1; // non-blocking mode
  15. return ioctlsocket(fd, FIONBIO, &mode);
  16. }
  17. static int ntySetReUseAddr(SOCKET fd) {
  18. int reuse = 1;
  19. return setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse));
  20. }
  21. int main(int argc, char **argv) {
  22. if (argc <= 2) {
  23. printf("Usage: %s ip port\n", argv[0]);
  24. exit(0);
  25. }
  26. const char *ip = argv[1];
  27. int port = atoi(argv[2]);
  28. int connections = 0;
  29. char buffer[MAX_BUFFER] = {0};
  30. WSADATA wsaData;
  31. if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
  32. printf("WSAStartup failed.\n");
  33. return -1;
  34. }
  35. struct sockaddr_in addr;
  36. memset(&addr, 0, sizeof(struct sockaddr_in));
  37. addr.sin_family = AF_INET;
  38. addr.sin_addr.s_addr = inet_addr(ip);
  39. struct timeval tv_begin;
  40. GetSystemTimeAsFileTime((FILETIME*)&tv_begin);
  41. while (1) {
  42. static int index = 0;
  43. if (++index >= MAX_PORT) index = 0;
  44. SOCKET sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  45. if (sockfd == INVALID_SOCKET) {
  46. perror("socket");
  47. break;
  48. }
  49. addr.sin_port = htons(port + index);
  50. if (connect(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
  51. perror("connect");
  52. closesocket(sockfd);
  53. continue;
  54. }
  55. ntySetNonblock(sockfd);
  56. ntySetReUseAddr(sockfd);
  57. sprintf(buffer, "Hello Server: client --> %d\n", connections);
  58. send(sockfd, buffer, strlen(buffer), 0);
  59. connections++;
  60. if (connections % 1000 == 999 || connections >= MAX_EPOLLSIZE) {
  61. GetSystemTimeAsFileTime((FILETIME*)&tv_cur);
  62. int time_used = TIME_SUB_MS(tv_cur.dwLowDateTime/10000ULL,
  63. tv_begin.dwLowDateTime/10000ULL);
  64. printf("connections: %d\n", connections);
  65. fd_set read_fds;
  66. FD_ZERO(&read_fds);
  67. FD_SET(sockfd,&read_fds);
  68. struct timeval timeout;
  69. timeout.tv_sec=1;
  70. timeout.tv_usec=0;
  71. if(select(sockfd+1,&read_fds,NULL,NULL,&timeout)>0){
  72. char rBuffer[MAX_BUFFER] = {0};
  73. recv(sockfd,rBuffer,sizeof(rBuffer)-1 ,NULL);
  74. printf("RecvBuffer:%s\n", rBuffer);
  75. if (!strcmp(rBuffer,"quit")) {
  76. isContinue=0;
  77. }
  78. close(sockfd); // Clean up
  79. }else{
  80. perror("recv failed");
  81. }
  82. }
  83. Sleep(1); // sleep for a short duration
  84. }
  85. WSACleanup();
  86. return 0;
  87. err:
  88. printf("error : %s\n", strerror(errno));
  89. return -1;
  90. }

注意事项:

  • 在编译时,请确保链接到 Winsock 库 (Ws2_32.lib)。
  • 使用 WSAStartupWSACleanup 初始化和清理 Winsock。
  • Windows 中没有 epoll,因此我们使用了 select 来处理 IO 多路复用。
  • 使用 Sleep() 而不是 usleep() 来替代 Linux 的毫秒级睡眠函数。

确保在Windows系统中测试此代码并根据你的需求进一步优化!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20129

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?