我在<<网络编成与开发技术>>中看到的代码

ga6840 2009-06-24 02:18:01
是一个关于winsocket的最简单源文件
可是分别编译过之后
分别在两台接入因特网的机上运行
客户端程序总显示sending error
请问问题出在哪?
客户端输入的ip 我是通过 服务端 上 http://www.987654.com/ip.asp 查到的
十分感谢大家
辛苦你们了!

客户端:


#include <Winsock.h>
#include <Windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"wsock32.lib")

#define RECV_PORT 2000
#define SEND_PORT 3000

SOCKET sock;
sockaddr_in ServerAddr;

DWORD StartSock(char* ad="24.85.151.22")
{
WSADATA WSADate;
if(WSAStartup(MAKEWORD(2,2), &WSADate ) !=0)
{
//fail
cout<<"情况1"<<endl;
}
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.s_addr= inet_addr (ad);
ServerAddr.sin_port= htons (RECV_PORT);
return 1;
}

DWORD CreatSocket()
{
sock = socket(AF_INET,SOCK_STREAM,0);
if(sock == SOCKET_ERROR)
{
WSACleanup();
//fail
cout<<"情况2"<<endl;
}

return 1;
}

DWORD CallServer()
{
CreatSocket();
if(connect(sock,(sockaddr*) &ServerAddr, sizeof (ServerAddr) ) == SOCKET_ERROR)
{
return -1;
//fail
cout<<"情况1"<<endl;
}
return 1;
}

DWORD TCPSend(char date[])
{
int length;
length = send(sock,date,strlen(date),0);
if(length <= 0)
{
cout<<"sending error"<<endl;
//slosesocket(sock);
WSACleanup();
return -1;
}
return 1;
}

int main()
{
char buff[80];
int num,i;
char ad[80];
cout<<"Please in put adress"<<endl;
cin>>ad;
StartSock(ad);
if(CallServer())
{//有改动
cin>>i;
}

while(1)
{
memset(buff,0,80);
{
cin>>num;
}
if(num<=0)
{
break;
}
for(i=0;i<num;i++)
{
sprintf(buff,"date%d",i);
printf(buff);
cout<<endl;
TCPSend(buff);
Sleep(1000);
}
}
return 0;
}




服务端 :

#include <Winsock.h>
#include <Windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"wsock32.lib")

#define RECV_PORT 2000
#define SEND_PORT 3000

SOCKET sock,sock1;
sockaddr_in ServerAddr;
sockaddr_in ClientAddr;
int Addrlen;

DWORD StartSock()
{
WSADATA WSADate;
if(WSAStartup(MAKEWORD(2,2), &WSADate ) !=0)
{
//fail
return -1;
cout<<"情况1"<<endl;
}
return 1;
}

DWORD CreatSocket()
{
sock = socket(AF_INET,SOCK_STREAM,0);
if(sock == SOCKET_ERROR)
{
WSACleanup();
//fail
return -1;
cout<<"情况2"<<endl;
}
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_addr.s_addr= htonl (INADDR_ANY);
ServerAddr.sin_port= htonl (RECV_PORT);
if(bind( sock,(sockaddr FAR*) &ServerAddr ,sizeof ( ServerAddr )) == SOCKET_ERROR )
{
//fail
return -1;
cout<<"情况4"<<endl;
}
return 1;
}

DWORD ConnectProcess()
{
char buff[80];
Addrlen = sizeof (sockaddr_in);
if(listen(sock,5)<0)
{
//fail
return -1;
cout<<"情况3"<<endl;
}
cout<<"Listening....."<<endl;
while(1)
{
sock1 = accept (sock,(sockaddr FAR*) &ClientAddr,&Addrlen);

while(1)
{
memset(buff,0,80);
if(recv(sock1,buff,80,0)<=0)
{
break;
}
cout<<buff<<endl;
}
}
}

void main()
{
StartSock();
CreatSocket();
ConnectProcess();
}
...全文
32 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ga6840 2009-06-28
  • 打赏
  • 举报
回复
感谢goodname 回答出了问题的关键
谢谢blh所指出的 由于急于实现 翻了低级的错误
我调试成功了 并且的确可以在两台电脑间通讯
有感兴趣的我也很愿意 将我的代码供你参考:clock126@126.com
谢谢csdn
damo_xu 2009-06-25
  • 打赏
  • 举报
回复
127.0.0.1 这个默认的ID在同一台电脑上调试很方便。
cyldf 2009-06-25
  • 打赏
  • 举报
回复
本机上同时运行服务器端和客户端,进行断点调试,找出出错位置和错误码,对照MSDN看详细信息。
lijiawlm 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ga6840 的回复:]
谢谢 lijiawlm 谢谢goodname
我会再去调试
我还想再问:
1.请问网络编程还有什么其他调试的方法,是不是非要找两台上网的电脑才可以实验是否成功?
2.ServerAddr.sin_addr.s_addr= inet_addr (ad);中给inet_addr函数传入的那个ip地址字符数组 是指sever那边的虚拟ip 还是控制面板 网络连接tcp/ip属性里的那个ip ??(不好意思 我概念不清)
再次感谢大家
调试完了我再来回复!
[/Quote]


这个倒不用 可以用127.0.0.1
也可以用虚拟机(麻烦)
blh 2009-06-24
  • 打赏
  • 举报
回复
另外你通过


DWORD TCPSend(char date[])
{
int length;
length = send(sock,date,strlen(date),0);
if(length <= 0)
{
printf("send error: %s\n", strerrno(errno)); //打印出错误的具体内容
cout<<"sending error"<<endl;
//slosesocket(sock);
WSACleanup();
return -1;
}
return 1;
}
blh 2009-06-24
  • 打赏
  • 举报
回复
DWORD CallServer()
{
CreatSocket();
if(connect(sock,(sockaddr*) &ServerAddr, sizeof (ServerAddr) ) == SOCKET_ERROR)
{
return -1; ==> return 0;
//fail
cout<<"情况1"<<endl;
}
return 1;
}



if(CallServer())
{//有改动
cin>>i;
}

CallServer()返回的是-1/1,也就是你connect失败了你还认为是正确的
ga6840 2009-06-24
  • 打赏
  • 举报
回复
谢谢 lijiawlm 谢谢goodname
我会再去调试
我还想再问:
1.请问网络编程还有什么其他调试的方法,是不是非要找两台上网的电脑才可以实验是否成功?
2.ServerAddr.sin_addr.s_addr= inet_addr (ad);中给inet_addr函数传入的那个ip地址字符数组 是指sever那边的虚拟ip 还是控制面板 网络连接tcp/ip属性里的那个ip ??(不好意思 我概念不清)
再次感谢大家
调试完了我再来回复!
icemoon1987 2009-06-24
  • 打赏
  • 举报
回复
恩,学习了,学习了~
lijiawlm 2009-06-24
  • 打赏
  • 举报
回复
还有一种情况就是可能被防火墙拦截 这种情况很常见 你最好先ping一下Server 看看
lijiawlm 2009-06-24
  • 打赏
  • 举报
回复
你的创建函数应该有问题


DWORD CreatSocket()
{
sock = socket(AF_INET,SOCK_STREAM,0); //应该用sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sock == SOCKET_ERROR)
{
WSACleanup();
//fail
cout<<"情况2"<<endl;
}

return 1;
}
lijiawlm 2009-06-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goodname 的回复:]
服务器端
ServerAddr.sin_port= htonl (RECV_PORT);
改为
ServerAddr.sin_port= htons (RECV_PORT);

[/Quote]

真细心 补充一下

不过我感觉htonl 和htons没有什么区别啊
返回结果应该一样啊 ?
感觉没有什么区别啊
goodname 2009-06-24
  • 打赏
  • 举报
回复
服务器端
ServerAddr.sin_port= htonl (RECV_PORT);
改为
ServerAddr.sin_port= htons (RECV_PORT);

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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