WSASocket() 创建的套接字返回0x00000, 为什么会这样?

konfyt 2002-01-09 02:25:30
WSADATA wsd;
struct sockaddr_in local;
int len= sizeof (struct sockaddr_in), optval;
DWORD i=0;

unsigned short iPort=25000;
DWORD dwMulticastGroup=inet_addr("234.5.6.7");
//开始初始化
if (WSAStartup(MAKEWORD(2,2), &wsd)!=0)
return false;

//创建一个套接字
if ((sock= WSASocket( AF_INET,
SOCK_DGRAM,
0,
NULL,
0,
WSA_FLAG_OVERLAPPED| WSA_FLAG_MULTIPOINT_C_LEAF| WSA_FLAG_MULTIPOINT_D_LEAF )
==INVALID_SOCKET))
{
WSACleanup();
return false;
}

local.sin_family= AF_INET;
local.sin_port= htons(iPort);
local.sin_addr.s_addr= htonl (INADDR_ANY);

if (bind(sock, (struct sockaddr *)&local, sizeof(local))== SOCKET_ERROR)
{
closesocket(sock);
WSACleanup();
return false;

}


请问错在哪里?
...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
konfyt 2002-01-09
  • 打赏
  • 举报
回复
搞定,谢谢各位
konfyt 2002-01-09
  • 打赏
  • 举报
回复
caiyi9000(只懂Winsock) :
我找你的方法做了:
BOOL CSuperVisingDlg::InitMulticastParam(int iVideo)
{
WSADATA wsd;
struct sockaddr_in local;
int len= sizeof (struct sockaddr_in), optval;
DWORD i=0;

unsigned short iPort=25000;
DWORD dwMulticastGroup=inet_addr("234.5.6.7");
//开始初始化
if (WSAStartup(MAKEWORD(2,2), &wsd)!=0)
return false;

//创建一个套接字
sock=WSASocket(
FROM_PROTOCOL_INFO ,
FROM_PROTOCOL_INFO ,
FROM_PROTOCOL_INFO ,
NULL,
0,
WSA_FLAG_OVERLAPPED| WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);

if (sock==INVALID_SOCKET) //在这里还是失败了,不知为何故?
{
WSACleanup();
return false;
}

if(WSAAsyncSelect(sock,m_hWnd ,IP_EVENT,FD_CONNECT |
FD_CLOSE | FD_WRITE | FD_READ)==SOCKET_ERROR )
{
closesocket(sock);
WSACleanup( );
return FALSE;
}



sockaddr_in m_MultiGroup;
m_MultiGroup.sin_addr.s_addr = inet_addr("234.5.6.7");
m_MultiGroup.sin_family=AF_INET;
m_MultiGroup.sin_port=htons(2000);

if(WSAJoinLeaf(sock, (struct sockaddr FAR * )&m_MultiGroup, sizeof
(sockaddr), NULL, NULL, NULL, NULL, JL_BOTH) == INVALID_SOCKET)
{
closesocket(sock);
WSACleanup( );
return false;
}

return true;
sweet 2002-01-09
  • 打赏
  • 举报
回复
upp
konfyt 2002-01-09
  • 打赏
  • 举报
回复
caiyi9000(只懂Winsock) :

我没有把后面的代码贴上来,我是照 《windows网络编程》第11章的sock2多播写的,他邦订了本地端口好在本地也接收到
caiyi9000 2002-01-09
  • 打赏
  • 举报
回复
你这段代码想干什么?看你用WSASocket()函数,是想创建一个多播套接字,可是你为什么还要绑定本地端口,而又没有调用WSAJoinLeaf()让这个SOCKET加入多播组呢?而且你调用WSASocket()函数的输入参数也有问题,正确调用是:
sock=WSASocket(FROM_PROTOCOL_INFO ,
FROM_PROTOCOL_INFO ,
FROM_PROTOCOL_INFO ,
NULL,
0,
WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);

if(sock==INVALID_SOCKET)
{
WSACleanup( );
return FALSE;
}


然后再为将此SOCKET设置为异步非阻塞模式并注册各种异步事件(如果你用的是异步非阻塞模式)。
if(WSAAsyncSelect(socke,m_hWnd ,IP_EVENT,FD_CONNECT |
FD_CLOSE | FD_WRITE | FD_READ)==SOCKET_ERROR )
{
closesocket(sock);
WSACleanup( );
return FALSE;
}
其中m_hWnd是你的应用程序的主窗口的句柄,用来接收各种网络异步消息。如果你的应用程序是个对话框程序,那么m_hWnd就是此对话框的句柄。
IP_EVENT是你自己定义的用户消息,你要为此消息映射自己的回调函数,并在此回调函数中处理各类网络异步事件。

你并不需要为此SOCKET绑定到本地端口,你要做的是调用WSAJoinLeaf()加入一个多播组:
先要定义一个多播地址,IP地址是一个D类地址,可以用"234.5.6.7"。
sockaddr_in m_MultiGroup;
m_MultiGroup.sin_addr.s_addr = inet_addr("234.5.6.7");
m_MultiGroup.sin_family=AF_INET;
m_MultiGroup.sin_port=htons(2000);

if(WSAJoinLeaf(sock, (struct sockaddr FAR * )&m_MultiGroup, sizeof
(sockaddr), NULL, NULL, NULL, NULL, JL_BOTH) == INVALID_SOCKET)
{
closesocket(m_Socket);
WSACleanup( );
return FALSE;
}

其中最后一个参数表示加入多播组的属性。
JL_BOTH表示加入此多播组的各节点处于平等地位,两两可以双向通信。即此SOCKET加入一个无根方式的多播组,并成为叶,一般用于在线交流;
JL_SENDER_ONLY表示仅发送,即此SOCKET加入一个有根方式的多播组,并成为根,一般用于视频点播的服务器端;
JL_RECEIVER_ONLY表示仅接收,即此SOCKET加入一个有根方式的多播组,并成为叶,一般用于视频点播的客户端。
konfyt 2002-01-09
  • 打赏
  • 举报
回复
还有,出现下列连接错误,是哪个 lib没有?

Linking...
MemPlayDlg.obj : error LNK2001: unresolved external symbol "unsigned int sock" (?sock@@3IA)
MemPlayDlg.obj : error LNK2001: unresolved external symbol "struct sockaddr_in from" (?from@@3Usockaddr_in@@A)

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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