socket收发报文时间长,是不是和网络有关系?
我用自己的计算机作为客户端和服务器端时,立刻就能收到返回消息
在广域网上石沉大海,没有返回消息了……
现在运用到局域网上,是由195和198两张网构成的
(当服务器端和客户端都在195上的时候能立刻收到返回报文)
当服务器端在198(UNIX)上,客户端在195上,大约要50秒才能收到返回的报文
而用Delphi写出来的报文收发客户端却能立刻收到返回报文,我就郁闷了
请问高手怎样改进?在这样的局域网中能立刻收到返回报文?
貌似是send的时间太长……
以下是报文收发源代码:
#include "winsock.h"
#pragma comment(lib, "wsock32")
HICON m_hIcon;
SOCKET m_hSocket;
SOCKADDR_IN m_addr;
void CSimpleClientDlg::StartUp()
{
WSADATA wsaData;
WORD version = MAKEWORD(2, 0);
int ret = WSAStartup(version, &wsaData);
if(ret != 0)
TRACE("Initilize Error!\n");
}
void CSimpleClientDlg::OnOK() //按确定发送并接受报文
{
m_addr.sin_family = AF_INET;
m_addr.sin_addr.S_un.S_addr = inet_addr("198.1.0.3");
m_addr.sin_port = htons(1333);
int ret = 0;
int error = 0;
ret = connect(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));//连接
if(ret == SOCKET_ERROR){
TRACE("Connect Error: %d \n", (error = WSAGetLastError()));
return ;
}
CString str = "20060622|183535|1213|";//报文
char* buf = str.GetBuffer(0);
ret = send(m_hSocket, buf, str.GetLength(), 0);//发送
char buff[256];
ret = recv(m_hSocket, buff, 256, 0);//接收
buff[ret] = '\0';
AfxMessageBox(buff);
}
void CSimpleClientDlg::CleanUp()
{
if (WSACleanup() != 0){
TRACE("UnInitilize Error:%d\n", WSAGetLastError());
}
}
void CSimpleClientDlg::OnCancel()
{
if(m_hSocket != NULL){
closesocket(m_hSocket);
m_hSocket = NULL;
}
CDialog::OnCancel();
}
void CSimpleClientDlg::OnDestroy()
{
CDialog::OnDestroy();
if(m_hSocket != NULL){
closesocket(m_hSocket);
m_hSocket = NULL;
}
CleanUp();
}
问题点数:50、回复次数:3Top
1 楼bluewinwind(风)回复于 2006-07-04 23:25:04 得分 0
函数写的不够好,下面的两行代码都没有判断机制,自己都不能知道自己是否真正的把数据全部发送出去了,
ret = send(m_hSocket, buf, str.GetLength(), 0);//发送
ret = recv(m_hSocket, buff, 256, 0);//接收
Top
2 楼senwe()回复于 2006-07-05 00:44:49 得分 0
我用ret取值就是为了判断,这里都省略了……报文也不是这样固定死的……
都是主要的socket代码
在198网络上的两台PC之间也能实时收发,但是换了一台UNIX的服务器就会有50秒的延时……这就让我纳闷了Top
3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2006-07-05 08:15:43 得分 0
如果Delphi的代码没问题,那么应该是你VC的代码没写好。Top




