2013-03-05 202 views
1

我试图建立一个客户端服务器连接,我试图从客户端发送数据并通过服务器接收。 我修改了互联网上的程序,但结果并不令人满意。客户端和服务器之间的连接已建立,但客户端无法将数据发送到服务器。客户端服务器C++

有人能告诉我这些程序有什么问题吗?

服务器

#include <Windows.h> 
#include <iostream> 

using namespace std; 

SOCKADDR_IN addr; 
SOCKET sListen; 
SOCKET sConnect; 
SOCKET Connections; 

int addrlen = sizeof(addr); 
int ConCounter = 0; 
struct Buffer 
{ 
char Message[256]; 
}; 


int InitWinSock() 
{ 
int RetVal = 0; 
WSAData wsaData; 
WORD DllVersion = MAKEWORD(2,1); 
RetVal = WSAStartup(DllVersion, &wsaData); 

return RetVal; 
} 

int main() 
{ 
int RetVal = 0; 
RetVal = InitWinSock(); 
if(RetVal != 0) 
{ 
    MessageBoxA(NULL, "Winsock startup failed", "Error", MB_OK | MB_ICONERROR); 
    exit(1); 
} 

Connections = (SOCKET)calloc(1, sizeof(SOCKET)); 
sListen = socket(AF_INET, SOCK_STREAM, NULL); 
sConnect = socket(AF_INET, SOCK_STREAM, NULL); 

addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
addr.sin_port  = htons(1234); 
addr.sin_family  = AF_INET; 

bind(sListen, (SOCKADDR*)&addr, sizeof(addr)); 

listen(sListen, 1); 

for(;; Sleep(50)) 
{ 
    if(sConnect = accept(sListen, (SOCKADDR*)&addr, &addrlen)) 
    { 
     cout<<"connection was found"; 

     for(;; Sleep(50)) 
{ 
     Buffer sbuffer; 
     char* Recv = new char[256]; 
     ZeroMemory(Recv, 256);  
     if(recv(Connections, Recv, 256, NULL)) 
     {  
      cout<<Recv<<endl;   
      ZeroMemory(Recv, 256); 
     } 
     }    
    } 
} 
return 0; 
} 

客户端:

#pragma comment(lib, "Ws2_32.lib") 
#include <WinSock2.h> 
#include <Windows.h> 
#include <iostream> 

using namespace std; 

SOCKADDR_IN addr; 

SOCKET sConnect; 

struct Buffer 
{ 

char Message[256]; 
}; 

int main() 
{ 
system("cls"); 

int RetVal = 0; 

WSAData wsaData; 
WORD DllVersion = MAKEWORD(2,1); 
RetVal = WSAStartup(DllVersion, &wsaData); 
if(RetVal != 0) 
{                                                 
    MessageBoxA(NULL, "Winsock startup failed", "Error", MB_OK | MB_ICONERROR); 
    exit(1); 
} 

sConnect = socket(AF_INET, SOCK_STREAM, NULL); 

addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
addr.sin_port  = htons(1234); 
addr.sin_family  = AF_INET; 

cout << "Connect to Masterserver? [ENTER]" <<endl; 
getchar(); 
RetVal = connect(sConnect, (SOCKADDR*)&addr, sizeof(addr)); 

if(RetVal != 0) 
{ 
    MessageBoxA(NULL, "Could not connect to server", "Error", MB_OK | MB_ICONERROR); 
    main(); 
} 
else 
{ 

    cout << "Connected" <<endl; 


    for(;; Sleep(10)) 
    { 
     char* buffer = new char[256]; 
     ZeroMemory(buffer, 256); 

     cin >> buffer; 
     getchar(); 

     send(sConnect, buffer, 256, NULL); 
    } 
} 

return 0; 
} 
+0

在服务器中,为什么要将SConnect设置为一个值,然后用不同的值覆盖该值?泄漏套接字!您在循环中的每次传递中都分配一个新的接收缓冲区,而您永远不会释放它。 – 2013-03-05 04:08:08

回答

0

recv(Connections应该是recv(sConnect。查看我对您的问题的评论,以获取代码中其他更小的错误列表。

+0

谢谢..我是假的穿上它.. – Limavolt 2013-03-05 05:05:37