WinC/C++ Socket Server demo

简介: // WinServer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.

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

  3. #include "stdafx.h"
  4. // 告知编译器,在编译后的链接阶段可以链接“ws2_32.lib”
  5. #pragma comment(lib,"ws2_32.lib")

  6. #include stdio.h>
  7. #include WinSock2.h>
  8. //#include WinSock.h>
  9. #include stdlib.h>
  10. #include string.h>
  11. #include time.h>
  12. #include stdio.h>
  13. #include process.h>
  14. #include Windows.h>

  15. #define TEST_LISTEN_BACKLOG 0//1
  16. #define SERVER_PORT 4600 // define the defualt connect port id
  17. #define LENGTH_OF_LISTEN_QUEUE 10//1 // length of listen queue in server
  18. #define BUFFER_SIZE 255

  19. //void *thread(void *client_fd)
  20. DWORD WINAPI thread( LPVOID lpParam )
  21. {
  22.     char buf[BUFFER_SIZE] = {'\0'};
  23.     long timestamp;
  24.     
  25.     time_t rawtime;
  26.     struct tm *timeinfo;

  27.     while (1)
  28.     {
  29.         memset(buf, '\0', BUFFER_SIZE);
  30.         if (recv((*(int *)lpParam), buf, BUFFER_SIZE, 0) 0)
  31.         {
  32.             fprintf(stderr, "get message from client error\n");
  33.             closesocket(*(int *)lpParam);
  34.             break;
  35.         }

  36.         // Transmission
  37.         Sleep(1000);
  38.         strcat(buf, " : ");
  39.         time(&rawtime);
  40.         timeinfo = localtime(&rawtime);
  41.         strcat(buf,""+timeinfo->tm_sec);

  42.         puts(buf);
  43.         send((*(int *)lpParam), buf, strlen(buf), 0);
  44.     }
  45.     return NULL;
  46. }

  47. int _tmain(int argc, _TCHAR* argv[])
  48. {
  49.     int server_fd,client_fd;
  50.     struct sockaddr_in servaddr;
  51.     struct sockaddr_in client_addr;

  52.     WSADATA wsaD;
  53.     WSAStartup(MAKEWORD(2,2),&wsaD);
  54.     server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  55.     if(server_fd == SOCKET_ERROR)
  56.     {
  57.         printf("new socket error!");
  58.         getchar();
  59.         return -1;
  60.     }

  61.     /* two way for init the char array ....
  62.      bzero(&servaddr, sizeof(servaddr)); */
  63.     memset(&servaddr,0,sizeof(servaddr));

  64.     servaddr.sin_family = AF_INET;
  65.     servaddr.sin_port = htons(SERVER_PORT);
  66.     servaddr.sin_addr.s_addr = INADDR_ANY; //htons(INADDR_ANY);

  67.     int error = 0;
  68.     error = bind(server_fd, (struct sockaddr*)&servaddr, sizeof(servaddr));
  69.     if(error0)
  70.     {
  71.         printf("bind error");
  72.     }


  73.     listen(server_fd, LENGTH_OF_LISTEN_QUEUE);

  74. #if TEST_LISTEN_BACKLOG
  75.     /* wait the client to connect */
  76.     for (;;)
  77.     {
  78.         printf("server is listening! \n");
  79.         Sleep(1);
  80.     }
  81. #else
  82.     printf("server is listening! \n");
  83. #endif

  84.     while (1)
  85.     {
  86.         int length = sizeof(client_addr);
  87.         client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &length);
  88.         if(client_fd == -1)
  89.         {
  90.             Sleep(1000);
  91.             continue;
  92.         }

  93.         printf("a client connected: IP %s PORT %d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

  94.         Sleep(1000);
  95.         // windows C create thread ....
  96.         if(CreateThread(NULL,0,thread,(void*)&client_fd,0,NULL)==NULL)
  97.         {
  98.             fprintf(stderr, "create thread error\n");
  99.             exit(1);
  100.         }
  101.     }

  102.     closesocket(server_fd);
  103.     return 0;
  104. }

相关文章
|
2月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
57 6
|
7月前
|
存储 网络协议 Ubuntu
【C++网络编程】Socket基础:网络通讯程序入门级教程
【C++网络编程】Socket基础:网络通讯程序入门级教程
174 7
|
7月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
327 0
|
7月前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
244 7
|
6月前
|
缓存 网络协议 Linux
c++实战篇(三) ——对socket通讯服务端与客户端的封装
c++实战篇(三) ——对socket通讯服务端与客户端的封装
144 0
|
3月前
|
关系型数据库 MySQL 数据库
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’
220 0
|
5月前
|
前端开发 编译器 程序员
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
协程问题之为什么 C++20 的协程代码比其他语言的协程 demo 长很多如何解决
|
7月前
|
存储 网络协议 数据可视化
C++实现socket通信
了解如何实现socket通信以及TCP连接的过程中发生了什么
102 1
|
7月前
|
C++
C++实现Socket连接通信
C++实现Socket连接通信
60 1
|
7月前
|
XML C++ 数据格式
C++使用gSoap写Web Server和Web Client
C++使用gSoap写Web Server和Web Client
92 1