socket套接字编程遇到问题,求助各位大神
各位大神,小弟学生党,操作系统作业,老师要求写一个可以实现简单收发报文的程序,要求用到socket套接字。自己去网上查的资料,然后自己尝试写了一个,用的是UDP点到点通信的机制。同一个程序里面我建了两个套接字变量sock和clientsock,分别用于发送和接收(不知道这样是否可行)。
测试的时候,借用寝室同学的电脑,编译运行同一段程序,发送地址和接收地址都是通过查看电脑上本地连接得到的,而且放在同学电脑上编译时候我已经把收发的地址互换了(我这里发送对应他那里的接收地址)。结果我发现,我发给他能收到,但是他发回给我我就收不到了。我去网上查原因,有人说可能是防火墙的问题,我去查看防火墙发现没有拦截记录,然后我又分别写了两个单独收和发的程序,也是用的UDP点到点通信,发送程序放我同学电脑上,接收程序放我电脑,然后我们编译运行测试,发现我可以收到。想了很久都没有找出问题所在,各位大神指点了,不胜感激。
(下面是代码:)
#include<iostream.h>
#include<winsock2.h>
#include<stdio.h>
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<char FAR *>(&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<<buf;
memset(buf,0,256);
}
cout<<endl;
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"