我写的一个SOCKET的程序,客户端CONNECT这个函数有的时候不能成功。SOCKET服务程序正常,网络正常。会是什么原因呢?
附程序源码:SOCKET客户端:
SOCKET s = 0;
struct sockaddr_in address;
WSADATA wsaData;
int nStatus;
unsigned long ulAddress;
int nPort = atoi(szPort);
if (!nPort) nPort = SOCK_PORT; nStatus = WSAStartup(0x101, &wsaData);
if (nStatus != 0)
return WriteSocketErrLog(1, szSend); if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
return WriteSocketErrLog(2, szSend); s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
return WriteSocketErrLog(3, szSend); ulAddress = inet_addr (szAddr);
memset((void*)(&address), 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = nPort;
address.sin_addr.s_addr = ulAddress; if (connect(s, (struct sockaddr*)&address, sizeof(address)) == SOCKET_ERROR)
return WriteSocketErrLog(4, szSend); char szMessage[1024]; char szLocalName[255];
char szLocalIP[80];
PHOSTENT hostinfo; if( gethostname ( szLocalName, sizeof(szLocalName)) == 0 )
{
if((hostinfo = gethostbyname(szLocalName)) != NULL)
{
strcpy(szLocalIP, inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list));
}
} if (GetSendString(szSend, szMessage, bSendName, szLocalName, szLocalIP) > 1024)
return WriteSocketErrLog(6, szSend); if (send(s, szMessage, strlen(szMessage), 0) == SOCKET_ERROR)
return WriteSocketErrLog(5, szSend); closesocket(s);
WSACleanup();
return 0;
附程序源码:SOCKET客户端:
SOCKET s = 0;
struct sockaddr_in address;
WSADATA wsaData;
int nStatus;
unsigned long ulAddress;
int nPort = atoi(szPort);
if (!nPort) nPort = SOCK_PORT; nStatus = WSAStartup(0x101, &wsaData);
if (nStatus != 0)
return WriteSocketErrLog(1, szSend); if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
return WriteSocketErrLog(2, szSend); s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
return WriteSocketErrLog(3, szSend); ulAddress = inet_addr (szAddr);
memset((void*)(&address), 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = nPort;
address.sin_addr.s_addr = ulAddress; if (connect(s, (struct sockaddr*)&address, sizeof(address)) == SOCKET_ERROR)
return WriteSocketErrLog(4, szSend); char szMessage[1024]; char szLocalName[255];
char szLocalIP[80];
PHOSTENT hostinfo; if( gethostname ( szLocalName, sizeof(szLocalName)) == 0 )
{
if((hostinfo = gethostbyname(szLocalName)) != NULL)
{
strcpy(szLocalIP, inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list));
}
} if (GetSendString(szSend, szMessage, bSendName, szLocalName, szLocalIP) > 1024)
return WriteSocketErrLog(6, szSend); if (send(s, szMessage, strlen(szMessage), 0) == SOCKET_ERROR)
return WriteSocketErrLog(5, szSend); closesocket(s);
WSACleanup();
return 0;
解决方案 »
- openGL中我初始化数据发生中断,求帮助
- 与下位机USB通信
- 问个SetTimer的问题
- 求 MFC 注册表搜索例子
- 我想让各大搜索引擎都能搜索我的网站http://www.5158h.com,请问怎么才能做到?
- 对话框嵌入视图后,出现轻微的闪烁,大侠进来看看,分不多了
- 将线程函数写在类里边,怎么解决线程的调用问题
- 在程序还没有进入 WinMain(),就出现error!
- 微软的开发俱乐部网站如何才能进入呢?
- VC++开发GPS,GIS!
- 最新的Platform SDK 中的Help 下的帮助文件用什么可以打开啊!·不是CHM了!:(
- c++中,string类的find函数可以在一个字符串中查找另一个字符串,c语言中有现成的函数吗?
m_scSocket = socket( AF_INET, SOCK_STREAM, 0 );
if( m_scSocket == INVALID_SOCKET )
{
m_iError = 3; //不能建立套接字!
return FALSE;
}addr.sin_family = AF_INET;
addr.sin_port = htons( u16Port );
addr.sin_addr.s_addr = htonl( INADDR_ANY );if( bind( m_scSocket, (LPSOCKADDR)&addr, sizeof(addr) ) == SOCKET_ERROR )
{
closesocket( m_scSocket );
m_iError = 4; //不能进行绑定!
return FALSE;
}addr.sin_family = AF_INET;
addr.sin_port = htons( u16Port );
addr.sin_addr.s_addr = inet_addr( szIPAddr );if( connect( m_scSocket, (LPSOCKADDR)&addr, sizeof(addr) ) == SOCKET_ERROR )
{
m_iError = 9; //不能进行连接!
return FALSE;
}
return TRUE;
m_scSocket = socket( AF_INET, SOCK_STREAM, 0 );
if( m_scSocket == INVALID_SOCKET )
{
m_iError = 3; //不能建立套接字!
return FALSE;
}addr.sin_family = AF_INET;
addr.sin_port = htons( u16Port );
addr.sin_addr.s_addr = htonl( INADDR_ANY );if( bind( m_scSocket, (LPSOCKADDR)&addr, sizeof(addr) ) == SOCKET_ERROR )
{
closesocket( m_scSocket );
m_iError = 4; //不能进行绑定!
return FALSE;
}addr.sin_family = AF_INET;
addr.sin_port = htons( u16Port );
addr.sin_addr.s_addr = inet_addr( szIPAddr );if( connect( m_scSocket, (LPSOCKADDR)&addr, sizeof(addr) ) == SOCKET_ERROR )
{
m_iError = 9; //不能进行连接!
return FALSE;
}
return TRUE;
再根据错误信息,浏览MSDN。
address.sin_addr.s_addr = ulAddress;端口和IP地址都要用函数转换的
是不是和TCP的流模式有关?
一次收下了2个包,你以为只收到一个...