winsock select 學習代碼(1)

來源:互聯網
上載者:User

標籤:c   class   blog   a   tar   int   


// SelectCli.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include <winsock2.h>#include <conio.h>#pragma comment(lib,"ws2_32")#define SOCKET_MAXCNT64#define THREAD_NUM2//實驗代碼 與伺服器配合 不可改變連接線程數#define CONNECT_PORT8773#define CONNECT_ADDR"127.0.0.1"DWORD WINAPI SocketFunc(LPVOID pM) { SOCKETsock;char buf[100] = {0};int result;struct sockaddr_in cli_addr;int num = *(int*)pM;sock = socket(AF_INET,SOCK_STREAM,0);cli_addr.sin_family = AF_INET;cli_addr.sin_port = htons(CONNECT_PORT);cli_addr.sin_addr.s_addr = inet_addr(CONNECT_ADDR);result = connect(sock,(struct sockaddr*)&cli_addr,sizeof(cli_addr));if(result == SOCKET_ERROR){printf("%d thread: connect error\n",num);exit(1);}while(1){sprintf(buf,"%d thread: %s",num,"hello world!\n");printf(buf);result = send(sock,buf,100,0);if(result == SOCKET_ERROR){printf("2 ,%s\n","send error");}Sleep(3000);}exit(1);return 0;} int _tmain(int argc, _TCHAR* argv[]){int num[SOCKET_MAXCNT] = {0};WSADATAwsa_data;// 初始化數組 傳遞給線程 區別各個線程號for(int i = 0 ;i < SOCKET_MAXCNT;i++){num[i] = i;}WSAStartup(WINSOCK_VERSION,&wsa_data);for(int i = 0; i < THREAD_NUM;i++){HANDLE hThread1 = CreateThread(NULL,0,SocketFunc,&num[i],0,NULL);}while(1){Sleep(100000);}return 0;}
// SelectSrv.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include <winsock2.h>#include <conio.h>#pragma comment(lib,"ws2_32")#define SOCKET_MAXCNT64#define CONNECT_PORT8773#define CONNECT_ADDR"127.0.0.1"int _tmain(int argc, _TCHAR* argv[]){WSADATA wsa_data;fd_set read_all;SOCKETsrv_listen = INVALID_SOCKET;struct sockaddr_in srv_addr;int result,ready_cnt;int addr_len = sizeof(srv_addr);SOCKETrecv_sock[2] = {INVALID_SOCKET,INVALID_SOCKET};WSAStartup(MAKEWORD(2,2),&wsa_data);srv_listen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);srv_addr.sin_family = AF_INET;srv_addr.sin_port = htons(CONNECT_PORT);srv_addr.sin_addr.s_addr = INADDR_ANY;result = bind(srv_listen,(struct sockaddr*)&srv_addr,addr_len);if(result == SOCKET_ERROR){perror("err ");printf("line %d \n",__LINE__);return -1;}listen(srv_listen,SOMAXCONN);FD_ZERO(&read_all);FD_SET(srv_listen,&read_all);fd_set read_set;while(1){read_set = read_all;ready_cnt = select(0,&read_set,NULL,NULL,NULL);if(ready_cnt == SOCKET_ERROR){perror("err ");printf("line %d \n",__LINE__);return -1;}if(FD_ISSET(srv_listen,&read_set)) {struct sockaddr_in faddr;int addr_len = sizeof(faddr);static int sock_num = 0;if(sock_num > 1){perror("connect socket is too much\n ");printf("line %d \n",__LINE__);return -1;}recv_sock[sock_num] = accept(srv_listen,(struct sockaddr*)&faddr,&addr_len);if(recv_sock[sock_num] == INVALID_SOCKET){perror("err ");printf("line %d \n",__LINE__);return -1;}FD_SET(recv_sock[sock_num],&read_all);sock_num++;continue;}for(int i = 0 ; i < 2;i++){char buf[100] = {0};if(!FD_ISSET(recv_sock[i],&read_set)){continue;}result = recv(recv_sock[i],buf,100,NULL);if(result != SOCKET_ERROR){printf("recv thread .%s\n",buf);}}}getch();return 0;}

學習了下 winsock  下的select寫法

對於調用封裝好的各類庫  熟悉下原始寫法還是很有裨益的

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.