2013-03-05 200 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