附客户端小程序
include "unp.h"
int main(int argc, char **argv) //命令行的第二个参数代表服务器地址
{ int sockfd; //套接字
struct sockaddr_in servaddr; //服务器地址结构
/* 必须在命令行指定服务器地址*/
if (argc != 2) err_quit("usage: udpcli <IPaddress>");
bzero(&servaddr, sizeof(servaddr)); //地址结构清零
servaddr.sin_family = AF_INET; //IPv4
servaddr.sin_port = htons(SERV_PORT); //9877端口
/*网络字节序的IP地址*/
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
/*建立UPD套接口*/
sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
/*回射客户端子程序, stdin 为标准输入:键盘*/
dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));
exit(0); //子程序结束后退出程序
}
include "unp.h"
int main(int argc, char **argv) //命令行的第二个参数代表服务器地址
{ int sockfd; //套接字
struct sockaddr_in servaddr; //服务器地址结构
/* 必须在命令行指定服务器地址*/
if (argc != 2) err_quit("usage: udpcli <IPaddress>");
bzero(&servaddr, sizeof(servaddr)); //地址结构清零
servaddr.sin_family = AF_INET; //IPv4
servaddr.sin_port = htons(SERV_PORT); //9877端口
/*网络字节序的IP地址*/
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
/*建立UPD套接口*/
sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
/*回射客户端子程序, stdin 为标准输入:键盘*/
dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));
exit(0); //子程序结束后退出程序
}
服务器段会这样接受来自客户端的udp报文:recvfrom(s,m_AcceptMsg,CICQ_MSG_SIZE,0,
(LPSOCKADDR)&CicqAccept,&size);
当这个函数调用成功返回时,客户端的ip地址和端口都将保存在CicqAccept当中:CicqAccept.sin_addr.s_addr 保存的是客户端IP地址
CicqAccept.sin_port 保存的是客户端端口使用它们的时候要记住把网络字节顺序改过来。
中的Addr、Port参数就是服务器的地址与端口
{
char hostname[256];
SOCKADDR_IN sockAddr;
ZeroMemory(&sockAddr,sizeof(sockAddr)); if ( gethostname(hostname,256) == SOCKET_ERROR ) return false; LPHOSTENT lphost = gethostbyname(hostname);
if ( lphost == NULL) return false;
sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
lstrcpy(szLocalIP, inet_ntoa ( *(struct in_addr*)*lphost->h_addr_list ) ); return true;
}