正常情况下一个网卡对应一个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);
}
绑定后连接服务端结果结果: