socket网络编程--基于windows
一、socket编程
先运行服务器,本文采用线程来运行服务器,再运行客户端。
二、基本概念
ip:可唯一标识网络上的一个主机;
协议+端口:可唯一标识主机中一个进程;
所以通过IP+协议+端口三元组来标识主机中的进程。
三、编程实现
#pragmaonce#defineWIN32#include<iostream>#include<stdio.h>#include"stdafx.h"#include<sys/types.h>#include<WS2tcpip.h>#pragmacomment(lib,"ws2_32.lib")usingnamespacestd;//typedefint(*DLLFunc)(int,int);//int是该方法形参的类型,有几个参数就定义几个。//typedefint(*DLLFunc2)();DWORDWINAPIThreadFunc(HANDLEThread){//HINSTANCEhInstLibrary=LoadLibrary(_T("E:\\V3.0\\新建文件夹\\MyDll.dll"));//要写清楚路径,注意双斜杠//if(GetLastError()!=0)//{//std::cout<<GetLastError();//打印失败信息//}//if(hInstLibrary==NULL)//{//FreeLibrary(hInstLibrary);//return0;//}//DLLFunc2dllFunc3;//dllFunc3=(DLLFunc2)GetProcAddress(hInstLibrary,"SocketSevert");//inti3=dllFunc3();//cout<<i3<<endl;//FreeLibrary(hInstLibrary);//服务器端0成功;22套接字;3绑定;4监听WORDsockVersion=MAKEWORD(2,2);WSADATAwsaData;if(WSAStartup(sockVersion,&wsaData)!=0){printf("-3");//return-3;}//创建通信端点:套接字intsockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0){printf("服务器创建套接字失败!\n");}else{printf("服务器创建套接字成功!\n");}structsockaddr_inmy_addr;my_addr.sin_family=AF_INET;my_addr.sin_port=htons(8888);my_addr.sin_addr.s_addr=htonl(INADDR_ANY);//绑定interr_log=bind(sockfd,(structsockaddr*)&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);inti=0;while(1){i++;structsockaddr_inclient_addr;charcli_ip[INET_ADDRSTRLEN]="";socklen_tcliaddr_len=sizeof(client_addr);//成功返回一个新的socket文件描述符,用于和客户端通信,失败返回-1//表示三方握手完成,下一步服务器调用accept()接受连接intconnfd=accept(sockfd,(structsockaddr*)&client_addr,&cliaddr_len);if(connfd<0){printf("accept第%d次失败\n",i);continue;}else{printf("accept第%d次成功\n",i);}//接收数据charrecv_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]);}}return0;}intmain(){//DLLFunc2dllFunc2;////hdll=LoadLibraryEx("*.dll",NULL,LOAD_WITH_ALTERED_SEARCH_PATH),若dll库中有其他dll的调用,就使用此语句//HINSTANCEhInstLibrary=LoadLibrary(_T("E:\\V3.0\\新建文件夹\\MyDll.dll"));//要写清楚路径,注意双斜杠//if(GetLastError()!=0)//{//std::cout<<GetLastError();//打印失败信息//}//if(hInstLibrary==NULL)//{//FreeLibrary(hInstLibrary);//return0;//}//线程---服务器HANDLEThread;DWORDdwThreadId;Thread=::CreateThread(NULL,0,ThreadFunc,NULL,0,&dwThreadId);//cout<<"ThenewthreadIDis:"<<dwThreadId<<endl;//客户端WORDsockVersion=MAKEWORD(2,2);WSADATAwsaData;if(WSAStartup(sockVersion,&wsaData)!=0){return-1;}SOCKETsockClient=NULL;SOCKADDR_INaddrSrv;//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");charsend_buf[12]={'c','d'};intnRecv=::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);//return0;//}//inti2=dllFunc2();//cout<<i2<<endl;//FreeLibrary(hInstLibrary);::WaitForSingleObject(Thread,INFINITE);::CloseHandle(Thread);return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。