附客户端小程序
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); //子程序结束后退出程序
}

解决方案 »

  1.   

    用户不用刻意发送ip地址给服务器。他发送过去的udp包里面就包含了发送端的ip地址和发送端口。如下所示:
    服务器段会这样接受来自客户端的udp报文:recvfrom(s,m_AcceptMsg,CICQ_MSG_SIZE,0,
    (LPSOCKADDR)&CicqAccept,&size);
    当这个函数调用成功返回时,客户端的ip地址和端口都将保存在CicqAccept当中:CicqAccept.sin_addr.s_addr    保存的是客户端IP地址
    CicqAccept.sin_port           保存的是客户端端口使用它们的时候要记住把网络字节顺序改过来。
      

  2.   

    SendFrom(SendBuf, SENDBYTES, Addr, Port);
    中的Addr、Port参数就是服务器的地址与端口
      

  3.   

    bool GetLocalStrIP(char * szLocalIP)
    {
    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;
    }
      

  4.   

    你发出去的UDP包是用IP头包装的,而IP头中有楼主你的网络地址啊。