<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### select 模型 ***** 1.**fd_set** 是文件句柄的集合。??? ???? ?? **FD_ZERO** 清空這個集合;??? ?? **FD_SET** 往這個集合里面加入一個文件句柄;??? ?? **FD_ISSET** 查看某一個文件句柄是否被設置了; 'fd_set') 是一組文件描述符(fd)的集合。由于fd_set類型的長度在不同平臺上不同,因此應該用一組標準的宏定義來處理此類變量:???? fd_set set;???? ?**FD_ZERO**(&set);??????? /* 將set清零 */???? **FD_SET**(fd, &set);???? /* 將fd加入set */??? ? **FD_CLR**(fd, &set);???? /* 將fd從set中清除 */???? ?**FD_ISSET**(fd, &set);?? /* 如果fd在set中則真 */ ***** ### server代碼 ***** **server.cpp** ``` #include <stdio.h> #include <WinSock2.h>//必須放在windows.h前面 #include <Windows.h> #include <stdlib.h> #pragma comment(lib, "ws2_32.lib") fd_set g_fdClientSock; int clientNum = 0; DWORD WINAPI ListenThreadProc(LPARAM lparam) { fd_set fdRead; FD_ZERO(&fdRead); int nRet = 0; char *recvBuffer = (char*)malloc(1024); if (!recvBuffer) { return -1; } memset(recvBuffer, 0, 1024); while (TRUE) { fdRead = g_fdClientSock; timeval vt; vt.tv_sec = 0; vt.tv_usec = 0; nRet = select(0, &fdRead, 0,0,&vt);//會阻塞檢查集合中所有socket是否有信號 if (nRet != SOCKET_ERROR) { for (int i=0; i<g_fdClientSock.fd_count; i++) { if (FD_ISSET(g_fdClientSock.fd_array[i], &fdRead)) { memset(recvBuffer, 0, 1024); nRet = recv(g_fdClientSock.fd_array[i], recvBuffer, 1024, 0); if (nRet >0) { //todo: printf("接收到數據:%s", recvBuffer); send(g_fdClientSock.fd_array[i], recvBuffer, strlen(recvBuffer), 0); } else//如果接收失敗,則從集合中清除響應socket,并把客戶端數量減1 { closesocket(g_fdClientSock.fd_array[i]); clientNum--; FD_CLR(g_fdClientSock.fd_array[i], &g_fdClientSock); } } } } } if (recvBuffer) { free(recvBuffer); recvBuffer=nullptr; } return 0; } void main() { int port = 5099; WSADATA wsaData; if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock"); return; } //創建用于監聽的套接字 AF_INET:IPV4版本 SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); if (sockSrv == INVALID_SOCKET) { return; } //地址綁定-告訴操作系統是在哪一個地址及端口 SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(port); //1024以上的端口號,htons本地轉換為網絡數據 addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//電腦上所有的網絡ip int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN)); if(retVal == SOCKET_ERROR) { printf("綁定bind失敗:%d\n", WSAGetLastError()); return; } if(listen(sockSrv,5/*SOMAXCONN*/) ==SOCKET_ERROR) { printf("監聽listen失敗:%d", WSAGetLastError()); return; } SOCKADDR_IN addrClient;//用于獲取連接上來的人的地址信息 int len = sizeof(SOCKADDR); CreateThread(NULL,NULL, (LPTHREAD_START_ROUTINE)ListenThreadProc, NULL, NULL, NULL); while(clientNum < FD_SETSIZE) { //等待客戶請求到來 SOCKET clientSock = accept(sockSrv, (SOCKADDR *) &addrClient, &len); if(clientSock == SOCKET_ERROR) { printf("接收Accept失敗:%d", WSAGetLastError()); break; } else { printf("接收Accept到客戶端IP:[%s]\n", inet_ntoa(addrClient.sin_addr)); } FD_SET(clientSock, &g_fdClientSock);//添加到集合中去 clientNum++;//每次接收到一個人就+1,目前最多接收64個客戶 } closesocket(sockSrv); WSACleanup(); system("pause"); } ``` ### client 代碼 ***** **client.cpp** ``` // Tcp_client.cpp : 定義控制臺應用程序的入口點。 // #include <WinSock2.h> #include <stdio.h> #pragma comment(lib, "ws2_32.lib") void main() { //加載套接字 WSADATA wsaData; char buff[1024]; memset(buff, 0, sizeof(buff)); if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("Failed to load Winsock"); return; } SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(5099);//http默認端口 addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //創建套接字 SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); if(SOCKET_ERROR == sockClient){ printf("Socket() error:%d", WSAGetLastError()); return; } //向服務器發出連接請求 if(connect(sockClient, (struct sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET){ printf("Connect failed:%d", WSAGetLastError()); return; } int iRecvLen = 0; //發送數據 char* buffSend = "hello, this is a Client...."; iRecvLen = send(sockClient, buffSend, strlen(buffSend), 0); //接收數據 iRecvLen = recv(sockClient, buff, sizeof(buff), 0); printf("%s\n", buff); //關閉套接字 closesocket(sockClient); WSACleanup(); system("pause"); } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看