关于sock编程中第二次send 发生错误,请大神帮忙

程序的流程是server端发送getIP请求,client接收到调用函数获取自身的IP再发送给server,问题就是处在这块,client端的socket显示错误1003... 程序的流程是server端发送getIP请求, client接收到调用函数获取自身的IP再发送给server, 问题就是处在这块, client端的socket显示错误10038。。。,也就是该socket无效,但是我也没有关闭该socket啊,不知什么原因。。。

server端:
在一个线程中通过accept接受一个socket,
DWORD WINAPI ThreadProc(LPVOID pArg)
{
HWND hDlg = (HWND)pArg;
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
//给client发送getIP信息
char recvBuf[100] = "getIp";
if (send(sockConn,recvBuf,100,0) ==SOCKET_ERROR)
{
MessageBox(hDlg, TEXT("send failed"), NULL, 0);
return FALSE;
}
TCHAR buf[100];
memset(buf,0,sizeof(buf));
char temp[64];
MessageBox(hDlg, TEXT("recv before"), NULL, 0);
//这里接受client端的信息
if (recv(sockConn, temp, sizeof(temp), 0) == SOCKET_ERROR)
{
MessageBox(hDlg, TEXT("recv failed"), NULL, 0);
return FALSE;
}
MessageBox(hDlg, TEXT("recv over"), NULL, 0);
MultiByteToWideChar( CP_ACP,0,recvBuf,-1,(LPWSTR) buf,100 );
MessageBox(hDlg, buf, NULL, 0);
//这里将接收到的内容填充到EDIT中
Edit_SetText(GetDlgItem(hDlg, IDC_EDIT1), buf);
closesocket(sockConn);
return TRUE;
}
CLIENT端:
DWORD WINAPI ThreadProc(LPVOID pArg)
{
HWND hDlg = (HWND)pArg;
SOCKET sClient = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
//server端的IP和PORT
addr.sin_addr.S_un.S_addr =inet_addr("192.168.1.22");
addr.sin_port = htons(6000);
if (connect(sClient,(sockaddr *)&addr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
MessageBox(hDlg, TEXT("connect failed"), NULL, 0);
return FALSE;
}
TCHAR buf[64];
//Edit_GetText(GetDlgItem(hDlg,IDC_EDIT1),buf,64);
//在此处接受到getip信息,进行处理
char ascbuf[128];
if (recv(sClient, ascbuf, 129, 0) == SOCKET_ERROR)
{
MessageBox(hDlg, TEXT("recv failed"), NULL, 0);
return FALSE;
}
//!!!!!!!!!!在此处能够接收到getIp信息,然后程序跳转到了GetIpInfo
if (!strcmp(ascbuf, "getIp"))
{
GetIpInfo(sClient, hDlg);
}
else if (!strcmp(ascbuf ,"setIp"))
{
SetIpInfo(sClient, hDlg);
}
MultiByteToWideChar(CP_ACP,0,ascbuf,sizeof(ascbuf),buf, 64);
closesocket(sClient);
return TRUE;
}
BOOL GetIpInfo(SOCKET sClient, HWND hDlg)
{
............这里省略.............
//获得 IP 值
DWORD dw;
DWORD dwType;
TCHAR buf[32] = TEXT("\0");
LPCTSTR IpAddress = TEXT("IpAddress");
RegQueryValueEx(hkey,IpAddress,0,&dwType,(BYTE *)buf,&dw);
//现在ipaddress里面存放的IP字符窜,
//将 IP 值发送给 server
//问题就是在这里, 此处调用send发送不过去,WSAGetLastError这个显示的错误会10038
//意思是说sClient不合法。不知道什么原因,
char ascbuf[64] = {0};
WideCharToMultiByte(CP_ACP, 0, buf, wcslen(buf), ascbuf, 64, NULL, NULL);
//???????????????????????????????
if (send(sClient,ascbuf,sizeof(ascbuf),0) == SOCKET_ERROR)
{
printf("%d\n", WSAGetLastError());
MessageBox(hDlg, TEXT("send failed"), NULL, 0);
return FALSE;
}
return TRUE;
}
展开
 我来答
ymj4645
2013-03-12 · TA获得超过3494个赞
知道小有建树答主
回答量:580
采纳率:37%
帮助的人:248万
展开全部
在服务器端的线程 里 直接结束线程 返回了!!
closesocket(sockConn);//关闭套接字
return TRUE; 结束 本线程!
所以线程返回后 该套接字自然释放了!!
一般的处理方法是:
将recv接收数据函数 放入一个循环里,这样不会结束线程 还可以不断接收数据!然后判断数据的类型进行相应处理!
更多追问追答
追问
我感觉server端不是在那里recv阻塞的了啊, 线程应该不会结束吧
追答
那你接受到数据之后呢?还阻塞?
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式