返回信息流问题写在程序的注释中,高人指点一下啊,不胜感激!!!
/*
客户端的程序
*/
#include<iostream>
#include<string>
#include<winsock2.h>
#pragma comment( lib, "Ws2_32.lib" )
using namespace std;
int main()
{
SOCKET clientSock;
struct sockaddr_in local,from;
WSADATA wsadata;
unsigned short port=0;
char ip[16];
memset(ip,'\0',sizeof(ip));
cout<<"请输入服务器的ip地址:";
cin>>ip;
cout<<"请输入服务器的端口号:";
cin>>port;
if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
cout<<"无法启winsock"<<endl;
return 0;
}
from.sin_family=AF_INET;
from.sin_port=htons(port);
from.sin_addr.S_un.S_addr=inet_addr(ip);
clientSock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(clientSock==INVALID_SOCKET)
{
cout<<"无法为client创建socket"<<endl;
WSACleanup();
return 0;
}
local.sin_family=AF_INET;
local.sin_port=htons(0);
local.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
if(bind(clientSock,(struct sockaddr*)&local,sizeof(local))!=0)
{
cout<<"无法绑定"<<endl;
closesocket(clientSock);
WSACleanup();
return 0;
}
char nak[1];
nak[0]='i';
int fromLen=sizeof(from);
int send=sendto(clientSock,nak,sizeof(nak),0,(struct sockaddr*)&from,fromLen);
recvfrom(clientSock,nak,sizeof(nak),0,(struct sockaddr*)&from,&fromLen);
cout<<"error:"<<WSAGetLastError()<<endl;
/*
服务器端口号是5000
往服务器发送1字节的数据,但是没有启动5000端口的UDP Server程序。
sendto函数依然能够将返回1。----- 这是合理的。
*/
/*????????????
(1)奇怪的是此时如果sendto的目的地址是127.0.0.1或者本机的IP,recvfrom会立即返回-1,如果调用WSAGetLastError将返回10054,
表示"远程主机强迫关闭了现有的一个连接"。奇怪,这明明是UDP,何来连接??
但如果sendto的目的地址不是127.0.0.1或者本机的IP,recvfrom会阻塞在那里---这是合理的
(2)如果不调用sendto函数,直接调用recvfrom(),则recvfrom()将阻塞在这里,不返回。---- 这是合理的
(3)如果启动启动5000端口的UDP Server程序,也不会有什么问题。如果UDP Server收到消息什么都不作反应,
该recvfrom将阻塞在这里,如果UDP Server沿原路返回消息,该recvfrom将收到UDP Server发回的消息。---- 这是合理的
*/
closesocket(clientSock);
WSACleanup();
return 0;
}
/*
服务器端的程序
*/
#include<iostream>
#include<winsock2.h>
#pragma comment( lib, "Ws2_32.lib" )
using namespace std;
int main()
{
SOCKET serverSock;
struct sockaddr_in local,from;
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
cout<<"无法启winsock"<<endl;
return 0;
}
serverSock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(serverSock==INVALID_SOCKET)
{
cout<<"无法为server创建socket"<<endl;
return 0;
}
local.sin_family=AF_INET;
local.sin_port=htons(5000);
local.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
if(bind(serverSock,(struct sockaddr*)&local,sizeof(local))!=0)
{
cout<<"无法绑定"<<endl;
closesocket(serverSock);
return 0;
}
char nak[1];
nak[0]='i';
int fromLen=sizeof(from);
int ret=recvfrom(serverSock,nak,1,0,(struct sockaddr*)&from,&fromLen);
int send=sendto(serverSock,nak,sizeof(nak),0,(struct sockaddr*)&from,fromLen);
closesocket(serverSock);
WSACleanup();
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / soft-design / #23820同步于 2008/1/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
急!一个关于recvfrom的问题!!!奇怪啊
honeysuckle
2008/1/3镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复