socket 客戶端長連線(C++)
阿新 • • 發佈:2019-01-06
#include "stdafx.h" #include <stdio.h> #include <Winsock2.h> #include <iostream> #pragma comment(lib, "ws2_32.lib") using namespace std; int main(int argc, char* argv[]) { const int BUF_SIZE = 64; WSADATA wsd; //WSADATA變數 SOCKET sHost; //伺服器套接字 SOCKADDR_IN servAddr; //伺服器地址 char buf[]="123456\n"; //接收資料緩衝區 char bufRecv[BUF_SIZE]; int retVal; //返回值 //初始化套結字動態庫 if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { cout << "WSAStartup failed!" << endl; return -1; } //建立套接字 sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(INVALID_SOCKET == sHost) { cout << "socket failed!" << endl; WSACleanup();//釋放套接字資源 return -1; } //設定伺服器地址 servAddr.sin_family =AF_INET; servAddr.sin_addr.s_addr = inet_addr("192.168.45.136"); servAddr.sin_port = htons(666); int nServAddlen = sizeof(servAddr); //連線伺服器 retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr)); if(SOCKET_ERROR == retVal) { cout << "connect failed!" << endl; closesocket(sHost); //關閉套接字 WSACleanup(); //釋放套接字資源 return -1; } fd_set wfds, rfds, efds; timeval tv; tv.tv_sec = 10; tv.tv_usec = 500; int count =-1; while(true) { FD_ZERO(&wfds); FD_ZERO(&rfds); FD_ZERO(&efds); FD_SET(sHost,&wfds); FD_SET(sHost,&rfds); FD_SET(sHost,&efds); int Rtn = select(FD_SETSIZE,&rfds,&wfds,&efds,&tv); if (Rtn>0) { if(FD_ISSET(sHost,&rfds)>0)//表示有讀的 { count = recv(sHost, bufRecv,BUF_SIZE , 0); } if (FD_ISSET(sHost,&wfds)>0)//表示可以寫 { if (count>0) { retVal = send(sHost, buf, strlen(buf), 0); if (SOCKET_ERROR == retVal) { cout << "send failed!" << endl; closesocket(sHost); //關閉套接字 WSACleanup(); //釋放套接字資源 return -1; } count = -1; } } if (FD_ISSET(sHost,&efds)>0)//表示有異常 { } } else { cout << "error1"; } } //退出 closesocket(sHost); //關閉套接字 WSACleanup(); //釋放套接字資源 printf("Hello World!\n"); return 0; }