Archive for 10月 2012

UDP的recvfrom产生10054的错误

这个是Windows的问题。

当UDP Socket在某次发送后收到一个不可到达的ICMP包时,这个错误将在下一个接收中返回。所以上面的套接字在下一次的接收中返回了SOCKET_ERROR,错误是10054

解决方法:

简单的忽略这个就可以了,对后续的调用没有影响。

//防止sendto不能到达后recvfrom返回-1并且获得10054错误.
/*
SYMPTOMS:
In Windows 2000, a User Datagram Protocol (UDP) program may not work and may generate a
WSAECONNRESET response.
CAUSE:
If sending a datagram using the sendto function results in an "ICMP port unreachable"
response and the select function is set for readfds, the program returns 1 and the subsequent
call to the recvfrom function does not work with a WSAECONNRESET (10054) error response.
In Microsoft Windows NT 4.0, this situation causes the select function to block or time out.
//用来防止q263823(见MSDN)(UDP中sendto发送的消息到不了指定的IP&PORT后使用recvfrom的话会返回-1,报错10054)
*/
DWORD ? dwBytesReturned ? = ? 0;
BOOL ? ? bNewBehavior ? = ? FALSE;
DWORD ? status;
status = WSAIoctl(mainSocket, SIO_UDP_CONNRESET,&bNewBehavior,sizeof(bNewBehavior),NULL,0,&dwBytesReturned,NULL,NULL);

Ubuntu设置代理上网

有些时候机器在内网中,不能直接访问网络,需要通过代理,Ubuntu设置上网代理的方法如下:

1.设置apt代理上网,编辑apt.conf文件,使用如下命令

sudo vi /etc/apt/apt.conf

然后加入如下内容:

Acquire::http::Proxy "http://10.72.13.116:808/";
Acquire::ftp::Proxy "ftp://10.72.13.116:2121/";

最后保存文件

2.设置全局代理上网的方法,编辑~/.bashrc文件,使用如下命令

vi ~/.bashrc

在文件最后加入如下内容

export http_proxy=http://10.72.13.116:808
export ftp_proxy=ftp://10.72.13.116:2121

MFC中使用控制台输出printf内容

在win32和MFC程序中,有时需要输出一些调试信息,本文介绍在win32和MFC程序中使用控制台输出信息的方法。

我们可以在应用程序里使用AllocConsole()函数自己开一个控制台(就像DOS窗口一样),然后重定向输入输出,就可以用printf函数向控制台输出信息了,具体方法如下:

在CWinApp的重载函数InitInstance()中输入如下语句,开辟一个控制台并重定向输出

<div>AllocConsole(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 开辟控制台</div>
<div>SetConsoleTitle(_T("Debug Output")); ? ? ?// 设置控制台窗口标题</div>
<div>freopen("CONOUT$","w",stdout); ? ? ? ? ? ? // 重定向输出</div>

然后一定要在CWinApp的重载函数ExitInstance()中调用如下语句释放控制台。


FreeConsole();

c++ find函数实现

有些地方要用到字符串查找,比如在文件中查找某一字符串位置,又不想使用c++模板库的函数,可以自己写个查找函数


int find(char* srcBuff, int srcLen, char* findBuff, int findLen, int startPos)
{
	int findPos = 0;
	int tempPos = 0;
	for (int i = startPos; i <= srcLen - findLen; i++)
	{
		findPos = i;
		tempPos = i;
		for (int j = 0; j < findLen; j++)
		{
			char srcTemp = *(srcBuff + tempPos);
			char findTemp = *(findBuff + j);

			if (srcTemp == findTemp)
			{
				if (j == findLen - 1)
				{
					return findPos;
				}
				tempPos++;
			}
			else
			{
				break;
			}
		}
	}
	return -1;
}

Suse Linux 字符E乱码解决

在Suse Linux Enterprise Server 10中,使用SSH连接,发现有乱码字符,经观察是由十六进制字符E引起的,其实解决这个问题很简单:

1.打开yast,打开“系统”, “/etc/sysconfig编辑器”,依次展开“System ->Environment ->Language”项。
2.打开RC_LANG,在setting of RC_LANG的下拉列表中选择POSIX,再点完成后,重启机器就行了。

当然,网上也有人说:
在/etc/profile里增加一项:export LC_CTYPE=”posix”
这种也是可行的。

重启后输入locale命令,可以发现LC_CTYPE=POSIX,生效。

安乐业房产源码后台经纪人套餐不停的提示修改成功

在安乐业房产安装成功后,使用会员管理->经纪人管理->套餐,给经纪人增加套餐时,点击后发现不停弹出“修改成功”对话框,这个是源码问题,直接修改源码

打开admin/member目录下的changeVip.php,找到


$page->goto($return_to,'修改成功');

改为


$page->goto('index.php','修改成功');

即可,这是跳转的问题,进入死循环了。

安乐业房产源码后台新闻管理点下一页无效

最近一段时间在研究安乐业3.0源码,安装后发现登陆到后台面,管理添加的新闻信息,在所有新闻标签里点击下一页能正常跳转,当点击其它标签,并且新闻数量超过两页时,点下一页,新闻跳转到所有新闻标签了,也就是点下一页无效。

其实这个问题是源码的问题,只要修改源码就能解决,不废话了,直接上源码

在admin/news目录中打开newmange.php找到以下内容:

$cid = PostGet('cid');
$page =PostGet('page');
$key =trim(PostGet('key'));
$url = "newmange.php?cid=$cid&page=$page&key=$key";

将其修改为

$tid = PostGet('tid');
$page =PostGet('page');
$key =trim(PostGet('key'));
$url = "newmange.php?tid=$tid&page=$page&key=$key";