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;
}
在服務器中,爲什麼要將SConnect設置爲一個值,然後用不同的值覆蓋該值?泄漏套接字!您在循環中的每次傳遞中都分配一個新的接收緩衝區,而您永遠不會釋放它。 – 2013-03-05 04:08:08