|
|
2010年5月21日
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。
头文件:sys/types.h、sys/ipc.h、sys/msg.h
消息结构定义:
struct my_message{
long int message_type;
....
}
1.msgget函数
int msgget(key_t key, int msgflag);
key:键值。不重复即可,IPC_PRIVATE(一般不用)。
msgflag:IPC_CREAT(一般)、IPC_EXCL、IPC_NOWAIT或三者的或结果。
调用返回:成功返回消息队列描述字,否则返回-1。
2.msgsnd函数
int msgsnd(int msqid, const void *msg_ptr, int msg_sz, int msgflg);
msqid:msgget返回的消息队列标识符。
msg_ptr:指向准备发送消息的指针。
msg_sz:msg_ptr指向的消息的长度。
msgflag:在消息队列没有足够空间容纳要发送的消息时:IPC_NOWAIT指明立即返回,不发送消息并返回值为-1;若IPC_NOWAIT标志被清除,则发送进程挂起以等待队列中腾出可用空间。
调用返回:成功返回0,否则返回-1。
3.msgrcv函数
int msgrcv(int msqid, void *msg_ptr, int msg_sz, long msgtype, int msgflg); msqid:msgget返回的消息队列标识符。 msg_ptr:指向准备接收消息的指针。
msg_sz:msg_ptr指向的消息的长度。
msgtype:请求读取的消息类型。0:队列中第一个可用消息;>0:相同消息类型的第一个消息;<0:类型等于或小于msgtype绝对值的消息。
msgflag:在消息队列没有没有相应类型的消息可以接受时:IPC_NOWAIT指明立即返回,返回值为-1;若IPC_NOWAIT标志被清除,则发送进程挂起以等待第一条相同类型的消息到达。
调用返回:成功返回读出消息的实际字节数,否则返回-1。
4.msgctl函数
int msgctl(int msqid, int command, struct msqid_ds *buf);
msqid:msgget返回的消息队列标识符。
command:采取的动作。
IPC_STAT:该命令用来获取消息队列信息,返回的信息存贮在buf指向的msqid结构中;
IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf指向的msqid结构中;可设置属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。
IPC_RMID:删除msqid标识的消息队列;
2010年5月11日
本人喜爱玩游戏,读研之前一直玩的是单机游戏,从没玩过角色扮演网络游戏。直到去年9月偶然玩起了DNF这样一款网游,一发不可收拾玩到现在还没收手。说来惭愧,玩了大半年大半部分时间是在玩外挂。
可能是我对外挂比对游戏本身更感兴趣吧。从开始买人家的外挂,到后来完全用上了免费挂,自己也能整出部分功能来。应该说对外挂有了一定的了解。
据我了解,外挂可分为两种类型:一种是内存修改型(如强大的GE),另一种是网络封包编辑型(WPE)。
内存修改器是直接修改游戏内存达到修改游戏效果的目的。这里需要两种代码:源代码和地址代码。源代码是指内存里实际内容,以十进制表示。地址代码即是内存地址,以十六进制表示。源代码是固定不变的,而地址代码经常随着游戏的更新而常需要更新。将地址代码的内容修改为源代码,外挂的基本原理就是这样。
网络封包编辑器我刚接触,比内存修改器不同的地方是它能够通过伪造封包欺骗服务器,达到“不可告人”的目的。 近期可恶的摆摊G就是它所为。基本原理是截取游戏客户端发送的封包,必要时修改之,并在合适时机重新发送给服务器。这种G操作起来要比上一种复杂。但其能力更广泛,有人设想用其来无限偷菜。
先说到这,俺继续摸索。
2009年9月22日
服了博客园了,刚才写了半天的东西,一个连接失败就全没了,博客园的网络咋这么烂呢? 既然如此,直接进入正题。 首先,网络配置。虚拟机中的网络连接选择Custom,再选VMnet8(NAT)。查看母机网络,配置VMware Network Adapter VMnet8的网络,IP地址使用内网192.168.0.1,网关为母机外网IP,DNS和母机保持一致。子机如果是windows,不用设置就可以上网。如果是Linux,还要设置自己的内网IP,网关为192.168.0.1,DNS和母机一致。 文件夹共享。在Settings里的Options选Shared Folders,勾Always Enable,在Add要共享的文件夹。子机在运行中输入\\.host\Shared Folders,就可以查看共享文件夹了。 最后安装VMware tools后,鼠标可以在VMware与母机界面之间自由切换,现在就可以实现双开了。 PS.为了避免再次发生事故,这次我Ctrl+C。
2009年9月18日
今天在写一个程序时发现一个奇异的现象。 注意其中的float ssavg_ap[4]; float ssdev_ap[4]; 当我把它两放在main函数外面作全局变量时,程序编译没问题,但执行时就出现如下错误: Inset error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' ( p-) pM) u-) p-) ' at line 1 起初我以为是我float变量的精度问题,或是SQL语句错误,或是计算错误。后来我把上述两句声明放到main函数里面,奇迹般的就插入成功了, 实在想不通这是为什么,这点小问题实在是难以发现。  Code
#include<stdlib.h> #include<stdio.h> #include<math.h> #include "mysql.h" float scan_data[20][4]; float position_x,position_y; // float ssavg_ap[4]; // float ssdev_ap[4];
int main(int argc,char *argv[]){ MYSQL my_connection; int res; int id=19; float position[2]; float ssavg_ap[4]; float ssdev_ap[4];
printf("输入测试点地坐标:\n"); printf("X: "); scanf("%f",&position[0]); printf("Y: "); scanf("%f",&position[1]); printf("测试点地坐标为(%f,%f)\n",position[0],position[1]);
int i,j; for(i=0;i<20;i++) //暂时赋值 for(j=0;j<4;j++) scan_data[i][j]=1; for(i=0;i<20;i++){ for(j=0;j<4;j++) printf("%f ",scan_data[i][j]); printf("\n"); }
float s,d; for(j=0;j<4;j++){ s=0;d=0; for(i=0;i<20;i++){ s+=scan_data[i][j];} ssavg_ap[j]=s/20; printf("%d的平均值是: %f\n",j,ssavg_ap[j]); for(i=0;i<20;i++) d+=(scan_data[i][j]-ssavg_ap[j])*(scan_data[i][j]-ssavg_ap[j]); ssdev_ap[j]=sqrt(d/20); printf("%d地标准差是: %f\n",j,ssdev_ap[j]); } char sqlstr[100]; sprintf(sqlstr,"INSERT INTO point VALUES(%d,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f)",id,position[0],position[1],ssavg_ap
[0],ssavg_ap[1],ssavg_ap[2],ssavg_ap[3],ssdev_ap[0],ssdev_ap[1],ssdev_ap[2],ssdev_ap[3]); printf("%s\n",sqlstr);
mysql_init(&my_connection); if(mysql_real_connect(&my_connection,"localhost","root","123456","dw",0,NULL,0)){ printf("Connection success\n");
res=mysql_query(&my_connection,sqlstr);
if(!res){ printf("Inserted %lu rows\n",(unsigned long)mysql_affected_rows(&my_connection)); }else{ fprintf(stderr,"Inset error %d: %s\n",mysql_errno(&my_connection),mysql_error(&my_connection)); }
mysql_close(&my_connection); }else{ fprintf(stderr,"Connection failed\n"); if(mysql_errno(&my_connection)){ fprintf(stderr,"Connection error %d:%s\n",mysql_errno(&my_connection),mysql_error(&my_connection)); } }
return EXIT_SUCCESS; }
2009年7月7日
前几天刚刚把大学本科生涯给结果了,在学校附近辗转几天后,我抛却所有的不舍与烦恼,杀气十足地踏进研究生的实验室,准备大干一场。谁知,顶头上司忙里偷闲去了,在实验室闲了两天也没啥事干,只好一遍一遍地审阅bbs上的帖子,找起了游戏准备回住处玩(在实验室还是不能太猖狂),但无赖还是没办法排解这颗闲心,于是做起了四个月前的行当:TJU ACM-ICPC。
TOJ 1601. Box of Bricks
简单题
 Code #include<iostream> using namespace std; int main() { int n,h[51],i,sum,a,k,j=1; while(cin>>n&&n!=0) { sum=0;k=0; for(i=0;i<n;i++) { cin>>h[i]; sum+=h[i]; } a=sum/n; for(i=0;i<n;i++) if(h[i]>a) k+=h[i]-a; cout<<"Set #"<<j<<endl; cout<<"The minimum number of moves is "<<k<<"."<<endl; j++; cout<<endl; } return 0; }
TOJ 2210. Adding Reversed Numbers
整数和字符串来回转换及倒序
 Code #include<iostream> using namespace std; int main() { int test,n1,n2,c,i; char s1[10],s2[10],s[10],t; cin>>test; while(test-->0) { cin>>s1>>s2; for(i=0;i<strlen(s1)/2;i++) {t=s1[i];s1[i]=s1[strlen(s1)-1-i];s1[strlen(s1)-1-i]=t;} for(i=0;i<strlen(s2)/2;i++) {t=s2[i];s2[i]=s2[strlen(s2)-1-i];s2[strlen(s2)-1-i]=t;} i=0,n1=0; while(s1[i]) { t = s1[i]-'0'; n1 = n1*10+t; i++; } i=0,n2=0; while(s2[i]) { t = s2[i]-'0'; n2 = n2*10+t; i++; } c=n1+n2; i=0; while(c) { s[i]=c%10+'0'; i++; c=c/10; } s[i]=0; i=0,c=0; while(s[i]) { t = s[i]-'0'; c = c*10+t; i++; } cout<<c<<endl; } return 0; }
2009年6月22日
摘要: 这半年多数时间心情还是挺好的,偶尔写写论文,玩玩游戏,和同学吃个饭,打个球,旅个游,日子还挺滋润。唯独到了这大学本科的最后时刻,各种烦心事接踵而至:本专业论文老是被批,明天答辩,真想赶紧跟老师说拜拜;暑假不让回家,还不给解决住宿问题;聚会,送老乡、送同学都怕忙不过来。。。 这些事其实都没啥,就是各种事情堆积在一起,感觉着实不爽,就像心里老压着一块块的石头,期盼这段日子早点过去,但想想四年的同学、... 阅读全文
2009年4月14日
摘要: 已知有一个XML文件(bookstore.xml)如下:Corets, Eva5.951、插入节点往节点中插入一个节点: [代码]结果为:Corets, Eva5.95候捷58.32、修改节点:将genre属性值为“李赞红“的节点的genre值改为“update李赞红”,将该节点的子节点的文本修改为“亚胜”。[代码]最后结果为... 阅读全文
2009年3月29日
摘要: 昨天笔试和机试,今天面试,一切都结束了,现在是要杀要刮随便了。笔试OS很简单,DB出的题有点偏,早知道考网络好了。机试还行,四道题AC了三道,C题以前在TOJ看过,本以为不会考,所以没做,偏偏这次出了。。。今天上午的面试分六组。我首先参加的是英语口语组,说得我是头昏眼花啊,估计挂了。五个专业组中题答得也不怎么样,好在老师还挺好说话。哎,今天算是混过来了。以后再也不上自习了 阅读全文
2009年3月20日
摘要: D. BST建立二叉排序树,再后序遍历关键是会用树,指针有两种用法,右边的写法简单[代码]TOJ 1144. Tree Recovery 已知前序和中序求后序方法一:建立二叉树[代码]方法二:数组[代码] 阅读全文
摘要: TOJ 1959. Oil Deposits跟书上一样,建立一个表格和访问标识,然后就遍历啦,不过路径变化比较巧妙。[代码]TOJ 1075. Stockbroker Grapevine先输入路径,接着求最短路径,最后求出中路径最短的点输出,并输出由改点出发的最长路径。[代码]TOJ 2469. Friends简洁的DFS[代码] 阅读全文
|