程序启动时,会启动线程A,B
A线程是server(程序):
B线程是client(程序)A线程,是用来接收客户端C发送的信息,在经过判断后,由B发送到D服务端,D服务端判断后,发送回给B,B在经过A发送后给CA线程,大致程序如下
       SOCKADDR_IN addrAccept;
ZeroMemory(&addrAccept, sizeof(SOCKADDR_IN));
int nSockLen = sizeof(SOCKADDR);
SOCKET sockAccept = WSAAccept(sockSvr, (SOCKADDR*)&addrAccept, &nSockLen, 0, 0);
if(INVALID_SOCKET == sockSvr)
{
return 0;
}
PPER_HANDLE_DATA pPerHandle = (PPER_HANDLE_DATA)::GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
pPerHandle->s=sockAccept;
memcpy(&pPerHandle->addr, &addrAccept, nSockLen);
if(NULL==CreateIoCompletionPort((HANDLE)sockAccept, hCompletionPort, (DWORD)pPerHandle, 0))
{
m_lbx_star.AddString("服务端端口绑定失败");
return 0;
}
B线程,大致程序如下
        CString cs_serip;
WORD wVersionRequested;
WSADATA wsaC;
wVersionRequested = MAKEWORD( 2, 2 );
int res = WSAStartup(wVersionRequested,&wsaC);
if(res == -1)
{
return 0;
}
struct sockaddr_in socket_in;
sktclt =  WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
if(sktclt == INVALID_SOCKET)
{
return 0;
}
socket_in.sin_family = AF_INET;
socket_in.sin_port = htons(8080);
socket_in.sin_addr.S_un.S_addr = inet_addr(cs_serip); int con_res = connect(sktclt,(struct sockaddr*)&socket_in,sizeof(socket_in));
if(con_res == SOCKET_ERROR)
{
//失败
closesocket(sktclt);
WSACleanup();
return 0;
}
B线程中的sktclt,是一个全局的socket.我程序里面有一个全局的函数,供A调用fdata(SOCKET clis, char buff[256])
{
::send(sktclt, buff,256,0) ;
char buffS[256];
int nRecv = ::recv(sktclt, buffS, 256, 0);
if(nRecv > 0)
{
 ::send(clis, buff,1024,0) ;
}
}
如果clis与sktclt同值时,会不会出现,发错的情况,既本发D服务器的,结果发给了C客户端
请高人指点

解决方案 »

  1.   

    socket本身不会重复,关闭之后,就会再次被使用,只要将sokcet值保存正确,就能够正常使用而不错乱
      

  2.   

    看着ABCD就发晕..路过一下..没去细看..表述简洁点..路过的多一点..
      

  3.   

    socket值是一个内存地址,是不会同值的,使用的时候可以做些保护

    if(sktclt != INVALID_SOCKET)
    {
       //操作
    }