Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为windows绑定C语言_C_Sockets_Bind - Fatal编程技术网

为windows绑定C语言

为windows绑定C语言,c,sockets,bind,C,Sockets,Bind,在Windows(C语言)上使用绑定方法时遇到问题。好。我的代码应该执行以下操作: 从用户处获取2个地址:一个必须是本地计算机的ip地址,另一个必须是远程地址(例如google地址) 我正在编写的应用程序将绑定到本地地址 应用程序将连接到第二个地址 我从网上得到一些代码。你可以看到我就评论咨询过的所有来源 This application will only accepts a string from the client (which specifies the local address w

在Windows(C语言)上使用绑定方法时遇到问题。好。我的代码应该执行以下操作:

  • 从用户处获取2个地址:一个必须是本地计算机的ip地址,另一个必须是远程地址(例如google地址)
  • 我正在编写的应用程序将绑定到本地地址
  • 应用程序将连接到第二个地址
  • 我从网上得到一些代码。你可以看到我就评论咨询过的所有来源

    This application will only accepts a string from the client (which specifies the local
    address which the application will bind), then, the app will connect to a remote service
    google, youtube or whatever. The main purpose that this app serves is to know if, when
     binded to a local address, the operative system (in this case Windows Based system) gives priority to:
    - SA/DA rule
    - Forwarding table
    
    
    
    
    SOURCES:
    
    http://stackoverflow.com/questions/2065495/using-a-specific-network-interface-for-a-socket-in-windows
    http://stackoverflow.com/questions/2605182/when-binding-a-client-tcp-socket-to-a-specific-local-port-with-winsock-so-reuse
    http://www.delta-search.com/?q=error+on+binding+to+local+address%2Cwindows&s=web&as=0&rlz=0&babsrc=HP_ss
    http://social.msdn.microsoft.com/Forums/zh/vcgeneral/thread/763a00ab-0e7f-44c6-9794-840fc6cb2e07
    http://www.delta-search.com/?q=add+ws2_32.lib+visual+studio+2010&babsrc=HP_ss&s=web&rlz=0&as=3&ac=0%2C331
    http://stackoverflow.com/questions/5220309/why-am-i-getting-linker-errors-for-ws2-32-dll-in-my-c-program
    http://msdn.microsoft.com/en-US/windows/desktop/aa904949
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550(v=vs.85).aspx
    
    
    
    #pragma once
    #include <winsock2.h>
    #pragma comment(lib, "ws2_32.lib")
    #include <Ws2tcpip.h>
    #include <stdio.h>
    
    
    void Abort(char *msg);
    
    void main(int argc,char*argv[]){
    
        int ret, fd;
        struct sockaddr_in sa_dst;
        struct sockaddr_in sa_loc;
    
        if(argc < 3)
            Abort("Syntax: SourceIpAddress(to bind) DestinationIpAddress(to connect)");
    
    
        fd = socket(AF_INET, SOCK_STREAM, 0);
    
        // Local
        memset(&sa_loc, 0, sizeof(struct sockaddr_in));
        sa_loc.sin_family = AF_INET;
        sa_loc.sin_port = htons(0);
        sa_loc.sin_addr.s_addr = inet_addr(argv[1]);
    
        if((ret = bind(fd, (struct sockaddr *)&sa_loc, sizeof(struct sockaddr))) < 0)
            Abort("Binding to local address");
    
    
        // Remote
        memset(&sa_dst, 0, sizeof(struct sockaddr_in));
        sa_dst.sin_family = AF_INET;
        sa_dst.sin_port = htons(80);
        sa_dst.sin_addr.s_addr = inet_addr(argv[2]); // google :)
    
        if((ret = connect(fd, (struct sockaddr *)&sa_dst, sizeof(struct sockaddr))) < 0)
            Abort("Connect to remote address");
    
        printf("\n\nConnection Successfully made!!\n\n");    }
    
    void Abort(char *msg){
    fprintf(stderr,"\n\n<ERROR>: <%s>\n",msg);
    perror("\n\nExiting...");
    exit(EXIT_FAILURE);       }
    
    此应用程序只接受来自客户端的字符串(指定本地
    应用程序将绑定的地址),然后,应用程序将连接到远程服务
    谷歌,youtube或者其他什么。此应用程序的主要用途是了解是否、何时
    绑定到本地地址的操作系统(在本例中为基于Windows的系统)优先考虑:
    -SA/DA规则
    -转发台
    资料来源:
    http://stackoverflow.com/questions/2065495/using-a-specific-network-interface-for-a-socket-in-windows
    http://stackoverflow.com/questions/2605182/when-binding-a-client-tcp-socket-to-a-specific-local-port-with-winsock-so-reuse
    http://www.delta-search.com/?q=error+on+binding+到+local+地址%2Cwindows&s=web&as=0&rlz=0&babsrc=HP\U ss
    http://social.msdn.microsoft.com/Forums/zh/vcgeneral/thread/763a00ab-0e7f-44c6-9794-840fc6cb2e07
    http://www.delta-search.com/?q=add+ws2_32.lib+visual+studio+2010&babsrc=HP_ss&s=web&rlz=0&as=3&ac=0%2C331
    http://stackoverflow.com/questions/5220309/why-am-i-getting-linker-errors-for-ws2-32-dll-in-my-c-program
    http://msdn.microsoft.com/en-US/windows/desktop/aa904949
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550(v=vs.85).aspx
    #布拉格语一次
    #包括
    #pragma注释(lib,“ws2_32.lib”)
    #包括
    #包括
    无效中止(字符*消息);
    void main(int argc,char*argv[]){
    int ret,fd;
    SAU dst中的结构sockaddr_;
    sa_loc中的结构sockaddr_;
    如果(argc<3)
    中止(“语法:SourceIpAddress(要绑定)DestinationIpAddress(要连接)”;
    fd=套接字(AF_INET,SOCK_STREAM,0);
    //本地的
    memset(&sa_loc,0,sizeof(struct sockaddr_in));
    sa_loc.sin_family=AF_INET;
    sa_loc.sin_port=htons(0);
    sa_loc.sin_addr.s_addr=inet_addr(argv[1]);
    if((ret=bind(fd,(struct sockaddr*)和sa_loc,sizeof(struct sockaddr)))<0)
    中止(“绑定到本地地址”);
    //遥远的
    memset(&sa_dst,0,sizeof(struct sockaddr_in));
    sa_dst.sin_family=AF_INET;
    sa_dst.sin_端口=htons(80);
    sa_dst.sin_addr.s_addr=inet_addr(argv[2]);//谷歌:)
    如果((ret=connect(fd,(struct-sockaddr*)和sau-dst,sizeof(struct-sockaddr)))<0)
    中止(“连接到远程地址”);
    printf(“\n\n连接成功!!\n\n”);}
    无效中止(字符*消息){
    fprintf(stderr,“\n\n:\n”,msg);
    perror(“\n\n正在…”);
    退出(退出失败);}
    
    问题是bind返回-1。我已经测试过了

    有人能帮我吗


    提前感谢

    当Winsock函数失败时,您可以调用
    WSAGetLastError()
    查找原因


    在这种情况下,您没有调用
    WSAStartup()
    ,因此
    socket()
    失败,出现了一个被忽略的
    wsanotinialized
    错误,因此您最终将一个无效的套接字传递给
    bind()

    ,您根本不需要本地地址或bind()。TCP将在您连接时为您选择一个。