客户端/服务器问题

客户端/服务器问题

问题描述:

我已经创建了一个客户端/服务器程序,但是遇到了一些问题.问题之一是收到消息后将消息发送回客户端.当我将消息发送回客户端时,将传输0字节.另一个问题是如何接收客户端正在发送的数据,直到没有更多数据为止.我发送带有一些int和char *的结构,但char *永远不会到达另一端(服务器).这是我的代码:

服务器:
#include< iostream>
#include< winsock2.h>




br> struct msg {无符号__int8填充;
无符号__int16 dataSize;
__int32 value1;
__int32 value2; char * buff;
};

SOCKET intializeServer(int端口)
{
int error = 0;
LPWSADATA lpwsaData = new WSAData();

error = WSAStartup(MAKEWORD(2,2 ),lpwsaData);

if(error == SOCKET_ERROR)
{
cout<< 启动套接字时出错!";
exit(1);
}

SOCKET袜子=套接字(AF_INET,SOCK_STREAM,0);

if(袜子== SOCKET_ERROR)
{
cout<< "错误接受袜子-" << WSAGetLastError();
返回-1;
}
struct sockaddr_in服务器;

server.sin_family = AF_INET;
server.sin_port = htons((unsigned short)端口);
server.sin_addr.s_addr = INADDR_ANY;

bind(sock,(sockaddr *)& server,sizeof(server));

返回袜子;
}

int serverCleanUp(SOCKET clientSock,SOCKET袜子)
{
shutdown(clientSock,SD_BOTH);
closesocket(clientSock);
closesocket(sock);

WSACleanup();

返回0;
}

int recvMessage(int端口)
{
int错误= 0;

SOCKET sock = intializeServer(port);

监听(sock,5);

SOCKET clientSock = accept(sock,0,0);

如果(clientSock == SOCKET_ERROR )
{
cout<< "错误接受袜子-" << WSAGetLastError();
返回-1;
}
char消息[1460];

int numBytes = 0;

numBytes = recv(clientSock,消息,sizeof(message),0);

struct msg * data =(struct msg *)&message;

/* for(int i = 0; i< data-> dataSize; i ++)
{
numBytes + = recv(clientSock,message,sizeof(message),0);
} */
if(numBytes> 0)
{ cout<< ; "\ n" << "收到消息! \ n" << "接收的字节总数:" << numBytes<< " \ n;
}
if(data-> version!= 1)
{ cout<< 版本号不正确!";
返回-1;
}

int charDataSize = sizeof(data-&b; buff);

/* if(charDataSize! = data-> dataSize)
{ cout<< 可能丢失字符数据";返回-1;
} */
cout<< 数据大小:" << data-> dataSize<< " \ n"
< "第一个值:" << data-> value1<< " \ n"
< 第二值:" << data-> value2<< " \ n"
< 字符数据:" <<数据-> buff<< "\ n";

__int64结果=数据->值1 +数据->值2;

SOCKET ReplySock =套接字(AF_INET,SOCK_STREAM,0);

>错误= send(replySock,(char *)& result,sizeof(result),0);

serverCleanUp(clientSock,sock);

返回0;
}
int int main(int argc,char * argv [])
{
int port;
cout<< "服务器TCP端口号:"

cin>> port;

cout<< 监听客户端.....";

recvMessage(port);

int a;
cin>> a;

返回0;
}

客户端:

#include< iostream>
#include< winsock2.h>

使用命名空间标准;

struct msg { unsigned __int8 pad;
unsigned __int16 dataSize;
__int32 value1;
__int32 value2;
char * buff;
};

int sendMessage(msg * m,char * ipAddress,int port)
{
int error = 0;
unsigned long ip = inet_addr (ipAddress);
LPWSADATA lpwsaData =新的WSAData();

错误= WSAStartup(MAKEWORD(2,2),lpwsaData);

if(error == SOCKET_ERROR)
{
cout<< 启动套接字时出错!";返回1;
}

SOCKET袜子=套接字(AF_INET,SOCK_STREAM,0);

struct sockaddr_in服务器;

server.sin_family = AF_INET;
server.sin_port = htons((unsigned short)端口);
server.sin_addr.s_addr = ip;

error = connect(sock,(sockaddr *)& server,sizeof(server));

错误= send(sock,(char *)m,sizeof(* m),0);

listen(sock,5 );

/* SOCKET clientSock = accept(sock,0,0);

if(clientSock == SOCKET_ERROR)
{ cout<< "错误接受套接字" << WSAGetLastError();
返回-1;
} */

char message [1460];

int numBytes = recv(sock,message,sizeof(message),0 );

cout<< atoi(消息);

//cout<< 发送" <<错误;
关机(袜子,SD_BOTH);
closesocket(袜子);
返回0;
}

int main(int argc,char * argv [] )
{
int端口;
char ipAddress [14];

struct msg m;
m.version = 1;
m.pad = 0;
cout<&lt ; "TCP端口号:";
cin>> port;

cout<< "\ n" << "输入IP地址:"
cin>> ipAddress;

cout<< "\ n" << "输入数据大小:" cin>> m.dataSize;

cout<< "\ n" << "输入第一个值:"
cin>> m.value1;

cout<< "\ n" << "输入第二个值:"
cin>> m.value2;
m.buff = new char [m.dataSize];

int i,c;

for(i = 0,c = 0; i < m.dataSize; i ++,c ++)
{
m.buff [i] ='a'+ c;
如果(c == 25)
{
c = 0 ;
}
}

m.buff [i] ='\ 0';

int错误= sendMessage(& m,ipAddress,port);

int a;
cin>> a;

返回0;
}

感谢您的帮助!

I have created a client/server program but am having some problems. One of the problems is sending a message back to the client after recieving a message. When I send the message back to the client, 0 bytes are transfered. The other problem is how to recieve data the client is sending until there is no more data. I send a struct with some int's and a char* but the char* never gets to the other side(server). Here is my code:

Server:

#include <iostream>
#include <winsock2.h>

using namespace std;

struct msg {
unsigned __int8 version;
unsigned __int8 pad;
unsigned __int16 dataSize;
__int32 value1;
__int32 value2;
char* buff;
};

SOCKET intializeServer(int port)
{
int error = 0;
LPWSADATA lpwsaData = new WSAData();

error = WSAStartup(MAKEWORD(2,2), lpwsaData);

if(error == SOCKET_ERROR)
{
cout << "Error starting socket!";
exit(1);
}

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock == SOCKET_ERROR)
{
cout << "Error accepting sock - " << WSAGetLastError();
return -1;
}

struct sockaddr_in server;

server.sin_family = AF_INET;
server.sin_port = htons((unsigned short) port);
server.sin_addr.s_addr = INADDR_ANY;

bind(sock, (sockaddr*)&server, sizeof(server));

return sock;
}

int serverCleanUp(SOCKET clientSock, SOCKET sock)
{
shutdown(clientSock, SD_BOTH);
closesocket(clientSock);
closesocket(sock);

WSACleanup();

return 0;
}

int recvMessage(int port)
{
int error = 0;

SOCKET sock = intializeServer(port);

listen(sock, 5);

SOCKET clientSock = accept(sock, 0, 0);

if (clientSock == SOCKET_ERROR)
{
cout << "Error accepting sock - " << WSAGetLastError();
return -1;
}

char message[1460];

int numBytes = 0;

numBytes = recv(clientSock, message, sizeof(message), 0);

struct msg* data = (struct msg *) &message;

/*for(int i =0; i < data->dataSize; i++)
{
numBytes += recv(clientSock, message, sizeof(message), 0);
}*/

if(numBytes > 0)
{
cout << "\n" << "Message received! \n" << "Total number of bytes recieved: " << numBytes << "\n";
}

if(data->version != 1)
{
cout << "Incorrect version number!";
return -1;
}

int charDataSize = sizeof(data->buff);

/*if(charDataSize != data->dataSize)
{
cout << "Possible loss of character data";
return -1;
}*/

cout << "Size of data: " << data->dataSize << "\n"
<< "First value: " << data->value1 << "\n"
<< "Second value: " << data->value2 << "\n"
<< "Character data: " << data->buff << "\n";

__int64 result = data->value1 + data->value2;

SOCKET replySock = socket(AF_INET, SOCK_STREAM, 0);

error = send(replySock, (char *) &result, sizeof(result), 0);

serverCleanUp(clientSock, sock);

return 0;
}

int main(int argc, char* argv[])
{
int port;

cout << "Server TCP port#: ";

cin >> port;

cout << "Listening for client.....";

recvMessage(port);

int a;
cin >> a;

return 0;
}

Client:

#include <iostream>
#include <winsock2.h>

using namespace std;

struct msg {
unsigned __int8 version;
unsigned __int8 pad;
unsigned __int16 dataSize;
__int32 value1;
__int32 value2;
char* buff;
};

int sendMessage(msg *m, char* ipAddress, int port)
{
int error = 0;
unsigned long ip = inet_addr(ipAddress);
LPWSADATA lpwsaData = new WSAData();

error = WSAStartup(MAKEWORD(2,2), lpwsaData);

if(error == SOCKET_ERROR)
{
cout << "Error starting socket!";
return 1;
}

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in server;

server.sin_family = AF_INET;
server.sin_port = htons((unsigned short) port);
server.sin_addr.s_addr = ip;

error = connect(sock, (sockaddr*)&server, sizeof(server));

error = send(sock, (char *) m, sizeof(*m), 0);

listen(sock, 5);

/*SOCKET clientSock = accept(sock, 0, 0);

if (clientSock == SOCKET_ERROR)
{
cout << "Error accepting socket " << WSAGetLastError();
return -1;
}*/

char message[1460];

int numBytes = recv(sock, message, sizeof(message), 0);

cout << atoi(message);

//cout << "send " << error;
shutdown(sock, SD_BOTH);
closesocket(sock);

return 0;
}

int main(int argc, char* argv[])
{
int port;
char ipAddress[14];

struct msg m;

m.version = 1;
m.pad = 0;

cout << "TCP Port#: ";
cin >> port;

cout << "\n" << "Enter IP Address: ";
cin >> ipAddress;

cout << "\n" << "Enter size of data: ";
cin >> m.dataSize;

cout << "\n" << "Enter the first value: ";
cin >> m.value1;

cout << "\n" << "Enter the second value: ";
cin >> m.value2;

m.buff = new char[m.dataSize];

int i, c;

for (i = 0, c = 0; i < m.dataSize; i++, c++)
{
m.buff[i] = 'a' + c;
if (c == 25)
{
c = 0;
}
}

m.buff[i] = '\0';

int error = sendMessage(&m, ipAddress, port);

int a;
cin >> a;

return 0;
}

Thanks for any help!

请参阅此链接

http://msdn.microsoft.com/en-us/library/ms737889 (VS.85).aspx
Refer this link

http://msdn.microsoft.com/en-us/library/ms737889(VS.85).aspx