VC网络编程socket创建成功但是bind失败(很简单)

以下是源码:#include"stdafx.h"#include<stdio.h>#include<Winsock2.h>#pragmacomment(lib,"ws2_... 以下是源码:
#include "stdafx.h"
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")

void main()
{
//初始化socket库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}

//初始化套接字

SOCKADDR_IN addrSrv ;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY) ;
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(4000) ;

SOCKET sockSrv = socket( AF_INET , SOCK_DGRAM , IPPROTO_UDP) ;
if(bind(sockSrv , (SOCKADDR*)&addrSrv , sizeof(SOCKADDR) )== SOCKET_ERROR)
printf("bind error\n");

char sendBuf[100] ;
char recvBuf[100] ;
char tempBuf[200] ;

SOCKADDR_IN addrClient ;
int len = sizeof(SOCKADDR) ;

while (1)
{

printf("The received string is:\n");
//接收数据,碰到q结束
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len) ;
if ( 'q' == recvBuf[0] )
{
sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len) ;
printf("chat end!\n") ;
break ;
}

sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf) ;
printf( "%s\n" , tempBuf ) ;

//发送数据
printf( "Please input data:\n" ) ;
gets( sendBuf ) ;
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len) ;

}//结束while

closesocket( sockSrv ) ;
WSACleanup() ;
}
程序编译成功,但执行时总是“bind error”,请教高手如何解决,万分干洗!
1:已经解决了,将端口号改为1000,或者5566均可,为什么4000不可?
2:此服务器程序若改为先发送后接收,则客户端前两次接收的出现乱码,后面全部正常,不知道为什么?
展开
 我来答
reallygone
2011-01-04 · 超过31用户采纳过TA的回答
知道答主
回答量:75
采纳率:0%
帮助的人:54.4万
展开全部
调用WSAGetLastError察看一下返回值,这个error的原因。

可以用netstat查看一下4000端口是否有程序占用,至于乱码,把你的sendbuf初始化为全零试试看。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Quasimodo2001
2011-01-03 · TA获得超过254个赞
知道小有建树答主
回答量:211
采纳率:0%
帮助的人:203万
展开全部
用的是阻塞方式进行的通信,当通信超时时就会出现错误,可以开线程,交替循环三次sendto和recvfrom,失败后,利用catch(...)退出来即可
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yifanfeng93
推荐于2017-09-15 · TA获得超过147个赞
知道答主
回答量:129
采纳率:0%
帮助的人:0
展开全部
1.端口4000已经被Windows或其他程序占用;
2.可安装sniffer软件抓取网络封包进行分析。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式