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:此服务器程序若改为先发送后接收,则客户端前两次接收的出现乱码,后面全部正常,不知道为什么? 展开
#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:此服务器程序若改为先发送后接收,则客户端前两次接收的出现乱码,后面全部正常,不知道为什么? 展开
3个回答
展开全部
调用WSAGetLastError察看一下返回值,这个error的原因。
可以用netstat查看一下4000端口是否有程序占用,至于乱码,把你的sendbuf初始化为全零试试看。
可以用netstat查看一下4000端口是否有程序占用,至于乱码,把你的sendbuf初始化为全零试试看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用的是阻塞方式进行的通信,当通信超时时就会出现错误,可以开线程,交替循环三次sendto和recvfrom,失败后,利用catch(...)退出来即可
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.端口4000已经被Windows或其他程序占用;
2.可安装sniffer软件抓取网络封包进行分析。
2.可安装sniffer软件抓取网络封包进行分析。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询