socket编程bind浮动ip

           正常情况下一个网卡对应一个ip,在进行socke客户端编程时,如果不调用bind方法则默认客户端绑定本机第一块网卡的ip。如果我们想用第二个ip来和服务器进行socket通信则需调用bind方法,并在传入sockaddr_in的结构体中指定端口和ip。

 

    在linux服务器上进行测试,服务器网卡的ip是192.168.8.122,我新增一个虚拟ip:192.168.8.133(linux命令:ifconfig eth0:1 192.168.8.133 netmask 255.255.255.0

 

代码:

#include <stdio.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>  
#include <errno.h>
#include <string.h>

#define CLIENT_IP_DEF "192.168.8.133"           //客户端绑定的ip
#define SERVER_IP_DEF "192.168.8.108"           //连接服务端的ip
#define CLIENT_PORT_DEF 11211                        //客户端绑定的端口
#define SERVER_PORT_DEF 8899                        //服务端绑定的端口

int main(int argc, char *argv[])
{
        int     socket_id;
        struct  sockaddr_in server_addr,client_addr;
        
        memset(&server_addr, 0, sizeof(server_addr));
        memset(&client_addr, 0, sizeof(client_addr));
        
        client_addr.sin_port = htons(CLIENT_PORT_DEF);
        client_addr.sin_family = AF_INET;
        client_addr.sin_addr.s_addr = inet_addr(CLIENT_IP_DEF);
       
        server_addr.sin_port = htons(SERVER_PORT_DEF);
        server_addr.sin_family = AF_INET;
        server_addr.sin_addr.s_addr = inet_addr(SERVER_IP_DEF);
    
        if ((socket_id = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
                printf("create socket error,err:[%d](%s)", errno, strerror(errno));
                return -1;
        }


   /***这里可以省略掉,则绑定到192.168.8.122ip上,端口随机分配***/
         if(bind(socket_id,(struct sockaddr *)&client_addr,
                sizeof(client_addr)) <0)
         {
              printf("bind socket error, err:[%d](%s)", errno, strerror(errno));
               return -1;
         }
      /********************/


        if( connect(socket_id, (struct sockaddr *)&server_addr,
                sizeof(server_addr)) < 0 )
        {
                printf("connect error,err:[%d](%s)", errno, strerror(errno));
                return -1;
        }
        
        while(1);
        
        close(socket_id);
}

  

绑定后连接服务端结果结果:

 

 

转载于:https://www.cnblogs.com/samurail/archive/2013/05/09/3069377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
socket网络编程中,bind()函数的作用是将一个指定的终结点(IP地址和端口号)绑定Socket句柄上,以便建立连接和进行通信。通过调用bind()函数,可以将指定的终结点与Socket句柄相关联。 具体来说,bind()函数的参数包括三个部分:地址簇(address family),Socket类型(type)和协议(protocol)。地址簇指定了通信的协议,例如IPv4(AF_INET)或本地套接字(AF_LOCAL、AF_UNIX)。Socket类型定义了Socket的属性,例如流式套接字(SOCK_STREAM)或数据报套接字(SOCK_DGRAM)。协议则指定了具体使用的传输协议,如TCP或UDP。 在IPv4中,bind()函数使用的结构体是sockaddr_in,其中包含了地址簇(sin_family)、端口号(sin_port)和IP地址(sin_addr)。地址簇指定为AF_INET,端口号以网络字节序表示(16位),IP地址以网络字节序的32位无符号整数表示。 通过调用bind()函数,可以将指定的终结点绑定Socket句柄上,使得该套接字可以用于监听或与其他进程进行通信。例如,在服务器端编程中,可以使用bind()函数将服务器的IP地址和端口号与Socket句柄相关联,以便接受来自客户端的连接请求。 总之,bind()函数在socket网络编程中扮演着关键的角色,它将一个指定的终结点与Socket句柄绑定在一起,为后续的连接和通信提供了基础。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [面向连接的socket网络编程](https://download.csdn.net/download/axingxiansen/87590152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [socket学习一、socketbind/connect、listen函数详解](https://blog.csdn.net/qq_33726635/article/details/128019397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [socket编程bind()](https://blog.csdn.net/qq_55537010/article/details/126655752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值