客户端/服务器问题
我已经创建了一个客户端/服务器程序,但是遇到了一些问题.问题之一是收到消息后将消息发送回客户端.当我将消息发送回客户端时,将传输0字节.另一个问题是如何接收客户端正在发送的数据,直到没有更多数据为止.我发送带有一些int和char *的结构,但char *永远不会到达另一端(服务器).这是我的代码:
服务器:
#include< iostream>
#include< winsock2.h>
br> struct msg {无符号__int8填充;
无符号__int16 dataSize;
__int32 value1;
__int32 value2;
};
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)
{
}
if(data-> version!= 1)
{
返回-1;
}
int charDataSize = sizeof(data-&b; buff);
/* if(charDataSize! = data-> dataSize)
{
} */
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 __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)
{
返回-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<< ; "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