2 bdxk1992 bdxk1992 于 2013.10.27 23:01 提问

C++套接字编程遇到问题,求助大神

小弟大学党,操作系统老师布置作业,写一个可以实现收发报文的小程序,要求使用socket套接字。自己去网上查找资料,尝试写了一个,开始单独收或者单独发的时候都没问题,但是想把收发的功能整合到一个程序里面的时候遇到问题。
我用的是UDP点对点通信机制,测试的时候,用了寝室同学的电脑,两台电脑在相同平台下(vc++ 6.0)编译运行,在编译之前把接收绑定的地址和发送地址对调(我这里的发送地址对应他那边的接收地址,地址都是在本地连接上查看的)。但是我发现,我给他发报文都没问题,他可以接收,但是他给我发就不可以了。我去网上查询,说是可能是防火墙的原因,但是我查询了没有拦截记录(查的杀毒软件自带的防火墙的拦截记录),仔细看了看代码也没觉得哪里有错,小弟没有系统地学过这个,都是自己找的一点资料和一些实例代码,模仿着写的,实在不知道问题出在哪,求助各位大神,不胜感激。
ps:我在建立套接字变量的时候,同一socket环境下建立了两个,sock和clientsock分别用于发和收,找的实例里面好像都没有这么写的,不知道是不是这里出了问题(自己猜的)。
下面是代码:
#include
#include
#include
void main()
{
SOCKET sock,clientsock;
char szmsg[256];
//1)启动socket库,版本为2.0
WORD versionrequested;
WSADATA wsadata;
versionrequested=MAKEWORD(2,0);
int err=WSAStartup(versionrequested,&wsadata);
if(err!=0)
{
cout<<"socket2.0 初始化失败"<<endl;
return;
}

//2)检查版本号
if(LOBYTE(wsadata.wVersion)!=2||HIBYTE(wsadata.wVersion)!=0)
{
WSACleanup();
return;
}
//3)创建socket
sock=socket(AF_INET,SOCK_DGRAM,0);
clientsock=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==sock||INVALID_SOCKET==clientsock)
{
cout<<"创建套接字失败"<<endl;
return;
}

//4)设置该套接字为广播类型
bool opt=true,opt1=true;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char FAR )(&opt),sizeof(opt));
setsockopt(clientsock,SOL_SOCKET,SO_BROADCAST,(char FAR *)(&opt1),sizeof(opt1));
//5)设置发送地址
sockaddr_in addrto;
memset(&addrto,0,sizeof(addrto));
addrto.sin_family=AF_INET;
addrto.sin_addr.s_addr=inet_addr("
**.***.***.***");
addrto.sin_port=htons(6888);
int nlen=sizeof(addrto);
//6)设置接收地址
sockaddr_in from;
memset(&from,0,sizeof(from));
from.sin_family=AF_INET;
from.sin_addr.s_addr=inet_addr("***.***.***.***");
from.sin_port=htons(6888);
//7)绑定接受地址
bind(clientsock,(sockaddr*)&from,sizeof(from));
memset(&from,0,sizeof(from));
int fromlength=sizeof(SOCKADDR);
char buf[256];
memset(buf,0,sizeof(buf));
long number=0;
//8)设置超时
int timeout=1000;
setsockopt(clientsock,SOL_SOCKET,SO_RCVTIMEO,reinterpret_cast(&timeout),sizeof(timeout));
int counters=0,temp=0;
//9)开始收发
while(1)
{
temp=0;
if(counters++==0)
{
while(recv(clientsock,buf,256,0)>0)
{
if(temp++==0)
{
Beep(1000,1000);
cout<<"收到信息:";
}
cout< memset(buf,0,256);
}
cout counters++;
}
else
{
while(1)
{
if(recv(clientsock,buf,256,0)>0)
{
if(temp++==0)
{
Beep(1000,1000);
cout<<"收到信息:";
}
cout<<buf;
memset(buf,0,256);
break;
}
}
cout<<endl;
}

            cout<<"发送消息:"<<endl;
    gets(szmsg);
    if(sendto(sock,szmsg,strlen(szmsg),0,(sockaddr*)&addrto,nlen)==SOCKET_ERROR)
        cout<<WSAGetLastError()<<endl;
    else
        cout<<"(a message was sended)"<<endl;
}
if(!closesocket(sock)||!closesocket(clientsock))//关闭套接字
{
    WSAGetLastError();
    return;
}
if(!WSACleanup())//关闭Socket库
{
    WSAGetLastError();
    return;
}
return;

}
///////////////////////////////////////////////////////////////////////////////////////////
//如果是直接写cpp文件(没有建库),点击:工程->设置->链接,在对象/库模块后面加入"ws2_32.lib"

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!