求助winsock!!!

kim_jinye 2010-01-22 04:09:11
请教大家,客户端向服务器发送消息成功后,要接收服务器反馈的消息应该怎么处理?请具体点,最好有伪代码,3Q!
...全文
77 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kim_jinye 2010-01-22
  • 打赏
  • 举报
回复

#ifndef DLL_FILE
#define DLL_FILE
#endif

#include "ftpClient.h"

namespace ftp
{
CftpClient::CftpClient(void)
{
}

CftpClient::~CftpClient(void)
{
}

bool CftpClient::Initialize()
{
// 初始化Winsock版本2.2
if ((WSAStartup(MAKEWORD(2,2),&m_WSADATA)) != 0)
{
MessageBoxA(NULL,"客户端初始化Winsock版本2.2失败","error",NULL);
return false;
}

// 创建套接字
if ((m_Client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET)
{
MessageBoxA(NULL,"客户端创建套接字失败","error",NULL);
WSACleanup();
return false;
}

// 加载配置文件
char ip[MEMMAX];
int port = 0;
OperateFile(ip,port);

// 建立连接
m_SAddr.sin_family = AF_INET;
m_SAddr.sin_port = htons(port);
m_SAddr.sin_addr.s_addr = inet_addr(ip);
if (connect(m_Client,(SOCKADDR*)&m_SAddr,sizeof(m_SAddr)) == SOCKET_ERROR)
{
MessageBoxA(NULL,"客户端建立连接失败","error",NULL);
closesocket(m_Client);
WSACleanup();
return false;
}

return true;
}

bool CftpClient::SendCommand(const COMMAND &command)
{
char* buf = (char*)&command; // 将命令数据转换为字符类型
int ret = 0;
int ind = 0;
int len = MEMMAX;
while (len > 0)
{
// 发送消息
if ((ret=send(m_Client,&buf[ind],len,0)) == SOCKET_ERROR)
{
MessageBoxA(NULL,"客户端发送命令失败","error",NULL);
closesocket(m_Client);
WSACleanup();
return false;
}
len -= ret;
ind += ret;
}

//COMMAND cmd;
//recv(m_Client,(char*)&cmd,sizeof(cmd),0); 在这里就可以收到

// 创建线程
HANDLE thread;
if (ret != SOCKET_ERROR)
{
thread = CreateThread(NULL,0,ThreadProc,(LPVOID)&m_Client,0,NULL);
}

CloseHandle(thread);
shutdown(m_Client,SD_SEND);
closesocket(m_Client);
WSACleanup();

return true;
}

void CftpClient::OperateFile(char* szIP, int &nPort)
{
char tmp[MEMMAX];
GetPrivateProfileStringA(SECTION,"server","0",tmp,MEMMAX,CFGPATH);
strcpy_s(szIP,MEMMAX,tmp);
GetPrivateProfileStringA(SECTION,"port","0",tmp,MEMMAX,CFGPATH);
nPort = (int)atoi(tmp);
}

DWORD WINAPI CftpClient::ThreadProc(const LPVOID lpParam)
{
SOCKET client = (SOCKET)lpParam;
COMMAND command;

//if (recv(client,(char*)&command,sizeof(command),0) == SOCKET_ERROR)
//{
// MessageBoxA(NULL,"客户端接收反馈命令数据失败","error",NULL);
// return -1;
//}
//else
//{
// switch (command.ID)
// {
// case GetDirInfo:
// break;
// case GetFile:
// MessageBoxA(NULL,(char*)command.ID,"error",NULL);
// break;
// case PutFile:
// break;
// case DelFile:
// break;
// case CreateDir:
// break;
// case FileInfo:
// break;
// }
//}
为什么在这里就收不到呢
while (recv(client,(char*)&command,sizeof(command),0) != 0)
{
switch (command.ID)
{
case GetDirInfo:
break;
case GetFile:
MessageBoxA(NULL,"a","error",NULL);
break;
case PutFile:
break;
case DelFile:
break;
case CreateDir:
break;
case FileInfo:
break;
}
}

return 0;
}
}
cattycat 2010-01-22
  • 打赏
  • 举报
回复
服务端直接向客户端发送就行。
服务端recv后,调用send向客户端的socket发送数据。
#include <winsock2.h>
#pragma comment(lib,"WS2_32.lib")
WSADATA wsd;
static UINT port=%%1;
UINT Listen(LPVOID pParam)
{
SOCKET sServer,sClient;
char buf[1024];
int retVal;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失败
}
sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sServer)
{
WSACleanup();
return -1;//创建套接字失败
}
SOCKADDR_IN addrServ;
addrServ.sin_family=AF_INET;
addrServ.sin_port=htons((short)pParam);
addrServ.sin_addr.s_addr=INADDR_ANY;
retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
WSACleanup();
return -1;//绑定套接字失败
}
retVal=listen(sServer,1);
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
WSACleanup();
return -1;//开始监听失败
}
sockaddr_in addrClient;
int addrClientlen=sizeof(addrClient);
sClient=accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen);
if(INVALID_SOCKET==sClient)
{
closesocket(sServer);
WSACleanup();
return -1;//开始接受客户端连接失败
}
ZeroMemory(buf,sizeof(buf));
retVal=recv(sClient,buf,sizeof(buf),0);
if(SOCKET_ERROR==retVal)
{
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return -1;//接收数据失败
}
//向客户端发送
strcpy(buf,"hello world!");
send(sClient,buf,sizeof(buf),0);
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return 0;
}


2.简单客户端
#include <winsock2.h>
#pragma comment(lib,"WS2_32.lib")
WSADATA wsd;
SOCKET sHost;
SOCKADDR_IN servAddr;
char buf[1024];
int retVal;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失败
}
sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sHost)
{
WSACleanup();
return -1;//创建套接字失败
}
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr(%%3);
servAddr.sin_port=htons((short)%%2);
int nServAddlen=sizeof(servAddr);
retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR==retVal) {
closesocket(sHost);
WSACleanup();
return -1;//连接服务器失败
}
ZeroMemory(buf,sizeof(buf));
strcpy(buf,%%3);
retVal=send(sHost,buf,sizeof(buf),0);
if(SOCKET_ERROR==retVal)
{
closesocket(sHost);
WSACleanup();
return -1;//向服务器发送数据失败
}
//接收服务器端的信息
recv(sHost,buf,sizeof(buf),0);
printf("%s\n",buf);

closesocket(sHost);
WSACleanup();
DontKissBossAss 2010-01-22
  • 打赏
  • 举报
回复
// GetWebSiteContent.cpp : Defines the entry point for the console application.
//
/*
@title this code decription that using socket to get content from a http site
@date



*/
#include "stdafx.h"
#include <iostream>
#include <winsock.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

void main()
{
struct hostent *pURL;
struct sockaddr_in addr;
WSADATA WSAData={0};
SOCKET sockfd;
string header;
static char text[BUFSIZ];

WSAStartup(MAKEWORD(2,2), &WSAData);
sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
pURL = gethostbyname("www.baidu.com");
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long*)pURL->h_addr);
addr.sin_port = htons(80);
connect(sockfd,(SOCKADDR *)&addr,sizeof(addr));
header="GET ";
header.append("/");
header.append(" HTTP/1.1\r\n");
header.append("HOST: ");
header.append("www.baidu.com");
header.append("\r\nConnection: Close\r\n\r\n");

send(sockfd, header.c_str(), strlen(header.c_str()), 0);

while (recv(sockfd, text, BUFSIZ, 0) != NULL)
{
cout<<text;
strnset(text, '\0', BUFSIZ);
}
closesocket(sockfd);
WSACleanup();
system("PAUSE");
}

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧