欢迎来到windows编程的世界,先给我们的windows打个招呼吧:
网络编程1. 套接字编程基本知识
操作系统实验及代码(全),操作系统实验代码
操作系统是计算机相关专业的一门极其重要的专业课,但实验课的时候很多人不知道代码应该怎么写,这里贴出博主使用过的一部分,亲测可行。
#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 }
持续更新中!!!
作者:耑新新,发布于 博客园
转载请注明出处,欢迎邮件交流:[email protected]
操作系统是计算机相关专业的一门极其重要的专业课,但实验课的时候很多人不知道代码应…
#include
<iostream>
#include <Windows.h>
using namespace std;
并且需要使用静态链接库,
int main()
这里使用的是编译语句#pragma comment(lib,”ws2_32.lib”) 相当于将ws2_32.lib静态链接库加入到项目中,效果和添加引用是一样的。
{
ws2_32.lib对应的是ws2_32.dll,提供对于常见网络编程的API接口支持,使用其中的网络接口就需要将ws2_32.dll添加到工程,否则需要动态的加载ws2_32.dll。
int iSelect=MessageBox(NULL,TEXT(“你好,windows世界,我来了!”),TEXT(“你好,世界”),MB_【公海710登录网址】掌握Windows进程的创建和销毁API的调用方法,API来和操作系统交互的编程方式。OKCANCEL);
- WSAStartup 函数的介绍
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函数。
*cout<<“you select ok “<<endl*;
int WSAStartup(WORD wVersionRequest,
LPWSADATA lpWSAData);
}else
参数介绍:
{
wVersionRequest: 一个双字节数值, 使用MAKEWORD(2,2)生成;
*cout<<“you select cancel”<<endl*;
lpWSAData: 指向一个WSADATA的数据结构的指针,用于接收Windows Sockets实现的细节。
}
If the function return 0, 表示成功。
*system*(“pause”);
开启Windows Sock
Asynchronous,对应当程序结束的时候,就应该关闭,WSACleanup()用于接触于Socket库的绑定并且释放掉Socket库所占用的系统资源。
return 0;
3.常见的一些函数在WinSocket编程中使用的介绍
}
公海710登录网址,3.1 gethostname() // 获取本地主机的主机名
所谓windows编程就是指通过调用Windows
API来和操作系统交互的编程方式。API就是与操作系统交互的各种功能函数,MessageBox就是一个API,调用它就可以弹出一个对话框。
函数原型: int
PASCAL FAR gethostname( char FAR * name, int namelen);
Name:用于指向主机名缓冲区的指针,namelen: 缓冲区的大小。
Return Value:无错误的话,返回0,反之返回对应的错误代码。
#include <iostream>
#include <Windows.h>
using namespace std;
#pragma comment(lib,”ws2_www.710.com,32.lib”)
int main(){
WSADATA wsa ;//
WSADATA 结构是用来保存函数WSAStartup 返回的Windows
socket初始化信息
if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){
cout << “套接字初始化失败”<< endl;
Sleep(3000);
exit(-1);
}else{
cout << “套接字初始化成功” << endl;
}
char buf[255];
if( gethostname(buf,sizeof(buf)) ==
SOCKET_ERROR ){
cout << “获取本地主机的Name失败:”<<WSAGetLastError()<< SOCKET_ERROR <<
endl;
}else{
cout <<“本地主机的名字是:” << buf << endl;
}
WSACleanup();// 完成清理工作
return 0;
}
3.2获取主机的IP
gethostbyname(const char* name);
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*)的指针,然后再通过指针获取器内容,转换成为字符串的形式。
hostent* pht =
gethostbyname(“www.google.com”);
if(pht==NULL){
cout << WSAGetLastError() <<
endl;
}else{
//cout << AF_INET <<
endl;
cout << “h_addrtype:” <<
pht->h_addrtype << endl;
cout << “h_aliases:” <<
pht->h_aliases << endl;
cout << “h_length:” <<
pht->h_length << endl;
cout << “h_name:”<<
pht->h_name << endl;
for(int i = 0; pht->h_addr_list[i] !=
NULL;i++){
in_addr addr = *(in_addr*)
pht->h_addr_list[i];
cout <<inet_ntoa(addr) <<
endl;
}
}
#include <iostream>
#include <Windows.h>
#include <process.h>
using namespace std;
#pragma comment(lib,”ws2_32.lib”)
int main(){
WSADATA wsa ;//
WSADATA 结构是用来保存函数WSAStartup 返回的Windows
socket初始化信息
if(WSAStartup(MAKEWORD(2,1),&wsa) != 0){
cout << “套接字初始化失败”<< endl;
Sleep(3000);
exit(-1);
}else{
cout << “套接字初始化成功” << endl;
}
char buf[255];
if( gethostname(buf,sizeof(buf)) ==
SOCKET_ERROR ){
cout << “获取本地主机的Name失败:”<<WSAGetLastError()<< SOCKET_ERROR <<
endl;
}else{
cout <<“本地主机的名字是:” << buf << endl;
}
hostent* pht = gethostbyname(buf);
if(pht==NULL){
cout << WSAGetLastError() <<
endl;
}else{
//cout << AF_INET <<
endl;
cout << “h_addrtype:” <<
pht->h_addrtype << endl;
cout << “h_aliases:” <<
pht->h_aliases << endl;
cout << “h_length:” <<
pht->h_length << endl;
cout << “h_name:”<<
pht->h_name << endl;
for(int i = 0; pht->h_addr_list[i] !=
NULL;i++){
in_addr addr = *(in_addr*)
pht->h_addr_list[i];
cout << “IP:”
<<inet_ntoa(addr) << endl;
}
}
SOCKET serverSocket =
socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(serverSocket == INVALID_SOCKET){
cout << “创建套接字失败” << endl;
cout << WSAGetLastError() <<
endl;
Sleep(3000);
exit(-1);
}
sockaddr_in serverAddress;
int listen_port = 8999;
memset(&serverAddress,0,sizeof(serverAddress));
serverAddress.sin_family = AF_INET;
serverAddress.sin_port =
htons(listen_port);
serverAddress.sin_addr.S_un.S_addr =
htonl(INADDR_ANY);
if( bind(serverSocket,(sockaddr*)&serverAddress,
sizeof(serverAddress)) == SOCKET_ERROR){
cout << “绑定套接字端口失败” << endl;
cout << WSAGetLastError() <<
endl;
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;
}