Socket客户端程序,循环发送失败

cai131 2011-05-30 03:23:08



AfxSocketInit();

CSocket aSocket;

CString strIP;
CString strPort;
CString strText;

this->GetDlgItem(IDC_EDIT_IP)->GetWindowText(strIP);
this->GetDlgItem(IDC_EDIT_PORT)->GetWindowText(strPort);
this->GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(strText);

if(!aSocket.Create())
{
char szMsg[1024] = {0};

sprintf(szMsg, "create faild: %d", aSocket.GetLastError());

AfxMessageBox(szMsg);
return;
}

int nPort = atoi(strPort);

if(aSocket.Connect(strIP, nPort))
{

for(int i=0;i<100;i++)
{

char szRecValue[1024] = {0};
aSocket.Send(strText, strText.GetLength());

int iiRecdx=aSocket.Receive((void *)szRecValue, 1024);


if(iiRecdx==-1){
iiRecdx=GetLastError();
sprintf(szRecValue, "===CA返回数据错误码,错误代码为[%d]",iiRecdx);
}

Sleep(2000);
//AfxMessageBox(szRecValue);
}

//AfxMessageBox(szRecValue);
}
else
{
char szMsg[1024] = {0};

sprintf(szMsg, "create faild: %d", aSocket.GetLastError());

AfxMessageBox(szMsg);
}

aSocket.Close();




现在的问题是:我想让它循环发送100次,第一次是成功的,以后的都是错误的,错误代码是10053
wsaeconnaborted (10053)
* 转换 : 软件导致连接中止。
* 说明 : 一个建立连接可能停止由主机计算机, 中软件因数据传输超时或协议错误。


我现在不知道怎么解决,请大家帮忙!


...全文
170 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cai131 2011-06-07
  • 打赏
  • 举报
回复
我只能这样处理了


for(int i=0;i<100;i++)
{

if(!aSocket.Create())
{
char szMsg[1024] = {0};

sprintf(szMsg, "create faild: %d", aSocket.GetLastError());

AfxMessageBox(szMsg);
return;
}

int nPort = atoi(strPort);

if(aSocket.Connect(strIP, nPort))
{


char szRecValue[1024] = {0};
aSocket.Send(strText, strText.GetLength());

int iiRecdx=aSocket.Receive((void *)szRecValue, 1024);


if(iiRecdx==-1){
iiRecdx=GetLastError();
sprintf(szRecValue, "===CA返回数据错误码,错误代码为[%d]",iiRecdx);
}

Sleep(2000);
//AfxMessageBox(szRecValue);


//AfxMessageBox(szRecValue);
}
else
{
char szMsg[1024] = {0};

sprintf(szMsg, "create faild: %d", aSocket.GetLastError());

AfxMessageBox(szMsg);
}

aSocket.Close();
}

wxin 2011-05-31
  • 打赏
  • 举报
回复
服务端接收一个就断开了连接
flandy_feng 2011-05-30
  • 打赏
  • 举报
回复
closesocket返回10035错误;accept之后,服务器对这条连接就收发了一次;而客户端是一直在做收发;
服务器端你可以启动个线程对这条连接进行数据的收发。
cai131 2011-05-30
  • 打赏
  • 举报
回复
closesocket(serverSocket);

这个地方已经改正了,不过情况还是一样啊
bdmh 2011-05-30
  • 打赏
  • 举报
回复
closesocket(serverSocket);
不要放到while内部,放到外面
JackyRao 2011-05-30
  • 打赏
  • 举报
回复
服务器接到客户第一请求建立连接, 而后发送Msg给客户, 并断开这个Socket, 而客户断在以后的连接中没有再次请求连接, 所以导致这个错误。
char szOutMsg[256] = {0};

recv(serverSocket, szRecvMsg, 256, 0);
sprintf(szOutMsg, "Receive Msg: %s \r\n", szRecvMsg);

aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += szOutMsg;
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);

// send(serverSocket, "Have Receive The Msg", 50, 0);

closesocket(serverSocket);
}
}
qq120848369 2011-05-30
  • 打赏
  • 举报
回复
while(!m_exit)
{
serverSocket = accept(aSocket, (sockaddr *)&serverSockaddr, 0);

if(serverSocket == INVALID_SOCKET)
{
continue;
}
else
{
char szRecvMsg[256] = {0};
char szOutMsg[256] = {0};
while(recv(serverSocket, szRecvMsg, 256, 0);)
{
sprintf(szOutMsg, "Receive Msg: %s \r\n", szRecvMsg);

aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += szOutMsg;
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);

send(serverSocket, "Have Receive The Msg", 50, 0);
}
closesocket(serverSocket);
}
qq120848369 2011-05-30
  • 打赏
  • 举报
回复
while(!m_exit)
{
serverSocket = accept(aSocket, (sockaddr *)&serverSockaddr, 0);

if(serverSocket == INVALID_SOCKET)
{
continue;
}
else
{
char szRecvMsg[256] = {0};
char szOutMsg[256] = {0};

recv(serverSocket, szRecvMsg, 256, 0);
sprintf(szOutMsg, "Receive Msg: %s \r\n", szRecvMsg);

aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += szOutMsg;
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);

send(serverSocket, "Have Receive The Msg", 50, 0);

closesocket(serverSocket);
}
要发100次的,你发了一次就关了还发毛发。
cai131 2011-05-30
  • 打赏
  • 举报
回复
服务端的代码



CWinThread *pThread = NULL;
bool m_exit = false;
//线程函数
unsigned int StartServer(LPVOID lParam)
{
WSADATA wsaData;

WORD wVersionRequested = MAKEWORD(1, 1);
int nResult = WSAStartup(wVersionRequested, &wsaData);
if (nResult != 0)
{
return 1;
}
m_exit = false;

CServerDlg *aDlg = (CServerDlg *)lParam;
CString strPort;

aDlg->GetDlgItemText(IDC_EDIT_PORT, strPort);

UINT nPort = atoi(strPort);

//socket------------------------------------------------

SOCKET aSocket, serverSocket;

sockaddr_in serverSockaddr;
memset(&serverSockaddr, 0, sizeof(serverSockaddr));


aSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (aSocket == INVALID_SOCKET)
{
char szError[256] = {0};
sprintf(szError, "Create Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}

BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
setsockopt(aSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&bOptVal, bOptLen);

sockaddr_in aSockaddr;
memset(&aSockaddr,0,sizeof(aSockaddr));

aSockaddr.sin_family = AF_INET;
aSockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
aSockaddr.sin_port = htons((u_short)nPort);

if(bind(aSocket,(sockaddr *)&aSockaddr, sizeof(aSockaddr)) == SOCKET_ERROR)
{
char szError[256] = {0};
sprintf(szError, "Bind Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}

if(listen(aSocket, 10) == SOCKET_ERROR)
{
char szError[256] = {0};
sprintf(szError, "Listen Faild: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}

CString strText;

aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += "Server Start! \r\n";
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);

while(!m_exit)
{
serverSocket = accept(aSocket, (sockaddr *)&serverSockaddr, 0);

if(serverSocket == INVALID_SOCKET)
{
continue;
}
else
{
char szRecvMsg[256] = {0};
char szOutMsg[256] = {0};

recv(serverSocket, szRecvMsg, 256, 0);
sprintf(szOutMsg, "Receive Msg: %s \r\n", szRecvMsg);

aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += szOutMsg;
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);

send(serverSocket, "Have Receive The Msg", 50, 0);

closesocket(serverSocket);
}
}

closesocket(aSocket);
closesocket(serverSocket);

aDlg->GetDlgItemText(IDC_EDIT_LOG, strText);
strText += "Have Close!";
aDlg->SetDlgItemText(IDC_EDIT_LOG, strText);
WSACleanup();
return 0;
}





服务器端也运行在本机,应该没有问题
qq120848369 2011-05-30
  • 打赏
  • 举报
回复
服务端呢?
chinson 2011-05-30
  • 打赏
  • 举报
回复
不懂windows。

不过你可以监听包,看看主动断开方是客户端还是服务端。

64,682

社区成员

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

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