VC编写(server client)的代码能够成功连接
JAVA编写的(server client)也能够连接成功.但是VC和JAVA互连就是连不上,不知道什么原因,检查代码发现JAVA用的是UDP,而VC用TCP,
后来将JAVA也改成TCP,但是还是不能连接.
不知道什么原因?
请高手指点.//java代码 client
Socket socket=new Socket("192.168.0.1",5000,true);//根据JAVA文档,true是TCP,false是UDP//VC代码 server
m_sockaddr.sin_addr.s_addr=inet_addr(m_szIP);//htonl(INADDR_ANY);
m_sockaddr.sin_family=AF_INET;
m_sockaddr.sin_port=m_nPort;//htons(5000);
m_nAddlen=sizeof(m_sockaddr); m_sockServer=socket(AF_INET,SOCK_STREAM,0); bind(m_sockServer,(sockaddr*)&m_sockaddr,m_nAddlen))
accept(dlg->m_sockServer,(sockaddr*)&(dlg->m_sockaddr),&(dlg->m_nAddlen)
JAVA编写的(server client)也能够连接成功.但是VC和JAVA互连就是连不上,不知道什么原因,检查代码发现JAVA用的是UDP,而VC用TCP,
后来将JAVA也改成TCP,但是还是不能连接.
不知道什么原因?
请高手指点.//java代码 client
Socket socket=new Socket("192.168.0.1",5000,true);//根据JAVA文档,true是TCP,false是UDP//VC代码 server
m_sockaddr.sin_addr.s_addr=inet_addr(m_szIP);//htonl(INADDR_ANY);
m_sockaddr.sin_family=AF_INET;
m_sockaddr.sin_port=m_nPort;//htons(5000);
m_nAddlen=sizeof(m_sockaddr); m_sockServer=socket(AF_INET,SOCK_STREAM,0); bind(m_sockServer,(sockaddr*)&m_sockaddr,m_nAddlen))
accept(dlg->m_sockServer,(sockaddr*)&(dlg->m_sockaddr),&(dlg->m_nAddlen)
java、VC建立TCP连接本身没甚么问题,因为它们必须使用相同的底层网络协议。但是java对象可以序列号再通过网络传输,这在VC端肯定是无法解析的,不知是否是java代码传了对象。
另外,TCP和UDP相应的接收和发送函数是不同的,建议检查一下,是否java代码中存在这方面问题,因为你说java客户端原来是UDP的。或者写个java的TCP客户端测试一下。
如果我没有记错的话JAVA中和C++中WORD的字节大小是不一样的,还有其它类型也是如此。
因此这类跨平台的通信,强烈建议传输时以BYTE为单位进行传输(字节流的方式)。
特别是VC不要用CSocket+CArchive+CSocketFile这类方式和java程序通信。
第二,你的服务器端m_sockServer=socket(AF_INET,SOCK_STREAM,0);错误,应该是
m_sockServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
现在错误变成连接超时,本来的错误是连接被拒绝.
你在服务器端运行netstat -na ,看TCP的5000端口是否已经在监听。
如果两者都是YES,那你看两台机器是否能ping通。
所说的情况多是正常的,可是就是不知道为什么连接不上.
m_sockaddr.sin_port=m_nPort;-------->改为htons(m_nPort)
哈哈,比较弱智的一个问题,不好意思,自己很久才发现.
后来又发生一个问题,连接成功后,发现VC发送给JAVA的数据收不到,搞了好久才发现,
char* pData = sData.GetBuffer(sData.GetLength())
而pData没有结束符号,JAVA那边是按行来接收的,所以,没有结束符号,就一直不能接收成功,
所以才pData后加个'\n'结束符号就OK了。