亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問在網絡編程中select函數如何接受一個accept事件?

請問在網絡編程中select函數如何接受一個accept事件?

一只甜甜圈 2019-09-20 15:14:25
網絡編程中select函數如何接受一個accept事件
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

#include <winsock.h>

#include <stdio.h>

#define PORT       5150 //端口

#define MSGSIZE    1024 //信息大小

#pragma comment(lib, "ws2_32.lib")

int    g_iTotalConn = 0; //連接數量

SOCKET g_CliSocketArr[FD_SETSIZE]; //套接字數組

DWORD WINAPI WorkerThread(LPVOID lpParameter);//線程函數

int main()

{

  WSADATA     wsaData;

  SOCKET      sListen, sClient;

  SOCKADDR_IN local, client;

  int         iaddrSize = sizeof(SOCKADDR_IN);

  DWORD       dwThreadId;

  // Initialize Windows socket library

  //裝載套接字庫

  WSAStartup(0x0202, &wsaData);

  // Create listening socket

  //創建套接字

  sListen = socket(AF_INETSOCK_STREAMIPPROTO_TCP);

  // Bind

  //綁定

  local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

  local.sin_family = AF_INET;

  local.sin_port = htons(PORT);

  bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));

  // Listen

  //監聽

  listen(sListen, 3);

  // Create worker thread

  //創建線程

  CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId); 

 

  while (TRUE)

  {

    // Accept a connection

    //接受一個連接,返回的是客戶套的套接字

    sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);

    //這里client的SOCKADDR_IN  client 中可以取出IP

    printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));

    // Add socket to g_CliSocketArr

    //把客戶端套接字放入數組中

    g_CliSocketArr[g_iTotalConn++] = sClient;

  }

  

  return 0;

}


DWORD WINAPI WorkerThread(LPVOID lpParam)//線程

{

  int            i;

  fd_set         fdread;//結構

  int            ret;

  struct timeval tv = {1, 0};//超時時間 SELECT模型中用到的這里是1秒

  char           szMessage[MSGSIZE];//信息數組,事實上就是個緩沖區

  

  while (TRUE)

  {

   

    FD_ZERO(&fdread);//清空fd_set結構

    for (i = 0; i < g_iTotalConn; i++)

    {

      FD_SET(g_CliSocketArr[i], &fdread);//把客戶套接字放到SELECT要求的數組中

    }

    //**************************************

    // We only care read event

    //只關心讀的情況

    ret = select(0, &fdread, NULL, NULL, &tv);

    if (ret == 0)

    {

      // Time expired 超時

      continue;

    }

    //如果SELECT返回不是0

    for (i = 0; i < g_iTotalConn; i++)

    {

      if (FD_ISSET(g_CliSocketArr[i], &fdread))

      {

        // A read event happened on g_CliSocketArr[i]

        //一個可讀發生在這個套接字上

        ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0);

        //把它讀出到緩沖區

      if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))

      {

      // Client socket closed

      //客戶端關閉

          printf("Client socket %d closed.\n", g_CliSocketArr[i]);

         closesocket(g_CliSocketArr[i]);//關閉這個套接字

     

        if (i < g_iTotalConn - 1)

            { 

              //將數組中最后一個套接字挪到當前的位置上           

              g_CliSocketArr[i--] = g_CliSocketArr[--g_iTotalConn];

            }

        }

      else

       {

       // We received a message from client

       //如果以上沒發生,那么就接收到一個客戶端的信息

          szMessage[ret] = '\0';

        //直接回送回去

          send(g_CliSocketArr[i], szMessage, strlen(szMessage), 0);

         }

       }

     }

  }

  

  return 0;

}

1





查看完整回答
反對 回復 2019-09-22
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

怎么在VS2005里面調試socket函數
一個VS2005 無法調試C++的問題
現象:在vs2005 中,建立一個空項目,添加一個c++文件main.cpp
#include iostream
using namespace std;int main(){cout hello ;}此時按f5 啟動調試,即會提示項目無法調試:無法找到“xxx.exe”的調試信息,或者調試
信息不匹配。未使用調試信息生成二進制文件。
搜了一些資料,都說建立項目的時候不應建立空項目,而應當建立一個console application。
人寫到。 其實問題在于,在空項目中不生成調試文件pdb,所以無法調試。
要讓項目生成pdb 文件,需要更改:
項目屬性,configuration properties- linker- Generate Debug Info 從 no 改為 yes
但這樣還是不夠的,還需要更改:


查看完整回答
反對 回復 2019-09-22
  • 3 回答
  • 0 關注
  • 610 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號