最近刚学winsock编程。一边看孙鑫的书一边用VC做了个最简单的聊天程序,今晚调试时遇到这么一个问题。
现象:当通信中的一端关闭后(直接关闭窗口),另一端会不断地重复受到最后一次受到的信息。
我把断点设到recv后(1处),没想到连接断后recv能不断地受到正值,而且超大无比16777215。
第一反应是遇上了winsock的诡异BUG,可是把断点正好设到recv()上(2处),却又发现明明返回了 -1!
代码如下 char buff[20];
int num = recv(sockConn,buff,19,0); //2
buff[num] = '\0';
if (num <0) //1
{
int err = WSAGetLastError();
if (err == WSAECONNRESET)
MessageBox(NULL,"那头已经断了","线路已断",MB_ICONSTOP);
else原来是编译器把 int num 的空间正好分配到了 char buff[20]前面,
当num返回-1时,正好把32有符号数的高8位清零了,于是num 成了 0x00ffffff。
仔细想想是自己不该在未判断num的前提下就加'\0'另外想问一下,MFC中如何获得本机的IP呢?每次自己输入很麻烦啊。
现象:当通信中的一端关闭后(直接关闭窗口),另一端会不断地重复受到最后一次受到的信息。
我把断点设到recv后(1处),没想到连接断后recv能不断地受到正值,而且超大无比16777215。
第一反应是遇上了winsock的诡异BUG,可是把断点正好设到recv()上(2处),却又发现明明返回了 -1!
代码如下 char buff[20];
int num = recv(sockConn,buff,19,0); //2
buff[num] = '\0';
if (num <0) //1
{
int err = WSAGetLastError();
if (err == WSAECONNRESET)
MessageBox(NULL,"那头已经断了","线路已断",MB_ICONSTOP);
else原来是编译器把 int num 的空间正好分配到了 char buff[20]前面,
当num返回-1时,正好把32有符号数的高8位清零了,于是num 成了 0x00ffffff。
仔细想想是自己不该在未判断num的前提下就加'\0'另外想问一下,MFC中如何获得本机的IP呢?每次自己输入很麻烦啊。
解决方案 »
- WS_CLIPCHILDREN如何避免子窗口闪烁,且子窗口会自绘
- 任务栏上的按钮标题如何更改
- 请问WM_KEYDOWN和WM_CHAR消息的区别?
- 完成端口,关于client关闭套接字问题,向高手请教。
- 控件自适应屏幕的大小
- 程序中每秒发送一个定时器消息,但第一个消息处理函数还未处理完,第二个消息又来了, 怎样让第一个消息处理函数能处理完毕
- ADO连接access2000,需用用户名和密码,大家帮忙啊!
- 系统的句柄总数,核心内存的取法?
- 在哪儿可以下载VisualC++英文版
- 关于SetWaitableTimer APC,等待时使用WaitForSingleObjectEx函数的问题
- 如何将字符数组变换成数字????
- vc里没有像delphi的时钟控件吗?
{
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
ULONG ulOutBufLen;
pAdapterInfo=(PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO));
ulOutBufLen = sizeof(IP_ADAPTER_INFO);
// 第一次调用GetAdapterInfo获取ulOutBufLen大小
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
{
pAdapter = pAdapterInfo;
if (pAdapter)
{
memcpy(pIPinfo,pAdapter->IpAddressList.IpAddress.String,strlen(pAdapter->IpAddressList.IpAddress.String));
strncat(pIPinfo,"\n",1);
strncat(pIPinfo,pAdapter->IpAddressList.IpMask.String,strlen(pAdapter->IpAddressList.IpMask.String));
strncat(pIPinfo,"\n",1);
strncat(pIPinfo,pAdapter->GatewayList.IpAddress.String,strlen(pAdapter->GatewayList.IpAddress.String));
}
}
else
{
printf("Call to GetAdaptersInfo failed.\n");
}
return TRUE;
}
{
char szHostName[128];
const char* pszAddr;
struct hostent * pHost;
int i,j;
if( gethostname(szHostName, 128) == 0 )
{
pHost = gethostbyname(szHostName);
for( i = 0; pHost!= NULL && pHost->h_addr_list[i]!= NULL; i++ )
{ /*对每一个IP地址进行处理*/
pszAddr=inet_ntoa (*(struct in_addr *)pHost->h_addr_list[i]);
printf("%s\n",pszAddr);/*打印*/
}
}
}
if (num <0)