標籤:網路 stl inf 串連 oid family eth seve out
一、socket編程
先運行伺服器,本文採用線程來運行伺服器,再運行用戶端。
二、基本概念
ip:可唯一標識網路上的一個主機;
協議+連接埠:可唯一標識主機中一個進程;
所以通過IP+協議+連接埠三元組來標識主機中的進程。
三、編程實現
#pragma once#define WIN32#include<iostream>#include<stdio.h>#include "stdafx.h"#include<sys/types.h>#include<WS2tcpip.h>#pragma comment(lib, "ws2_32.lib")using namespace std;//typedef int(*DLLFunc)(int,int);//int是該方法形參的類型,有幾個參數就定義幾個。//typedef int(*DLLFunc2)();DWORD WINAPI ThreadFunc(HANDLE Thread){//HINSTANCE hInstLibrary = LoadLibrary(_T("E:\\V3.0\\建立檔案夾\\MyDll.dll"));//要寫清楚路徑,注意雙斜杠//if (GetLastError() != 0)//{//std::cout << GetLastError();//列印失敗資訊//}//if (hInstLibrary == NULL)//{//FreeLibrary(hInstLibrary);//return 0;//}//DLLFunc2 dllFunc3;//dllFunc3 = (DLLFunc2)GetProcAddress(hInstLibrary, "SocketSevert");//int i3 = dllFunc3();//cout << i3 << endl;//FreeLibrary(hInstLibrary);//伺服器端 0成功;22通訊端;3綁定;4監聽WORD sockVersion = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(sockVersion, &wsaData) != 0){printf("-3");//return -3;}// 建立通訊端點:通訊端int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){printf("伺服器建立通訊端失敗!\n");}else{printf("伺服器建立通訊端成功!\n");}struct sockaddr_in my_addr;my_addr.sin_family = AF_INET;my_addr.sin_port = htons(8888);my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//綁定int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));if (err_log != 0){printf("伺服器綁定失敗!\n");}else{printf("伺服器綁定成功!\n");}//監聽err_log = listen(sockfd, 10);if (err_log != 0){printf("伺服器監聽失敗!\n");}else{printf("伺服器監聽成功!\n");}Sleep(10);int i = 0;while (1){i++;struct sockaddr_in client_addr;char cli_ip[INET_ADDRSTRLEN] = "";socklen_t cliaddr_len = sizeof(client_addr);//成功返回一個新的socket檔案描述符,用於和用戶端通訊,失敗返回-1//表示三方握手完成,下一步伺服器調用accept()接受串連int connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len);if (connfd < 0){printf("accept第%d次失敗\n",i);continue;}else{printf("accept第%d次成功\n", i);}//接收資料char recv_buf[512] = { 0 };while (recv(connfd, recv_buf, sizeof(recv_buf), 0) > 0){i = sizeof(recv_buf);while (i--)printf("接收資料:\n%c\n",recv_buf[i]);}}return 0;}int main(){//DLLFunc2 dllFunc2;//// hdll=LoadLibraryEx("*.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH),若dll庫中有其他dll的調用,就使用此語句//HINSTANCE hInstLibrary = LoadLibrary(_T("E:\\V3.0\\建立檔案夾\\MyDll.dll"));//要寫清楚路徑,注意雙斜杠//if (GetLastError() != 0)//{//std::cout << GetLastError();//列印失敗資訊//}//if (hInstLibrary == NULL)//{//FreeLibrary(hInstLibrary);//return 0;//}//線程---伺服器HANDLE Thread;DWORD dwThreadId;Thread = ::CreateThread(NULL, 0, ThreadFunc, NULL, 0, &dwThreadId);//cout << "The new thread ID is :" << dwThreadId << endl;//用戶端WORD sockVersion = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(sockVersion, &wsaData) != 0){return -1;}SOCKET sockClient = NULL;SOCKADDR_IN addrSrv;//addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");inet_pton(AF_INET, "128.0.0.1", (void*)&addrSrv.sin_addr.S_un.S_addr);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(8888);//建立通訊端sockClient = socket(AF_INET, SOCK_STREAM, 0);if (sockClient < 0){printf("建立通訊端失敗!\n");}else{printf("建立通訊端成功!\n");}//網路連接if (connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)) == SOCKET_ERROR){printf("connect失敗!\n");}else{printf("網路連接成功!\n");char send_buf[12] = { 'c','d' };int nRecv = ::send(sockClient, send_buf, sizeof(send_buf), 0);if (nRecv < 0){printf("發送失敗!\n");}else{printf("發送成功!\n");}}//SocketConnect是DLL庫裡定義的方法//dllFunc2 = (DLLFunc2)GetProcAddress(hInstLibrary, "SocketConnect");//if (dllFunc2 == NULL)//{//FreeLibrary(hInstLibrary);//return 0;//}//int i2 = dllFunc2();//cout << i2 << endl;//FreeLibrary(hInstLibrary);::WaitForSingleObject(Thread, INFINITE);::CloseHandle(Thread);return 0;}
socket網路編程--基於windows