vc socket api建立TCP连接(包括域名解析)并收发数据的代码模板
VC和服務器建立TCP連接不像VB的winsock那樣兩三行代碼就能搞定。雖然VC得MFC類庫中也有CSocket、CAsyncSocket這樣的類,但是這些類的毛病太多,還是返璞歸真用socket api來的靈活。
每次用到都得查一遍流程,這次寫個幾乎通用的模板,以備以后用。
注:
1.因為socket只能傳入IP地址,所以要想連接還得先解析域名,以下包括把域名解析為IP的代碼。
2.以下代碼為阻塞模式(并非異步模式)所以在主線程中使用很可能阻塞程序運行,最好是新開個線程使用。
?
?? int retVal;
?? WORD wVersionRequested;
?? WSADATA wsaData;
?? int err;
?
//構建保存版本號的WORD類型變量
?? wVersionRequested = MAKEWORD( 1, 1 );
?
//加載套接字庫
?? err = WSAStartup( wVersionRequested, &wsaData );
?? if ( err != 0 ) {
??? return 0;
?? }
?
//檢查加載的套接字庫版本和請求的是否一致
?? if ( LOBYTE( wsaData.wVersion ) != 1 ||
??? HIBYTE( wsaData.wVersion ) != 1 ) {
??? WSACleanup( );
??? return 0;
?? }
?? //定義DWORD類型變量dwIP 該變量保存解析得到的IP地址(32位整數 并非點分十進制字符串)
DWORD dwIP = 0;
?? //域名解析
?? HOSTENT* pHS = gethostbyname(strdomain);
?? if(?? pHS?? !=?? NULL)??
?? {??
??? in_addr addr;??
??? CopyMemory(&addr.S_un.S_addr, pHS->h_addr_list[0], pHS->h_length);??
??? dwIP = addr.S_un.S_addr;??
?? }
?? else
?? {
??? WSACleanup();
??? return 0;
?? }
?? //創建套接字,第一個參數是地址族 TCP/IP下始終為AF_INET,第二個參數表示流式套接字,第三個參數指定協議,0表示系統自選協議 而對于流式套接字 系統的自選協議就是TCP協議
SOCKET sckTongJi = socket(AF_INET, SOCK_STREAM, 0);
?? //定義地址結構體 并初始化
SOCKADDR_IN addrSvr;
?? addrSvr.sin_family = AF_INET;
?? addrSvr.sin_addr.S_un.S_addr = dwIP; //inet_addr("127.0.0.1"); //字符串轉十六進制IP用inet_addr反之用inet_ntoa
?? addrSvr.sin_port = htons(80); //使用網絡字序 不同處理器高位在前 還是 低位在前不相同 在這兒統一
?? retVal = connect(sckTongJi, (SOCKADDR*)&addrSvr, sizeof(SOCKADDR_IN));
?? if (retVal)
?? {
??? //AfxMessageBox("connect error!");
??? WSACleanup();
??? return 0;
?? }
?? char strbuff[4096];
?? memset(strbuff, 0, sizeof(strbuff));
?? send(sckTongJi, strout, strout.GetLength(), 0);
?? recv(sckTongJi, strbuff, 4096, 0);
?? closesocket(sckTongJi);
?? WSACleanup();
?
?
?
?
轉載于:https://www.cnblogs.com/huhu0013/archive/2010/12/02/1894098.html
總結
以上是生活随笔為你收集整理的vc socket api建立TCP连接(包括域名解析)并收发数据的代码模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 猜一猜: 以下哪座城市曾被徐霞客称为“极
- 下一篇: 全系标配旗舰屏!iQOO Neo8系列搭