欢迎来到windows编程的世界,先给我们的windows打个招呼吧:

网络编程1. 套接字编程基本知识

操作系统实验及代码(全),操作系统实验代码

操作系统是电脑有关标准的一门极其紧要的专业课,但实验课的时候很多个人不知晓代码应该怎么写,那里贴出博主使用过的一有的,亲测可行。 

偶们在其实的编程开发中,平时会赶上运行时惊慌失措找到某个DLL文件或者链接时不可以找到某个LIB文件。然后,大家就起初乱GOOGLE一下,然后将VS2005的安装改变一下,或许就Ok了,大家将外人付出的DLL或者LIB导入到大家的编程中,那么这么些lib,DLL到底是哪些呢?上面,偶就细细道来。 

#include
<Windows.h>

1.率先网络编程使用C++,要引入一些库

问题1:Windows进度的创立与销毁

立异时间:2017-10-26

内容及必要:


了解Windows进度的成立和销毁API的调用方法;编程代码,在先后中创设和销毁一个Word进程;

② 可以挂起和激活被创造进度的主线程;

③ 通过Windows进度管理器查看系统经过列表的变化。

实验指点:

①成立进度的API

BOOL CreateProcess(

  LPCTSTR lpApplicationName,

  LPTSTR lpCommandLine,

  LPSECURITY_ATTRIBUTES lpProcessAttributes,

  LPSECURITY_ATTRIBUTES lpThreadAttributes,

  BOOL bInheritHandles,

  DWORD dwCreationFlags,

  LPVOID lpEnvironment,

  LPCTSTR lpCurrentDirectory,

  LPSTARTUPINFO lpStartupInfo,

  LPPROCESS_INFORMATION lpProcessInformation

);

例程:

 1 void main( VOID ){
 2     STARTUPINFO si;
 3     PROCESS_INFORMATION pi;
 4     ZeroMemory( &si, sizeof(si) );
 5     si.cb = sizeof(si);
 6     ZeroMemory( &pi, sizeof(pi) );
 7     // Start the child process. 
 8     if( !CreateProcess( NULL, // No module name (use command line). 
 9         "MyChildProcess", // Command line. 
10         NULL,             // Process handle not inheritable. 
11         NULL,             // Thread handle not inheritable. 
12         FALSE,            // Set handle inheritance to FALSE. 
13         0,                // No creation flags. 
14         NULL,             // Use parent's environment block. 
15         NULL,             // Use parent's starting directory. 
16         &si,              // Pointer to STARTUPINFO structure.
17         &pi )             // Pointer to PROCESS_INFORMATION structure.
18         ) {
19             ErrorExit( "CreateProcess failed." );
20     }
21     // Wait until child process exits.
22     WaitForSingleObject( pi.hProcess, INFINITE );
23     // Close process and thread handles. 
24     CloseHandle( pi.hProcess );
25     CloseHandle( pi.hThread );
26 }

销毁进程API

BOOL TerminateProcess(

  HANDLE hProcess,

  UINT uExitCode

);

③ 挂起经过的主线程API

DWORD SuspendThread(

  HANDLE hThread

);

④激活进度的主线程API

DWORD ResumeThread(

  HANDLE hThread

);

⑤历程查看器

1 #include<iostream> 2 #include<windows.h> 3 using
namespace std; 4 void main( VOID ) 5 { 6 STARTUPINFO si; 7
PROCESS_INFORMATION pi; 8 /** 9 * 那里填个人的word可执行文件的路径
10 * ps:”\”需求开展转义 11 **/ 12 TCHAR
szCommandLine[]=TEXT(“D:\\Microsoft
Office\\Office14\\WINWORD.EXE”); 13 ZeroMemory(&si, sizeof(si) ); 14
si.cb= sizeof(si); 15 ZeroMemory(&pi, sizeof(pi) ); 16
if(!CreateProcess( NULL, szCommandLine, NULL,NULL, FALSE,0,NULL,
NULL,&si,&pi ) ) 17 { 18 fprintf(stderr,”进程创设战败!”); 19 } 20 int
x; 21 while(1) 22 { 23 cout <<
“请输入要选拔的操作:\n1:创造进程\n2:销毁进度\n3:挂起经过\n4:激活进度\n0:退出\n”;
24 cin >> x; 25 switch(x) 26 { 27 case 1: 28 if(CreateProcess(
NULL, szCommandLine, NULL,NULL, FALSE,0,NULL, NULL,&si,&pi ) ) 29
fprintf(stderr,”进度创设成功!”); 30 else 31 cout <<
“进程成立失利!”<<endl; 32 break; 33 case 2: 34
if(TerminateProcess(pi.hProcess,0)) 35
cout<<“销毁进度成功”<<endl; 36 else 37
cout<<“销毁战败!”<<endl; 38 break; 39 case 3: 40
if(SuspendThread(pi.hThread)) 41 cout<<“挂起进程成功”<<endl;
42 else 43 cout<<“挂起败北”<<endl; 44 break; 45 case 4: 46
if(ResumeThread(pi.hThread)) 47 cout<<“激活进度成功”<<endl;
48 else 49 cout<<“激活失利”<<endl; 50 break; 51 case 0: 52
exit(0); 53 default: 54 cout<<“输入有误不科学”<<endl; 55 }
56 } 57 }

 

纷来沓至更新中!!!

 

作者:耑新新,发布于  博客园

网络编程1,操作系统实验代码。转发请表明出处,欢迎邮件调换:[email protected]

操作系统是电脑有关标准的一门极其紧要的专业课,但实验课的时候很多个人不精通代码应…

第一,偶们说第四个:静态链接库(Static Libary)

#include
<iostream>

         #include <Windows.h>

偶们用VS2005做一个静态链接库先

using namespace  std;

         并且须求运用静态链接库,

打开VS2005,新建à项目(staticCai)àWin32控制台应用程序

int  main()

         那里运用的是编译语句#pragma comment(lib,”ws2_32.lib”) 相当于将ws2_32.lib静态链接库参加到项目中,效果和增加引用是同等的。

 

{

         ws2_32.lib相应的是ws2_32.dll,提供对于常见网络编程的API接口支持,使用其中的网络接口就须求将ws2_32.dll添加到工程,否则须求动态的加载ws2_32.dll。

新建static_lib.h 和static_lib.cpp 四个文本,那三个公文的始末如下:

       int iSelect=MessageBox(NULL,TEXT(“你好,windows世界,我来了!”),TEXT(“你好,世界”),MB_OKCANCEL);

  1. WSAStartup 函数的牵线

static_lib.h:

       if(iSelect==IDOK)

         WSAStartup是Windows SockNDs Asynchronous(Windows 异步套接字) 的启动命令, windows下的网络编程软件Winsock1,
Winsock2的一个发令。

 

       {

         WSAStartup函数落成对Winsock服务的伊始化,因而需求调用WSAStartup函数。使用Socket程序在选拔Socket此前务必调用WSAStartup函数。该函数的第四个参数表示程序请求使用的Socket版本,高字节表示副版本,低字节表示主版本;操作系统利用第一个参数重回请求的Socket的版本音信。当一个应用程序调用WSAStartup函数的时候,操作系统依照请求的Socket版本来搜索响应的Socket库,绑定到Socket库到应用程序中。在之后的程序中可以调用Socket库中的其余的socket函数。

int add(int x,int y);

              *cout<<“you select ok “<<endl*;

         int WSAStartup(WORD wVersionRequest,
LPWSADATA lpWSAData);

int substract(int x , int y);

       }else

         参数介绍:

 

       {

                  
wVersionRequest: 一个双字节数值, 使用MAKEWORD(2,2)生成;

static_lib.cpp:

              *cout<<“you select cancel”<<endl*;

                   lpWS金士顿: 指向一个WSADATA的数据结构的指针,用于收纳Windows Sockets完成的细节。

 

       }

         If the function return 0, 表示成功。

#include “static_lib.h”

       *system*(“pause”);

         开启Windows Sock
Asynchronous,对相应程序甘休的时候,就应当关闭,WSACleanup()用于接触于Socket库的绑定并且释放掉Socket库所占用的系统资源。

 

       return  0;

3.周边的有些函数在WinSocket编程中利用的介绍

int add(int x,int y)

}

3.1 gethostname() // 获取当地主机的主机名

{

   所谓windows编程就是指通过调用Windows
API来和操作系统交互的编程形式。API就是与操作系统交互的种种效用函数,MessageBox就是一个API,调用它就足以弹出一个对话框。

         函数原型: int
PASCAL FAR gethostname( char FAR * name, int namelen);

       return x + y;

        
Name:用于指向主机名缓冲区的指针,namelen: 缓冲区的深浅。

}

         Return Value:无不当的话,重回0,反之重临对应的错误代码。

 

#include <iostream>

int substract(int x,int y)

#include <Windows.h>

{

using namespace std;

       return x – y;

 

}

#pragma comment(lib,”ws2_32.lib”)

接下来编译,生成解决方案,好,那样不出意外会在debug文件夹(与staticCai并列)下生成一个staticCai.lib文件,好了,那么些就是大家做好的静态链接库。上边,我们看看怎么用那些静态链接库。我们再新建一个win32控制台程序,新建main.cpp内容如下:

int main(){

#include <iostream>

    WSADATA wsa ;//
WSADATA 结构是用来保存函数WSAStartup 重临的Windows
socket早先化信息

#include “static_lib.h”

    if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){

#pragma comment(lib, “static.lib”)

        cout << “套接字发轫化战败”<<  endl;

using namespace std ;

        Sleep(3000);

 

        exit(-1);

int main()

    }else{

{

        cout << “套接字伊始化成功” << endl;

       cout << add(3 ,4) << endl ;

    }

       cout << substract(5 , 3) << endl ;

 

       return 0 ;

    char buf[255];

}

 

并且将staticCai.lib和static_lib.h那八个公文拷贝到与main.cpp并列的文件夹下。然后,我们编译,链接,执行顺序,就会出结果了

    if( gethostname(buf,sizeof(buf)) ==
SOCKET_ERROR  ){

#pragma comment(lib,
“static.lib”)那句和大家在 项目à属性à连接器à添加重视项 的意义是一致的。至此,如何是好静态链接库以及怎么用静态链接库就搞定了。现在,大家把刚刚拷贝过来的staticCai.lib给删了,我们发现,程序依旧执行,不过无法再链接了。所以,大家得出那样的定论:大家再链接的时候需要静态链接库,一旦链接成功,生成了可执行文件,那么,静态链接库就不再须要了。

        cout << “获取当地主机的Name失利:”<<WSAGetLastError()<< SOCKET_ERROR <<
endl;

说不上,偶们说第一个:动态链接库(dynamic link Libary)

    }else{

一如既往,大家来做一个动态链接库,和地点的步调一样,先建工程,唯有最后一步稍有两样

        cout <<“本地主机的名字是:” << buf << endl;

 

    }

然后,新建Dll.cpp文件(那里大家就不做.h文件了),敲入一下情节:

    WSACleanup();// 完结清理工作

#define  DLL_API _declspec(dllexport)

    return 0;

#include <iostream>

}

using namespace std;

3.2获取主机的IP
gethostbyname(const char* name);

DLL_API int add(int a,int b)   //完结多个整数相加

hostent 是一个数据结构,保存从gethostbyname重返的音信,包涵主机的IP地址类型IPV4,IPV6,主机的别名,主机的IP长度,h_addr_list[]

澳门金沙国际,{

         须求利用in_addr 类型保存一个IP地址,并且需求将IP地址转换成为字符串的格式,使用的是const char * inet_ntoa(in_addr in); 将pht->h_addr_list[i] 转换成为(in_addr*)的指针,然后再经过指针获取器内容,转换成为字符串的情势。

       return a+b;

hostent* pht =
gethostbyname(“www.google.com”);

}

    if(pht==NULL){

DLL_API int subtract(int a,int b)   //落成三个整数相减

        cout << WSAGetLastError() <<
endl;

{

    }else{

       return a-b;

        //cout << AF_INET <<
endl;

}

        cout << “h_addrtype:” << 
pht->h_addrtype << endl;

接下来,大家编译,生成解决方案,就会在debug文件夹下生成dllCai.dll和dllCai.lib。好,至此,动态链接库就办好了,下面我们来看怎么用,新建一个win32控制台程序,新建main.cpp内容如下:

        cout << “h_aliases:” <<
pht->h_aliases << endl;

#include <iostream>

        cout << “h_length:” <<
pht->h_length << endl;

using namespace std ;

        cout << “h_name:”<<
pht->h_name << endl;

#pragma comment(lib, “DLL.lib”)

        for(int i = 0; pht->h_addr_list[i] !=
NULL;i++){

extern int add(int a,int b);

            in_addr addr = *(in_addr*)
pht->h_addr_list[i];

extern int subtract(int a,int b);

            cout <<inet_ntoa(addr) <<
endl;

int main()

        }

{

    }

       cout << add(3 ,4) << endl ;

 

       cout << subtract(5 , 3) << endl ;

#include <iostream>

       return 0 ;

#include <Windows.h>

}

#include <process.h>

下一场把dllCai.dll和dllCai.lib拷贝到与main.cpp并列的目录下。接着,编译,链接,执行,就会看到和上三遍一样的结果了。然后,大家把dllCai.lib给删了,程序如故执行,可是无法再链接了,接着,我们把dllCai.dll给删了,程序可以再编译,链接,不过举行的时候就黄了。所以,大家说:对于动态链接库,链接的时候须求.lib文件,运行的时候要求.dll文件。 

using namespace std;

由来,静态链接库和动态链接库大家就说完了,大家做一下相对而言和互补:

 

1 、 两个lib文件

 

俺们发现,无论是静态链接库如故动态链接库,最后都有lib文件,那么双方分别是什么吗?其实,多少个是全然不雷同的东西。staticCai.lib的尺寸为4KB,dllCai.lib的深浅为2KB,静态库对应的lib文件叫静态库,动态库对应的lib文件叫导入库。实际上静态库本身就包蕴了实在履行代码、符号表等等,而对此导入库而言,其实际的实施代码位于动态库中,导入库只含有了地点符号表等,确保程序找到呼应函数的部分中坚地址音讯。

 

2 、 对于静态链接库,我们在编译和链接的时候曾经将具有的代码都导入进来,由此,当生成可执行文件将来,可执行文件包括所有的代码。由此,在可执行文件运行时就不再须要静态库了,这也是干什么大家删掉staticCai.lib程序仍然执行;而对此动态链接库,实际上,可执行文件不含有DLL中的内容,只是通过导入库(.lib)知道了对应的地址音信,因此,可执行文件在运作时动态得去加载DLL,那也是干什么大家删掉dllCai.dll后先后就不能履行了。

#pragma comment(lib,”ws2_32.lib”)

3 、 对于DLL,大家是可以不要lib文件的。

 

一经不要lib文件,我们得以经过函数指针的利用达到我们的目标:

int main(){

#define  DLL_API _declspec(dllexport)

    WSADATA wsa ;//
WSADATA 结构是用来保存函数WSAStartup 再次来到的Windows
socket早先化音信

#include <iostream>

    if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){

using namespace std;   //注意那里的extern “C” , 这里不可不加

        cout << “套接字初叶化战败”<<  endl;

extern “C” DLL_API int add(int a,int b)   //完结七个整数相加

        Sleep(3000);

{

        exit(-1);

       return a+b;

    }else{

}

        cout << “套接字初阶化成功” << endl;

extern “C” DLL_API int subtract(int a,int b)   //完成三个整数相减

    }

{

 

       return a-b;

    char buf[255];

}

 

#include <iostream>

    if( gethostname(buf,sizeof(buf)) ==
SOCKET_ERROR  ){

#include <Windows.h>

        cout << “获取当地主机的Name失利:”<<WSAGetLastError()<< SOCKET_ERROR <<
endl;

using namespace std ;

    }else{

 

        cout <<“本地主机的名字是:” << buf << endl;

typedef int (*func)(int x , int y);  //函数指针

    }

int main()

   

{

    hostent* pht = gethostbyname(buf);

       HINSTANCE hInstance = LoadLibrary(“DLL.dll”);

    if(pht==NULL){

       if(hInstance == NULL)

        cout << WSAGetLastError() <<
endl;

       {

    }else{

              cout << “SB” << endl ;

        //cout << AF_INET <<
endl;

              return 0;

        cout << “h_addrtype:” << 
pht->h_addrtype << endl;

       }

        cout << “h_aliases:” <<
pht->h_aliases << endl;

       func add = (func)GetProcAddress(hInstance, “add”);

        cout << “h_length:” <<
pht->h_length << endl;

       func sub = (func)GetProcAddress(hInstance, “subtract”);

        cout << “h_name:”<<
pht->h_name << endl;

       cout << (*add)(3,4) << endl ;

        for(int i = 0; pht->h_addr_list[i] !=
NULL;i++){

       cout << (*sub)(5,3) << endl ;

            in_addr addr = *(in_addr*)
pht->h_addr_list[i];

}

            cout << “IP:”
<<inet_ntoa(addr) << endl;

显著,那种措施没有用lib文件方便,如果为了每便调用一个函数还要协调再弄一个函数指针,多劳累啊,所以,大家在其实支出中,用的许多的第三方扩充库,外人都是提供的:

        }

.h  文件(类,函数的扬言)

    }

.dll 文件(类或函数的落成)

 

.lib 文件(导入库)

    SOCKET serverSocket =
socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

 

    if(serverSocket == INVALID_SOCKET){

小结:

        cout << “创造套接字败北” << endl;

一、静态库

        cout << WSAGetLastError() <<
endl;

*
静态库是把程序运行时索要运用的函数编译在一个二进制文件中,伸张名为.lib。当程序link时把静态库中的二进制数据和顺序别的数据放到一起。程序运
行时不在必要lib和dll文件的协助。那样做的害处是付出出来的次第占用磁盘空间较大。尤其是windows系统中自然就有或很多程序运行都亟待的函数
完全没有要求每回开发顺序时都要动用各自的静态库。

        Sleep(3000);

* 静态库为.lib文件格局存在

        exit(-1);

*
链接后暴发的可执行文件包含了独具需要调用的函数的代码,因而占有磁盘空间较大

    }

*
假如有八个(调用相同库函数的)进程在内存中间时运行,内存中就存有多份相同的库函数代码,由此占有内存空间较多。

 

二、动态库

    sockaddr_in  serverAddress;

*
动态库在支付时仅是把dll中的函数名和参数放到应用程序中,应用程序运行时依据函数名和参数调用dll中的函数来运作,那样操作系统中的应用程序可以同
时利用同一个dll。可以使得地节约硬盘空间,当然如此做使得程序设计更有层次。也造福软件工程师的分工和新闻安全

    int listen_port = 8999;

*
动态库以.dl文件方式存在,且一般都有一个遥相呼应的引入库以.lib文件格局存在。纯资源dll不生成.lib引入库。

   
memset(&serverAddress,0,sizeof(serverAddress));

  
>引入库和静态库的增添名均为*.lib,但是引入库仅包蕴部分函数名和参数新闻,没有函数体,是为调用动态库服务的,它和动态库的涉及相当于.h文件和.cpp文件之间的关联;

    serverAddress.sin_family = AF_INET;

* 动态库二种绑定形式

    serverAddress.sin_port =
htons(listen_port);

   >静态绑定(static blnding)
使用静态绑定的主次在一开始载入内存的时候,载入程序就会把程序有所调用到的动态代码的地址算出、确定下来。那种方法使程序刚运行时的开头化时间较长,然则一但成功动态装载,程序的运作速度就很快。

    serverAddress.sin_addr.S_un.S_addr =
htonl(INADDR_ANY);

    2动态绑定(dynamic binding)  
使用这种格局的主次并不在一从头就完事动态链接,而是直到真正调用动态库代码时,载入程序才总结(被调用的那部分)动态代码的逻辑地址,然后等到某个时
候,程序又须要调用其余某块动态代码时,载入程序才又去总结那部分代码的逻辑地址。所以,那种办法侄程序早先化时间较短,但运行时期的属性比不上静态绑定
的程序。

 

* 使用动态库的两种艺术(windows)

    if( bind(serverSocket,(sockaddr*)&serverAddress,
sizeof(serverAddress)) == SOCKET_ERROR){

  >方法一: load-time dynamic linking 
在要调用dll的应用程序链接时,将dll的输入库文件(import
library,.lib文件)包涵进去。具体的做 法是在源文件开始加一句#include
,然后就足以在源文件中调用dlldemo.dll中的输出文件了。

        cout << “绑定套接字端口失利” << endl;

  >方法二: run-time dynamic linking 

        cout << WSAGetLastError() <<
endl;

不必在链接时带有输入库文件,而是在源程序中行使LoadLibrary或LoadLibraryEx动态的载入dll。

        Sleep(3000);

        exit(-1);

    }else{

        cout << “成功绑定端口:” << listen_port << endl;

    }

 

    if( listen(serverSocket,SOMAXCONN) ==
SOCKET_ERROR){

        cout <<“监听失利” << WSAGetLastError() << endl;

 

        Sleep(3000);

        exit(-1);

    }else{

        cout << “成功监听端口:”<< listen_port  << endl;

    }

 

   

   

 

    while(true){

        cout << “yang” << endl;

        SOCKET chatSocket;

        sockaddr_in clientAddress;

       
memset(&clientAddress,0,sizeof(clientAddress));

        int addrlen = sizeof(clientAddress);

        if( (chatSocket =
accept(serverSocket,(sockaddr*)&clientAddress,&addrlen))==
SOCKET_ERROR){

            cout << “接受连接失利” << WSAGetLastError()<< endl;

            continue;

        }else{

            cout << “接受来自” << inet_ntoa(clientAddress.sin_addr)
<<“的连接”<< endl;

        }

 

 

    }

 

    WSACleanup();// 完毕清理工作

    return 0;

}

相关文章