我使用socket api写了一个server/client异步程序,在client端 用NETSTAT命令检查出现了很多TIMEWAIT ,谁能给我讲讲是什么意思.我初次接触网络编程,请大家指点一下应该注意的事情,和调试方法
解决方案 »
- 下面函数是从上往下渐变//怎么改成X号也发白呢?
- 请教大侠们一个 DLL中 MessageBox的问题,十分感谢!
- CListCtrl 用SetBkImage方法设置位图做背景,请问怎么做才能使在滚动时背景图片不变。
- 在VS2005中如何显示日文的代码注释
- 关于字体颜色
- 请教使用ADO存取二进制的问题
- dll调用问题一个
- 请问NLS(code page)文件结构
- 如何在ATL下给Cookie符值???我下面的函数编译没问题,就是不给符值,不清楚为啥??
- 设置文件路径???
- …………100分…………请教:做汉字输入法的提示…………
- 需要jpeg的头文件,以及接口函数的头文件!谢谢大哥大姐!请发到[email protected]
TCP连接的建立和删除都是有一定步骤规范的,如通常所说的三握手协议。
不要搞那么复杂,
先用一些封装好的类。
像CAsyncSocket,CSocket这样的,
用起来比较简单,
熟悉了以后,再慢慢像底层过渡。
不要一开始就研究TCP/IP
《TCP/IP祥解〉太深。
{
SOCKET server = socket(AF_INET, SOCK_STREAM, 0); if(server == INVALID_SOCKET)
{
CString err;
err.Format("Error %d", WSAGetLastError());
AfxMessageBox(err); return server;
} sockaddr sock_addr;
sockaddr_in *addr_in = (sockaddr_in *)(&sock_addr); memset(addr_in, 0, sizeof(sockaddr_in));
addr_in->sin_family = AF_INET;
//addr_in->sin_port = htons(7999);
addr_in->sin_port = htons(8000);
// addr_in->sin_addr = 0;
int b = bind(server, &sock_addr, sizeof(sockaddr));
if(b!=0)
{
CString err;
err.Format("Error %d", WSAGetLastError());
AfxMessageBox(err);
closesocket(server);
return INVALID_SOCKET;
}
return server;}#include "iostream.h"
int ThreadFunc(void *p)
{
SOCKET server = CreateServerSocket();
if(server == INVALID_SOCKET)
return -1;
else
cout << "Socket Listening... " << endl;
int i = listen(server, 15); if(i!=0)
{
CString err;
err.Format("Error %d", WSAGetLastError());
AfxMessageBox(err);
closesocket(server);
return -2;
}
fd_set fdread;
fd_set fdwrite;
fd_set fdexcept; fd_set currentset; FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcept);
FD_ZERO(¤tset); FD_SET(server, &fdread); int count = 0;
while(1)
{
sockaddr addrr;
int len = sizeof(sockaddr);
FD_ZERO(&fdread); FD_ZERO(&fdwrite);FD_ZERO(&fdexcept); FD_SET(server, &fdread);
FD_SET(server, &fdexcept); memcpy(&(fdread.fd_array[1]), currentset.fd_array,currentset.fd_count *4);
memcpy(fdwrite.fd_array, currentset.fd_array,currentset.fd_count *4);
memcpy(&(fdexcept.fd_array[1]), currentset.fd_array ,currentset.fd_count*4);
fdread.fd_count += currentset.fd_count ;
fdexcept.fd_count += currentset.fd_count;
fdwrite.fd_count = currentset.fd_count ;
int i = select(0, &fdread, &fdwrite, &fdexcept, NULL); if(i == SOCKET_ERROR)
{
CString err;
err.Format("Select Error %d", WSAGetLastError());
cout << err.GetBuffer(err.GetLength()) << endl;//TRACE("err");
continue;
}
int k; for(k = 0; k < fdread.fd_count ;k++)
{
if(server == fdread.fd_array[k])
{
sockaddr addrr;
SOCKET client = accept(server, &addrr, &len);
if(client != INVALID_SOCKET)
{
FD_SET(client, ¤tset);
}
else
cout << "!!error accept" << WSAGetLastError() << endl;
}
else
{
char buf[301] = "";
int cl;
while((cl = recv(fdread.fd_array[k], buf,sizeof(buf),0))>0)
{
cout << "cl = " << cl << " buf = " << count ++ << buf << endl;
}
if(cl == 0)
{
closesocket(fdread.fd_array[k]);
FD_CLR(fdread.fd_array[k], ¤tset);
}
else if(cl <0)
{
int err = WSAGetLastError();
if(err!=WSAEWOULDBLOCK)
{
FD_CLR(fdread.fd_array[k],¤tset);
closesocket(fdread.fd_array[k]);
}
}
}
}
for(k = 0; k < fdexcept.fd_count ;k++)
{
cout << "in except -------------------" << k << " " << fdexcept.fd_count << endl;
closesocket(fdexcept.fd_array[k]);
FD_CLR(fdexcept.fd_array[k], ¤tset);
}
}}
SOCKET CreateClientSocket()
{
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == INVALID_SOCKET)
{
// CString err;
// err.Format("Client Error %d", WSAGetLastError());
// AfxMessageBox(err);
return sock;
} sockaddr sock_addr;
sockaddr_in *addr_in = (sockaddr_in *)(&sock_addr);
addr_in->sin_family = AF_INET;
UINT ii = inet_addr("xxx.xxx.xxx.xxx");
memcpy(&addr_in->sin_addr ,&ii, 4);
addr_in->sin_port = htons(8000); if(connect(sock, &sock_addr, sizeof(sockaddr))!=0)
{
CString err;
err.Format("Connect Error %d" , WSAGetLastError());
AfxMessageBox(err);
return INVALID_SOCKET;
}
return sock;
}///这里是客户程序
UINT clientcontrol(LPVOID param)
{
int iThread = (int)param;
// iThread++;
UINT k = 0;
UINT j = 0;
clock_t start = clock();
while(k<5000)
{
k++;
SOCKET sock = CreateClientSocket(); if(sock == INVALID_SOCKET)
return 0; char buf[300] = "";
//sprintf(buf, "Thread %d loop %d successed %d", (int)param, k, j); memcpy(buf,&iThread,4);
memcpy(&buf[4],&k,4);
int r = send(sock, buf, sizeof(buf), 0);
if(r==SOCKET_ERROR)
{
closesocket(sock);
continue;
}
j++;
closesocket(sock);
}
clock_t end = clock();
CString err;
err.Format("Thread %d Treminated, loop = %d, success = %d, time start = %d, time end = %d", iThread, k, j, start, end);
AfxMessageBox(err);
return 0;
}int ThreadCount = 0;
void CClientDlg::OnButton1()
{
// TODO: Add your control notification handler code here
for(int i=0;i<40;i++)
{
ThreadCount++;
AfxBeginThread( clientcontrol, (void *)ThreadCount, 2);
}
}
看看<tcp/ip详解 卷I:协议> w.Richard Stevens 就明白了。
很想和两位交个朋友,好请两位经常指教
如果愿意给我来个信
[email protected]