socket编程遇到bind error;求大神指导!纠结了一下午都不知道为啥。。

yybz11 2013-08-05 06:04:07
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define buf_size 64
#include <Winbase.h>
#include <stdlib.h>

int main(int argc,_TCHAR* argv[])
{
WSADATA wsd;
SOCKET sserver;
SOCKET sclient;
int retval;
int on=1;
char buf[buf_size];

//初始化socket
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("wsastartup failed!\n");
return 1;
}

//创建用于监听的socket
sserver=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sserver)
{
printf("socket failed!");
WSACleanup();
return -1;
}

//设置服务器socket地址

SOCKADDR_IN addrserv;
addrserv.sin_family=AF_INET;
addrserv.sin_port=htons(9990);
addrserv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

//绑定socket server到本地地址
retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));
if(SOCKET_ERROR==retval);
{
printf("bind failed!\n");
printf("%d",retval);
closesocket(sserver);
WSACleanup();
return -1;
}

//在socket上进行监听
retval=listen(sserver,1);
if(SOCKET_ERROR==retval);
{
printf("listen failed!\n");
closesocket(sserver);
WSACleanup();
return -1;
}

//接受来自客户端的请求
printf("TCP Server start...\n");
SOCKADDR_IN addrclient;
int addrclientlen=sizeof(addrclient);
sclient=accept(sserver,(const struct sockaddr FAR*)&addrclient,&addrclientlen);
if(INVALID_SOCKET==sclient)
{
printf("accept failed!\n");
closesocket(sserver);
WSACleanup();
return -1;
}

while(1)
{
SecureZeroMemory(buf,buf_size);
retval=recv(sclient,buf,buf_size,0);

printf("recv from client[%s:%d]:%s\n",inet_ntoa(addrclient.sin_addr),addrclient.sin_port,buf);
if(strcmp(buf,"quit")==0)
{
retval=send(sclient,"quit",strlen("quit"),0);
break;
}
else
{
char msg[buf_size];
sprintf(msg,"message received - %s",buf);
retval=send(sclient,msg,strlen(msg),0);
}

}


closesocket(sserver);
closesocket(sclient);
WSACleanup();
}


查了一下午资料,都没搞明白。。希望会的人帮我看一下~~万分感谢
...全文
1322 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2013-08-06
  • 打赏
  • 举报
回复
if(SOCKET_ERROR==retval);
     {
多了一个分号
赵4老师 2013-08-06
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试是程序员必须掌握的技能之一。
max_min_ 2013-08-06
  • 打赏
  • 举报
回复
引用 13 楼 yybz11 的回复:
[quote=引用 10 楼 max_min_ 的回复:] [quote=引用 7 楼 yybz11 的回复:] [quote=引用 2 楼 max_min_ 的回复:]

   int optval = -1; 
    socklen_t optlen = -1; 

 // 设置地址和端口号可以重复使用 
    optval = 1;  
    optlen = sizeof(optval);
    setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, &optval, optlen);
  //绑定前面加上上面的socket属性可 重复使用地址
  retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));


//设置服务器socket地址 int optval = -1; int optlen = -1; // 设置地址和端口号可以重复使用 optval = 1; optlen = sizeof(optval); setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, optlen); SOCKADDR_IN addrserv; addrserv.sin_family=AF_INET; addrserv.sin_port=htons(9990); addrserv.sin_addr.S_un.S_addr=htonl('127.0.0.1'); //绑定socket server到本地地址 retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv)); if(SOCKET_ERROR==retval); { printf("bind failed!\n"); printf("%d",retval); closesocket(sserver); WSACleanup(); return -1; }您好,您看,我根据您的提示把代码改成这样能通过编译的了~但是还是bind错误。。。我用的是codeblocks。。。[/quote]

 //绑定socket server到本地地址
    retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));
    if(SOCKET_ERROR==retval); // 这个你加了if后面的分号,后面是必须执行的哦!
//   这样的吧,我不晓得 你SOCKET_ERROR怎么定义的
    //不过我建议你  if ( retval != 0 )
    if( SOCKET_ERROR == retval )  
    {
        printf("bind failed!\n");
        printf("%d",retval);
        closesocket(sserver);
        WSACleanup();
        return -1;
    }
[/quote]谢谢~~已经发现问题出在那里了。。[/quote] 问题解决了 左上角或者左下角都有 结贴按钮, 结贴是个好习惯哦!
yybz11 2013-08-06
  • 打赏
  • 举报
回复
引用 10 楼 max_min_ 的回复:
[quote=引用 7 楼 yybz11 的回复:] [quote=引用 2 楼 max_min_ 的回复:]

   int optval = -1; 
    socklen_t optlen = -1; 

 // 设置地址和端口号可以重复使用 
    optval = 1;  
    optlen = sizeof(optval);
    setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, &optval, optlen);
  //绑定前面加上上面的socket属性可 重复使用地址
  retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));


//设置服务器socket地址 int optval = -1; int optlen = -1; // 设置地址和端口号可以重复使用 optval = 1; optlen = sizeof(optval); setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, optlen); SOCKADDR_IN addrserv; addrserv.sin_family=AF_INET; addrserv.sin_port=htons(9990); addrserv.sin_addr.S_un.S_addr=htonl('127.0.0.1'); //绑定socket server到本地地址 retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv)); if(SOCKET_ERROR==retval); { printf("bind failed!\n"); printf("%d",retval); closesocket(sserver); WSACleanup(); return -1; }您好,您看,我根据您的提示把代码改成这样能通过编译的了~但是还是bind错误。。。我用的是codeblocks。。。[/quote]

 //绑定socket server到本地地址
    retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));
    if(SOCKET_ERROR==retval); // 这个你加了if后面的分号,后面是必须执行的哦!
//   这样的吧,我不晓得 你SOCKET_ERROR怎么定义的
    //不过我建议你  if ( retval != 0 )
    if( SOCKET_ERROR == retval )  
    {
        printf("bind failed!\n");
        printf("%d",retval);
        closesocket(sserver);
        WSACleanup();
        return -1;
    }
[/quote]谢谢~~已经发现问题出在那里了。。
yybz11 2013-08-06
  • 打赏
  • 举报
回复
引用 11 楼 mujiok2003 的回复:
if(SOCKET_ERROR==retval);
     {
多了一个分号
已经发现~谢谢
max_min_ 2013-08-05
  • 打赏
  • 举报
回复
引用 7 楼 yybz11 的回复:
[quote=引用 2 楼 max_min_ 的回复:]

   int optval = -1; 
    socklen_t optlen = -1; 

 // 设置地址和端口号可以重复使用 
    optval = 1;  
    optlen = sizeof(optval);
    setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, &optval, optlen);
  //绑定前面加上上面的socket属性可 重复使用地址
  retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));


//设置服务器socket地址 int optval = -1; int optlen = -1; // 设置地址和端口号可以重复使用 optval = 1; optlen = sizeof(optval); setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, optlen); SOCKADDR_IN addrserv; addrserv.sin_family=AF_INET; addrserv.sin_port=htons(9990); addrserv.sin_addr.S_un.S_addr=htonl('127.0.0.1'); //绑定socket server到本地地址 retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv)); if(SOCKET_ERROR==retval); { printf("bind failed!\n"); printf("%d",retval); closesocket(sserver); WSACleanup(); return -1; }您好,您看,我根据您的提示把代码改成这样能通过编译的了~但是还是bind错误。。。我用的是codeblocks。。。[/quote]

 //绑定socket server到本地地址
    retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));
    if(SOCKET_ERROR==retval); // 这个你加了if后面的分号,后面是必须执行的哦!
//   这样的吧,我不晓得 你SOCKET_ERROR怎么定义的
    //不过我建议你  if ( retval != 0 )
    if( SOCKET_ERROR == retval )  
    {
        printf("bind failed!\n");
        printf("%d",retval);
        closesocket(sserver);
        WSACleanup();
        return -1;
    }
yybz11 2013-08-05
  • 打赏
  • 举报
回复
引用 4 楼 li_danwang 的回复:
端口被占用?
换了好多个端口。。无一例外都是报错
yybz11 2013-08-05
  • 打赏
  • 举报
回复
引用 3 楼 ForestDB 的回复:
getlasterror能用不?
额。。。不大懂。。刚开始学。。
yybz11 2013-08-05
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:

  int optval = -1;
socklen_t optlen = -1;

// 设置地址和端口号可以重复使用
optval = 1;
optlen = sizeof(optval);
setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, &optval, optlen);
  //绑定前面加上上面的socket属性可 重复使用地址
  retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));




//设置服务器socket地址
int optval = -1;
int optlen = -1;

// 设置地址和端口号可以重复使用
optval = 1;
optlen = sizeof(optval);
setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, optlen);

SOCKADDR_IN addrserv;
addrserv.sin_family=AF_INET;
addrserv.sin_port=htons(9990);
addrserv.sin_addr.S_un.S_addr=htonl('127.0.0.1');

//绑定socket server到本地地址
retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));
if(SOCKET_ERROR==retval);
{
printf("bind failed!\n");
printf("%d",retval);
closesocket(sserver);
WSACleanup();
return -1;
}您好,您看,我根据您的提示把代码改成这样能通过编译的了~但是还是bind错误。。。我用的是codeblocks。。。
max_min_ 2013-08-05
  • 打赏
  • 举报
回复
引用 5 楼 yybz11 的回复:
引用 1 楼 icechenbing 的回复:
报什么错??
就是bind 错误,如果把bind去掉又是listen报错。。

   int optval = -1; 
    socklen_t optlen = -1; 
 
 // 设置地址和端口号可以重复使用 
    optval = 1;  
    optlen = sizeof(optval);
    setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, &optval, optlen);
  //绑定前面加上上面的socket属性可 重复使用地址
  retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));
试试这个,看是不是 地址复用
yybz11 2013-08-05
  • 打赏
  • 举报
回复
引用 1 楼 icechenbing 的回复:
报什么错??
就是bind 错误,如果把bind去掉又是listen报错。。
CodeC 2013-08-05
  • 打赏
  • 举报
回复
端口被占用?
ForestDB 2013-08-05
  • 打赏
  • 举报
回复
getlasterror能用不?
max_min_ 2013-08-05
  • 打赏
  • 举报
回复

   int optval = -1; 
    socklen_t optlen = -1; 

 // 设置地址和端口号可以重复使用 
    optval = 1;  
    optlen = sizeof(optval);
    setsockopt(sserver, SOL_SOCKET, SO_REUSEADDR, &optval, optlen);
  //绑定前面加上上面的socket属性可 重复使用地址
  retval=bind(sserver,(const struct sockaddr*)&addrserv,sizeof(addrserv));


恨天低 2013-08-05
  • 打赏
  • 举报
回复
报什么错??

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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