Chinaunix首页 | 论坛 | 博客
  • 博客访问: 320
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-04 21:27
文章分类

全部博文(1)

文章存档

2015年(1)

我的朋友
最近访客

分类: C/C++

2015-08-04 21:44:23


点击(此处)折叠或打开

  1. /* TCPServer.cpp - main */

  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <winsock2.h>
  5. #include <time.h>
  6. #include "conio.h"
  7. #include <windows.h>
  8. #include <process.h>

  9. #define QLEN     5
  10. #define    WSVERS    MAKEWORD(2, 0)
  11. #define MAXSSOCKCNT 20000
  12. #define BUFLEN 2000
  13. #define BUFCNT 20

  14. #pragma comment(lib,"ws2_32.lib") // π”√winsock 2.2 library

  15. struct strussock{
  16.     SOCKET sock; // ??Ω”?÷
  17.     struct sockaddr_in fsin; // ”√????÷∑
  18.     char buffer[BUFCNT][BUFLEN+1]; // ?÷∑????∫≥???
  19.     int bufcnt; // ?∫≥??? ???
  20.     int bufptr; // ÷∏????“???“?∑??????∫≥???
  21.     HANDLE hSemaphore; // ??÷?∑?????–≈∫≈??
  22.     bool isExit; // ±? ?”√?? ?∑?“—??≥?
  23.     CRITICAL_SECTION cs; // ??Ω???
  24.     int len;
  25. }sockets[MAXSSOCKCNT];

  26. HANDLE handles[500][2];
  27. int clientCount = 0; //”√”???????????”√?? ???
  28. /*------------------------------------------------------------------------
  29.  * main - Iterative TCP server for TIME service
  30.  *------------------------------------------------------------------------
  31.  */

  32. unsigned _stdcall MyRecv(void * p)
  33. {
  34.     strussock *newP = (strussock *)p; // ÷∏???±?∞?¨Ω”??Ω·ππ????÷∏’?
  35.     struct sockaddr_in fsin = newP->fsin;
  36.     char rBuf[BUFLEN + 1]; // ∑??????”??????Ω” ??????????÷∑???
  37.     char *pts;
  38.     char port[10];
  39.     time_t now; // ”√”??????±?∞ ±?‰
  40.     int rLen; // ????Ω” ??÷∑???≥§??
  41.     
  42.     while(1){
  43.         rLen = recv(newP->sock, rBuf, BUFLEN, 0);
  44.         itoa(newP->fsin.sin_port,port,10);

  45.         newP->len = rLen;
  46.         (void) time(&now); // ?°?√???≥ ±?‰
  47.         pts = ctime(&now); // ∞— ±?‰???????÷∑???
  48.         
  49.         if(rLen == SOCKET_ERROR || rLen == 0){ //∑??÷”–”√????≥? ±??????
  50.             clientCount--; //”√?? ???“?∏?
  51.             EnterCriticalSection(&newP->cs);
  52.             
  53.             int ptr = (newP->bufptr + newP->bufcnt) % BUFCNT; // ??????“?∏??’?∫≥???????÷√
  54.             if(newP->bufcnt + 1 > BUFCNT){} // ?‘?∫≥???“?≥?????????????’????π√???≥…?????©
  55.             
  56.             newP->isExit = 1; // …?÷√”√????≥?±? ???’?
  57.             
  58.             sprintf(newP->buffer[ptr], "”√??ip: %s ”√??port: %s %s ??????.\n",
  59.                     inet_ntoa(fsin.sin_addr), port, pts); // ??Ω”??’???????”√??IP+ ±?‰+?????©
  60.             printf("%s", newP->buffer[ptr]); // ‰≥??Ω∑??????∞??
  61.             newP->bufcnt = newP->bufcnt+1; // ?∫≥??? ????”“?
  62.             
  63.             LeaveCriticalSection(&newP->cs);
  64.             ReleaseSemaphore(newP->hSemaphore, 1, NULL);
  65.             break;
  66.         }
  67.         else if(rLen > 0) {
  68.             EnterCriticalSection(&newP->cs);
  69.             
  70.             int ptr = (newP->bufptr + newP->bufcnt) % BUFCNT;
  71.             if(newP->bufcnt + 1 > BUFCNT){}
  72.             
  73.             memcpy(newP->buffer[ptr], rBuf, rLen);
  74.             
  75.             newP->bufcnt = newP->bufcnt+1;
  76.             
  77.             LeaveCriticalSection(&newP->cs);
  78.             ReleaseSemaphore(newP->hSemaphore, 1, NULL);
  79.         }
  80.     }
  81.    // delete newP; // ?∑≈–?Ω?struParam±‰??
  82.     return 0;
  83. }

  84. unsigned _stdcall MySend(void * p)
  85. {
  86.     strussock *newP = (strussock *)p;
  87.     while (!newP->isExit) {
  88.         WaitForSingleObject(newP->hSemaphore, INFINITE);
  89.         
  90.         EnterCriticalSection(&newP->cs);
  91.         
  92.         for(int i = 0; i < MAXSSOCKCNT; i++){ //∑????Ω??”–??????
  93.             if(sockets[i].sock != NULL) {
  94.                 char msg[BUFLEN+1];
  95.                 memcpy(msg, newP->buffer[newP->bufptr], newP->len);
  96.                 (void) send(sockets[i].sock, msg, newP->len, 0);
  97.             }
  98.         }
  99.         newP->bufcnt = newP->bufcnt - 1; // ∑???“???????∫??∫≥??? ?????“?
  100.         newP->bufptr = (newP->bufptr + 1) % BUFCNT; // ÷∏????“?????÷∏’???∫?“?“???
  101.         
  102.         LeaveCriticalSection(&newP->cs);
  103.     }
  104.     newP->sock = NULL;
  105.     return 0;
  106. }

  107. void
  108. main(int argc, char *argv[])
  109. /* argc: √???––≤? ?∏? ??¨ ?????∫C:\> TCPServer 8080
  110.                      argc=2 argv[0]="TCPServer",argv[1]="8080" */
  111. {
  112.     struct    sockaddr_in fsin;     /* the from address of a client     */
  113.     SOCKET    msock, ssock;         /* master & slave sockets     */
  114.     WSADATA wsadata;
  115.     char    *service = "60000";
  116.     struct sockaddr_in sin;     /* an Internet endpoint address        */
  117.     int     alen;             /* from-address length         */
  118.     char    *pts;             /* pointer to time string     */
  119.     time_t    now;             /* current time             */


  120.     WSAStartup(WSVERS, &wsadata);                        // ?”‘?winsock library°?WSVERS÷∏√????? π”√??∞?±?°?wsadata∑??????≥ ?? ÷?≥÷????∏?∞?±?
  121.     msock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);    // ??Ω???Ω”?÷?¨≤? ??∫“?????–≠“???(family)?¨????Ω”?÷?¨TCP–≠“?
  122.                                                         // ∑????∫“???????Ω”?÷??√? ?∑???INVALID_SOCKET

  123.     memset(sockets,NULL,sizeof(sockets));
  124.     memset(&sin, 0, sizeof(sin));                        // ?”&sin?? ???≥§????sizeof(sin)????????0
  125.     sin.sin_family = AF_INET;                            // “???????÷∑??(INET-Internet)
  126.     sin.sin_addr.s_addr = INADDR_ANY;                    // ??????”–(Ω”????)IP??÷∑°?
  127.     sin.sin_port = htons((u_short)atoi(service));        // ??????????∫≈°?atoi--∞—ascii??????int?¨htons--÷??˙–??Ω????–?(16??)
  128.     bind(msock, (struct sockaddr *)&sin, sizeof(sin)); // ∞?????????IP??÷∑∫?????∫≈

  129.     listen(msock, 5); // ????Ω????¨Ω”???”?–≥§????5

  130.     while(!_kbhit()){          // ??≤? ?∑?”–∞???
  131.         alen = sizeof(struct sockaddr); // ?°?Ω??÷∑Ω·ππ??≥§??
  132.      ssock = accept(msock, (struct sockaddr *)&fsin, &alen); // ??π?”––????¨Ω”?????¨∑????¨Ω”??Ω”?÷?¨∑?‘??¨±?????°?fsin∞?∫¨??????IP??÷∑∫?????∫≈
  133.         int i = 0;
  134.         while(1){
  135.             if(sockets[i].sock == NULL){
  136.                 sockets[i].sock = ssock;
  137.                 sockets[i].fsin = fsin;
  138.                 sockets[i].bufcnt = 0;
  139.                 sockets[i].bufptr = 0;
  140.                 sockets[i].isExit = 0;
  141.                 sockets[i].hSemaphore = CreateSemaphore(NULL,0,1,NULL);
  142.                 sockets[i].cs = CRITICAL_SECTION();
  143.                 InitializeCriticalSection(&(sockets[i].cs));
  144.                 break;
  145.             }
  146.             i++;
  147.         }
  148.         clientCount++;
  149.         strussock *asock;
  150.         asock = &sockets[i];
  151.         unsigned threadId;
  152.         handles[i][0] = (HANDLE)_beginthreadex(NULL, 0, &MyRecv, (void *)asock, 0, NULL);
  153.         handles[i][1] = (HANDLE)_beginthreadex(NULL, 0, &MySend, (void *)asock, 0, NULL);
  154.      }

  155.     (void) closesocket(msock); // π?±’??????Ω”?÷
  156.      WSACleanup(); // –?‘?winsock library

  157. }

点击(此处)折叠或打开

  1. /* TCPClient.cpp */

  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <winsock2.h>
  5. #include <time.h>
  6. #include <string.h>
  7. #include <process.h>

  8. #define    BUFLEN        2000 // ???????ó??
  9. #define WSVERS        MAKEWORD(2, 0) // ???÷°?±?2.0
  10. #pragma comment(lib,"ws2_32.lib") // ????winsock 2.0 Llibrary

  11. /*------------------------------------------------------------------------
  12.  * main - TCP client for TIME service
  13.  *------------------------------------------------------------------------
  14.  */

  15. CRITICAL_SECTION cs;

  16. unsigned __stdcall MyRecv(void *p)
  17. {
  18.     SOCKET *newP = (SOCKET *)p; // ?????à??×???
  19.     char    pts[BUFLEN+1];
  20.     while(true)
  21.     {
  22.         EnterCriticalSection(&cs);
  23.         int rLen = recv(*newP, pts, BUFLEN, 0); // cc??????????×?·???????(>0)?ò??·?????±?(=0)?ò???????í(<0)
  24.         LeaveCriticalSection(&cs);
  25.         if(rLen == SOCKET_ERROR || rLen==0)
  26.         {
  27.             printf("Error: %d.\n",GetLastError()); //???í?????ó±?????±??×??×?sock??
  28.   &nb
阅读(77) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~