winsock2无法绑定套接字

时间:2015-01-11 20:28:25

标签: c++ sockets winsock2

我是winapi的新手(winsocket2)。这是我的完整代码(否则我可以编译,但是我的程序编译但是似乎不起作用(不绑定套接字绑定函数返回-1)。)

#include<winsock2.h>
#include<ws2tcpip.h>
#include<stdio.h>
#include<iostream>
using namespace std;
WSADATA sData;
SOCKADDR_IN linker;
SOCKET sSocket;
int main()
{
    if(WSAStartup(MAKEWORD(2,3),&sData)!=0)
    {
        cout<<"Cannot startup WINsocket";
        return -1;
    }
    cout<<"\tWINsocket loaded!\n\n";
    if(sSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)
    {
        cout<<"Invalid socket.";
        return -1;
    }
    cout<<"\tSocket loaded!\n\n";
    linker.sin_family=AF_INET;
    linker.sin_addr.s_addr=INADDR_ANY;
    linker.sin_port=htons(3490);
    memset( &( linker.sin_zero ), '\0', 8 );
    char yes='1';
    if( setsockopt( sSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( yes ) ) == - 1 )
    {
        perror( "setsockopt" );
       exit(1);
    }
    if(bind(sSocket,(struct sockaddr*)&linker,sizeof(linker))==SOCKET_ERROR)
        cout<<"lol";

    cout<<"\tSocket succesfully binded!\n\n";
    listen(sSocket,10);
}

我试过这个,如果绑定

就粘贴
char yes='1';
      if( setsockopt( sSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof( yes ) ) == - 1 )
      {
      perror( "setsockopt" );
      exit(1);
      }

但这个功能只是打印出来     setsockopt:没有错误 并退出。  谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

SO_REUSEADDR选项需要一个BOOL类型的参数,它是int的typedef。我怀疑传递char导致了问题:setsockopt()将拒绝分配选项,除非最后一个参数的大小与预期大小匹配,这在您的情况下不正确({{1 }})。

换句话说,您可以将代码更改为:

sizeof(char) != sizeof(BOOL)

答案 1 :(得分:1)

if(sSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)

圆括号问题。试试这个:

if((sSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)