编写TCP服务器和客户端时遇到如下问题:
1、 服务器端采用Debug时不能正确接受客户端连接,监听套接字设置为block,accept类似于non-block方式,直接返回。而采用Release时,可以正确接受连接。无独有偶,在一本网络编程的例子代码的Debug版不能用端点调试,这是为什么,那么如何调试服务器程序呢?客户端程序设置成Debug没有问题。
2、 服务器端如果把ret, buf,直接在recv()函数前定义,代码即使在Release下也不能正确执行,而必须把这些定义移动到函数起始部分。
if(ret = recv(client, buf, sizeof(buf), 0))
{
    str.Format("%s",buf);
    MessageBox(str);
}服务器端:
//全局变量
SOCKET serv;
SOCKADDR_IN tcpaddr;
SOCKET client;
SOCKADDR_IN clientaddr;int CTcpServDlg::StartWinSock()
{
int status = 0;
WSADATA wsadata;
UINT port = 5150;
int error;
int ret;
char buf[100];
CString str;

if(status = WSAStartup(MAKEWORD(2,2),&wsadata) != 0)
return -1;
serv = socket(AF_INET, SOCK_STREAM, 0); tcpaddr.sin_family = AF_INET;
tcpaddr.sin_port = htons(port);
tcpaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); if(status = bind(serv,(PSOCKADDR)&tcpaddr,sizeof(tcpaddr)) == SOCKET_ERROR)
{
AfxMessageBox("绑定失败",MB_OK,NULL);
error = WSAGetLastError();
if(error == WSAEADDRINUSE)
AfxMessageBox("端口已占用",MB_OK,NULL);
return -1;
}
else
{
// AfxMessageBox("绑定成功",MB_OK,NULL);
;
}
if(status = listen(serv, 5) == SOCKET_ERROR)
AfxMessageBox("监听失败",MB_OK,NULL);
else
{
;
// AfxMessageBox("监听成功",MB_OK,NULL);
} int clientaddrLen;
clientaddr.sin_family = AF_INET;
for(int i = 0; i < 4; i++)
{
client = accept(serv, (SOCKADDR*)&clientaddr, &clientaddrLen);
if(client == INVALID_SOCKET)
{
MessageBox("&acute;接受失败");
}
else
{
MessageBox("接受成功");
if(ret = recv(client, buf, sizeof(buf), 0))
{
str.Format("%s",buf);
MessageBox(str);
}
}
}

closesocket(client);
closesocket(serv);
WSACleanup(); return 0;
}
客户端:
void CTcpClientDlg::OnConnectBtn() 
{
// TODO: Add your control notification handler code here
SOCKET conn;
SOCKADDR_IN servaddr;
WSADATA wsadata;
int port = 5150;
int status;
if(status = WSAStartup(MAKEWORD(2,2),&wsadata) < 0)
return;
conn = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
servaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); for(int i = 0; i < 4; i++)
{
status = connect(conn, (SOCKADDR*)&servaddr, sizeof(servaddr));
if(status == SOCKET_ERROR)
AfxMessageBox(_T("&Aacute;&not;&frac12;&Oacute;&Ecirc;§°&Uuml;"));
else

{
AfxMessageBox(_T("&Aacute;&not;&frac12;&Oacute;&sup3;&Eacute;&sup1;&brvbar;"));
char sendbuf[100];
sprintf(sendbuf, "This is a SendBuf!");
send(conn, sendbuf, sizeof(sendbuf), 0);
break;
}
}
closesocket(conn);
WSACleanup();
}