客户端机器有多块网卡,SOCKET Connect服务器端时如何指定客户端的某个IP.
客户端机器有多块网卡,SOCKET Connect服务器端时如何指定客户端的某个IP.程序片段如下:
int SendToLan(char *APText,int APLength)
{
struct sockaddr_in ToAddr;
int OptVal = 1;
int SendLength;
char RecvBuffer[AP_TEXT_LEN];
int j,RecvLength=0;
int EndOfRecvFlag=0;
char *String;
char ErrLog[256];
/*
Get host information.This routine finds the first host in the host DB
*/
host = gethostbyname("lzfls1");
if(host == NULL)
{
LogInfo("%%E-CLIENT:Failed to get the information of host LOCALHOST.");
return -1;
}
/*
Create a socket to establish communication background.
AF_INET: Internet style.Only this is supported now.
SOCK_STREAM: Socket provides sequenced,reliable,two-way connection based
byte streams.
IPPROTO_TCP: TCP is needed by 9672.
*/
Socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(Socket == -1)
{
memset(ErrLog,0,256);
sprintf(ErrLog,"%%E-CLIENT:Failed to create socket.errno=%d.",errno);
LogInfo(ErrLog);
return -2;
}
/*
Not necessarily needed.
SOL_SOCKET: Set the options at the socket level.
SO_REUSERADDR: Indicates the rules used in validating addresses supplied
in a bind call should allow reuse of local address.
OptVal=1: If this option is enabled,it must be set
*/
Host = *host; /* Not familiar with it */
memset((char *)&ToAddr,0,sizeof(struct sockaddr_in));
ToAddr.sin_family = AF_INET;
ToAddr.sin_port = htons(8087); /* Using port */
ToAddr.sin_addr = * ((struct in_addr *)Host.h_addr); /* Not eqal to VMS */
if(setsockopt(Socket,SOL_SOCKET,SO_REUSEADDR,(char *)&OptVal,
sizeof(int)) != 0)
{
close(Socket);
memset(ErrLog,0,256);
sprintf(ErrLog,
"%%E-CLIENT:Failed to set socket options.errno=%d.",errno);
LogInfo(ErrLog);
return -3;
}
/*
Because this is a socket based on TCP,it is OK not to use bind call
*/
if(connect(Socket,(struct sockaddr *)&ToAddr,
sizeof(struct sockaddr_in)) != 0)
{
close(Socket);
memset(ErrLog,0,256);
sprintf(ErrLog,"%%E-CLIENT:Failed to connect peer host.errno=%d",errno);
LogInfo(ErrLog);
return -4;
}
/*
We set flag to be 0 because flag can only be 0 or MSG_OOB.MSG_OOB means
out of band.since we have set socket option,so it must be 0);
*/
SendLength = send(Socket,APText,APLength,0);
if(SendLength != APLength)
{
close(Socket);
memset(ErrLog,0,256);
sprintf(ErrLog,
"%%E-CLIENT:Failed to send message to peer host.errno=%d,Len=%d",
errno,SendLength);
LogInfo(ErrLog);
return -5;
}
。。。。。。。