Captain_Permission 2013-10-27 15:01 采纳率: 0%
浏览 1259

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"

  • 写回答

1条回答

  • ha_lydms 后端领域优质创作者 2023-03-29 22:11
    关注

    格式化一下吧。这个看的很不舒服呀。看不懂。

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮