用raw socket实现ping(ICMP)中如何 设置TOS(type of service) 。。。

ljp940531 2005-08-01 08:01:26
如下传参数。。。


TOSICMP = 0x2;
result = setsockopt(pingSessions[iIndex].pingSockFd, IPPROTO_IP, IP_TOS, (char*)&TOSICMP, sizeof(TOSICMP));
按上面设置返回正确,但抓包发现 设置的TOSICMP值没起作用。


TOSICMP = 0x3;
result = setsockopt(pingSessions[iIndex].pingSockFd, IPPROTO_ICMP, IP_TOS, (char*)&TOSICMP, sizeof(TOSICMP));
result = setsockopt(pingSessions[iIndex].pingSockFd, IPPROTO_RAW, IP_TOS, (char*)&TOSICMP, sizeof(TOSICMP));
按上面这两种设置返回错误。

...全文
435 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zcy_beijing 2005-08-19
to ljp940531(ljp) :
windows ping的TOS我早试过确实不行,不过可能是因为现在windows系统加入的QoS支持导致它不能直接设置了。
  • 打赏
  • 举报
回复
ljp940531 2005-08-16
to zcy_beijing(行云流水)
哦,其实我是在vXworks下试的,vXworks UDP的socket行,而icmp的raw socket就不行

所以我就到windows下试了一下icmp的 raw socket也不行, 至于windows的udp的我没试过

可能存在协议栈支持不支持的问题,奇怪是windows应该支持啊
windows自带ping 也有TOS 设置,可惜设置后ping 包出去 抓包发现TOS 字段还是0
不想windows还有这种bug?还是骗人的?
你可以试一试windows ping 功能
  • 打赏
  • 举报
回复
zcy_beijing 2005-08-16
to ljp940531(ljp) :
在我这儿UDP也有问题,很奇怪,后来查找MS的帮助说现在已经不支持直接设置TOS域,要用GQOS API来设置,可是也没有具体例子。在MS的网站山查找了半天,给的例子好像不是我想要的。ICMP包的IP头都是我自己构造的系统都给我改掉了。
  • 打赏
  • 举报
回复
ljp940531 2005-08-15
to zcy_beijing(行云流水)
udp 好象没有问题,就是raw socket 好象有问题
  • 打赏
  • 举报
回复
zcy_beijing 2005-08-12
我也遇到同样问题,不知道什么原因,我用的socketRaw和普通socket都试过不行,UDP的我也设置过同样抓到的包TOS没有修改,不知道你解决没有,实在不行只能自己构造包头了。
  • 打赏
  • 举报
回复
zcy_beijing 2005-08-12
我今天试了一下,自己构造的IP头,发现只要设置了TOS域不为0,系统自动把TOS域置为0,并且重新计算了IP头校验和(通过sniffer截包发现),不知道有什么解决办法?参考下文:http://www.xfocus.net/articles/200202/343.html
  • 打赏
  • 举报
回复
ljp940531 2005-08-02
自己 up 一下。。。。。
  • 打赏
  • 举报
回复
ljp940531 2005-08-01
to windcsn(向所有的朋友学习!)

我觉得只修改tos字段,不需要自己构造 ip头,应该直接设置socket(原始)就可以了啊
icmp 头我自己构造...
  • 打赏
  • 举报
回复
ljp940531 2005-08-01
谢谢!
但是抓包发现IP层的TOS没有起作用还是 0;
如果是udp包就tos值就改过来了。。。
  • 打赏
  • 举报
回复
windcsn 2005-08-01
兄弟,当错我是自己写的IP头和ICMP头
  • 打赏
  • 举报
回复
SJcinux 2005-08-01
应该是第一种写法:
TOSICMP = 0x2;
result = setsockopt(pingSessions[iIndex].pingSockFd, IPPROTO_IP, IP_TOS, (char*)&TOSICMP, sizeof(TOSICMP));

没有用过该功能
  • 打赏
  • 举报
回复
相关推荐
// ping.cpp : Defines the entry point for the console application. // #pragma pack(4) #include "winsock2.h" #include "stdlib.h" #include "stdio.h" #define ICMP_ECHO 8 #define ICMP_ECHOREPLY 0 #define ICMP_MIN 8 // minimum 8 byte icmp packet (just header) /* The IP header */ typedef struct iphdr { unsigned int h_len:4; // length of the header unsigned int version:4; // Version of IP unsigned char tos; // Type of service unsigned short total_len; // total length of the packet unsigned short ident; // unique identifier unsigned short frag_and_flags; // flags unsigned char ttl; unsigned char proto; // protocol (TCP, UDP etc) unsigned short checksum; // IP checksum unsigned int sourceIP; unsigned int destIP; }IpHeader; // // ICMP header // typedef struct icmphdr { BYTE i_type; BYTE i_code; /* type sub code */ USHORT i_cksum; USHORT i_id; USHORT i_seq; /* This is not the std header, but we reserve space for time */ ULONG timestamp; }IcmpHeader; #define STATUS_FAILED 0xFFFF #define DEF_PACKET_SIZE 32 #define DEF_PACKET_NUMBER 4 /* 发送数据报的个数 */ #define MAX_PACKET 1024 #define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s)) #define xfree(p) HeapFree (GetProcessHeap(),0,(p)) void fill_icmp_data(char *, int); USHORT checksum(USHORT *, int); int decode_resp(char *,int ,struct sockaddr_in *); void Usage(char *progname){ fprintf(stderr,"Usage:\n"); fprintf(stderr,"%s [number of packets] [data_size]\n",progname); fprintf(stderr,"datasize can be up to 1Kb\n"); ExitProcess(STATUS_FAILED); } int main(int argc, char **argv){ WSADATA wsaData; SOCKET sockRaw; struct sockaddr_in dest,from; struct hostent * hp; int bread,datasize,times; int fromlen = sizeof(from); int timeout = 1000; int statistic = 0; /* 于统计结果 */ char *dest_ip; char *icmp_data; char *recvbuf; unsigned int addr=0; USHORT seq_no = 0; if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0){ fprintf(stderr,"WSAStartup failed: %d\n",GetLastError()); ExitProcess(STATUS_FAILED); } if (argc <2 ) { Usage(argv[0]); } sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL, 0,WSA_FLAG_OVERLAPPED); // //注:为了使发送接收超时设置(即设置SO_RCVTIMEO, SO_SNDTIMEO), // 必须将标志位设为WSA_FLAG_OVERLAPPED ! // if (sockRaw == INVALID_SOCKET) { fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout, sizeof(timeout)); if(bread == SOCKET_ERROR) { fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } timeout = 1000; bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout)); if(bread == SOCKET_ERROR) { fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } memset(&dest,0,sizeof(dest)); hp = gethostbyname(argv[1]); if (!hp){ addr = inet_addr(argv[1]); } if ((!hp) && (addr == INADDR_NONE) ) { fprintf(stderr,"Unable to resolve %s\n",argv[1]); ExitProcess(STATUS_FAILED); } if (hp != NULL) memcpy(&(dest.sin_addr),hp->h_addr,hp->h_length); else dest.sin_addr.s_addr = addr; if (hp) dest.sin_family = hp->h_addrtype; else dest.sin_family = AF_INET; dest_ip = inet_ntoa(dest.sin_addr); // // atoi函数原型是: int atoi( const char *string ); // The return value is 0 if the input cannot be converted to an integer ! // if(argc>2) { times=atoi(argv[2]); if(times == 0) times=DEF_PACKET_NUMBER; } else times=DEF_PACKET_NUMBER; if (argc >3) { datasize = atoi(argv[3]); if (datasize == 0) datasize = DEF_PACKET_SIZE; if (datasize >1024) /* 户给出的数据包大小太大 */ { fprintf(stderr,"WARNING : data_size is too large !\n"); datasize = DEF_PACKET_SIZE; } } else datasize = DEF_PACKET_SIZE; datasize += sizeof(IcmpHeader); icmp_data = (char*)xmalloc(MAX_PACKET); recvbuf = (char*)xmalloc(MAX_PACKET); if (!icmp_data) { fprintf(stderr,"HeapAlloc failed %d\n",GetLastError()); ExitProcess(STATUS_FAILED); } memset(icmp_data,0,MAX_PACKET); fill_icmp_data(icmp_data,datasize); // //显示提示信息 // fprintf(stdout,"\nPinging %s ....\n\n",dest_ip); for(int i=0;iIcmpHeader*)icmp_data)->i_cksum = 0; ((IcmpHeader*)icmp_data)->timestamp = GetTickCount(); ((IcmpHeader*)icmp_data)->i_seq = seq_no++; ((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data,datasize); bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest)); if (bwrote == SOCKET_ERROR){ if (WSAGetLastError() == WSAETIMEDOUT) { printf("Request timed out.\n"); continue; } fprintf(stderr,"sendto failed: %d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } if (bwrote < datasize ) { fprintf(stdout,"Wrote %d bytes\n",bwrote); } bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen); if (bread == SOCKET_ERROR){ if (WSAGetLastError() == WSAETIMEDOUT) { printf("Request timed out.\n"); continue; } fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError()); ExitProcess(STATUS_FAILED); } if(!decode_resp(recvbuf,bread,&from)) statistic++; /* 成功接收的数目++ */ Sleep(1000); } /* Display the statistic result */ fprintf(stdout,"\nPing statistics for %s \n",dest_ip); fprintf(stdout," Packets: Sent = %d,Received = %d, Lost = %d (%2.0f%% loss)\n",times, statistic,(times-statistic),(float)(times-statistic)/times*100); WSACleanup(); return 0; } /* The response is an IP packet. We must decode the IP header to locate the ICMP data */ int decode_resp(char *buf, int bytes,struct sockaddr_in *from) { IpHeader *iphdr; IcmpHeader *icmphdr; unsigned short iphdrlen; iphdr = (IpHeader *)buf; iphdrlen = (iphdr->h_len) * 4 ; // number of 32-bit words *4 = bytes if (bytes < iphdrlen + ICMP_MIN) { printf("Too few bytes from %s\n",inet_ntoa(from->sin_addr)); } icmphdr = (IcmpHeader*)(buf + iphdrlen); if (icmphdr->i_type != ICMP_ECHOREPLY) { fprintf(stderr,"non-echo type %d recvd\n",icmphdr->i_type); return 1; } if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) { fprintf(stderr,"someone else''s packet!\n"); return 1; } printf("%d bytes from %s:",bytes, inet_ntoa(from->sin_addr)); printf(" icmp_seq = %d. ",icmphdr->i_seq); printf(" time: %d ms ",GetTickCount()-icmphdr->timestamp); printf("\n"); return 0; } USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(USHORT); } if(size) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } /* Helper function to fill in various stuff in our ICMP request. */ void fill_icmp_data(char * icmp_data, int datasize){ IcmpHeader *icmp_hdr; char *datapart; icmp_hdr = (IcmpHeader*)icmp_data; icmp_hdr->i_type = ICMP_ECHO; icmp_hdr->i_code = 0; icmp_hdr->i_id = (USHORT)GetCurrentProcessId(); icmp_hdr->i_cksum = 0; icmp_hdr->i_seq = 0; datapart = icmp_data + sizeof(IcmpHeader); // // Place some junk in the buffer. // memset(datapart,''E'', datasize - sizeof(IcmpHeader)); }
客户端: #include #include // 包含套接字函数库 #include #include // 包含AF_INET相关结构 #include // 包含AF_INET相关操作的函数 #include #include #include #define PORT 6789 #define IP_ADDR "127.0.0.1" #define SIZE 10240 int main() { struct tm *timeptr; time_t timeval; //时间变量 char tm[50]; int sockfd; // 于保存客户套接字标识符 int len; // 于客户消息长度 struct sockaddr_in address; // 定义客户套接字地址结构体 int result; sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定义套接字类型 address.sin_family = AF_INET; // 定义套接字地址的域 address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_addr.s_addr = inet_addr(IP_ADDR); // 定义套接字地址 address.sin_port = htons(PORT); // 定义套接字端口 char buf[100]; // 定义要传送的消息 memset(buf,0,100); char str[90]; //存贮输入的语句 char shmaddr[SIZE]; //接受服务器发送的全部聊天数据 int i=0; char myname[100]; char say[10]={"说:"}; printf("欢迎来到聊天室,请输入你的姓名:"); scanf("%s",myname); len = sizeof(address); result = connect(sockfd, (struct sockaddr *) &address, len); // 请求连接 if (result == -1) { perror("Connect failed"); return 1; } printf("%s成功登录服务器:\n",myname); pid_t pid; pid=fork(); if(pid==-1) { printf("fork failed"); } int sendbytes=0; if(pid==0) //子进程于发送数据 { while(1) { scanf("%s",str); (void)time(&timeval); strcpy(tm,ctime(&timeval)); strcpy(buf,myname); //姓名传入buf strcat(buf,":"); strcat(buf,str); strcat(buf," ["); strc
软件简介   飞鸽传书(IP Messenger),是由日本人Shirouzu Hiroaki (白水 启章)所发明的免费软件, 是一款局域网内即时通信软件,基于 TCP/IP(UDP)。可运行于多种操作平台(Win/Mac/UNIX/Java),并实现跨平台信息交流。不需要服务器支持, 支持文件/文件夹的传送 (2.00版以上),通讯数据采 RSA/Blofish 加密 (2.00版以上),十分小巧,简单易,而且你可以完全免费使它。目前已有的版本包括: Win32, Win16, MacOS, MacOSX, X11, GTK, GNOME,Java 等, 并且公开源代码. 系统要求   Microsoft Windows 95/98/Me/NT4.0/2000/XP/2003   95/98/NT4.0 ... 要求 comctl32.dll(公共控件) 的版本为 5.x 或更高.   (如果你安装的 IE 是 5.x 或更高版本, 那么就不必担心这个问题了)   注意: Windows 3.1(和 NT3.5x), 请使 IP Messenger for Win16. 使说明   < 安装/卸载 >   执行 setup.exe 你可以将 IPMsg 安装到指定目录, 或者重新注册到启动组.   如果需要删除 IPMsg, 请先从控制面板卸载, 再手动删除 IPMsg 目录.   < 系统托盘区图标 >   左键双击图标, 即可打开发送消息窗口.   右键点击图标, 可进入 [服务设置], [离开] 等.   < 发送消息窗口 >   - 发送消息时, 若勾选了 [封装], 则接收者要先打开信封才能看到消息,   如果你还勾选了 [上锁], 则接收者在打开信封时还需要输入密码.   (密码是由接收者自己在 [服务设置] 设置的)   - 若要发送文件/文件夹, 可直接将文件/文件夹拖入发送消息窗口   或在发送消息窗口上点击右键, 再选择发送文件或发送文件夹   - 传送文件/文件夹时, 当接收者还没有保存(下载)文件/文件夹时,   若发送者关闭或重启了 IPMsg, 则附带的文件信息将被清除,   接收者将不能继续接收(下载)到此文件.   - 户列表前缀符号说明   ":" 表示户处于离开模式.   "|" 表示户使的不是 2.0 以上版本的 IPMsg,   将不支持文件/文件夹的传送, 并且不支持通信数据加密.   "|"(短线) 表示只支持文件/文件夹的传送.   - 拖动列表表头标题项可改变其顺序, 并可点击右键选择"保存列表顺序"   - 在消息输入窗口, 可使 Ctrl+Tab 输入制表符 Tab.   - 在发送消息窗口上点击右键, 可以进入设置显示优先级, 选择工作组,   搜索户(Ctrl+F), 传送文件, 传送文件夹, 保存列表顺序, 字体设置,   窗口大小设置, 固定窗口位置, 列表显示设置.   - 在户名上点击右键, 可设置其显示优先级   优先级按由小到大的顺序排序   - 通过设置显示优先级, 可将经常联系的户至于列表顶端,   或者隐藏不需要联系的户   < 接收消息窗口 >   - 在接收消息窗口上点击右键, 可以进入字体设置,   窗口大小设置, 固定窗口位置.   - 接收消息窗口标题栏的 "+" 或 "-" 表示通信数据使了加密算法   "+" 表示 RSA/1024 位, blowfish/128 位加密   "-" 表示 RSA/512 位, RC2/40 位加密   - 如果你收到的消息附带了文件, 将会显示出附件按钮.   点击按钮即可保存文件.   < 其他 >   - 如果需要(通过路由器)连接到广域网, 则需要设置广播地址.   详见广域网设置(广播设置)   - 其它功能都很容易理解, 你试一试就明白了 操作技巧   1、隐藏/显示窗口Ctrl+D   2、按住Ctrl键再点[刷新]可保持现有户,搜索新上线的户   3、打开发送/接收消息窗口Ctrl+Alt+S/R(需要进行详细设置)   4、打开搜索窗口Ctrl+F   5、接收到多个文件,保存时可勾选[全部] 软件原理   局域网聊天软件飞鸽传书是目前比较流行的局域网即时通讯软件,由于历史悠久,它具有比较多的户。 因为 FreeEIM 的实现原理和飞鸽传书差不多,希望广大户了解其原理后,在使时更加得心应手。   开发多年的飞鸽,在他的基础上增加了些许功能,例如语音对话,这里继续讨论FreeEIM(飞鸽传书),前几天,详细的了解了FreeEIM(飞鸽传书)的网络协议,详细分析并且实现了FreeEIM(飞鸽传书)的消息传递过程,这里就FreeEIM(飞鸽传书)的文件和文件夹的传输做详细的说明。   在FreeEIM(飞鸽传书),如果要进行文件或者文件夹的传输,首先需要做的就是消息的应答,通过UDP发送文件传输报文,另外的FreeEIM(飞鸽传书)客户端收到报文后,使TCP协议发送应答报文,这样就开始进行文件的传输了。   这里开启两个线程,线程1负责文件的传送,线程2负责文件的接受,下边做一一说明。   首先,我们知道,可以发送多个文件,这些文件需要建立链表保存信息。   typedef struct file_info   {   struct file_info *next; //双向链表   struct file_info *forward;   char *file; //文件名   int type; //文件类型:文件或者文件夹   int size; //文件大小   struct sockaddr_in addr; //目标网络信息   } FILE_INFO;   [1]文件传送链表由专门的线程维护,这样,线程1就可以专心进行处理文件传输队列就可以了,线程1始终查询这个链表,如果表头为NULL,就说明没有要传输的文件,表头非空,就开始发送报文,获得正确的应答后,就可以开始文件的传输了,文件传输结束,将相应的链表节点删除。这里借鉴了很多程序使非常广泛的“命名池”相关的概念,只不过这里我们使的是“文件池”,可以这么认为,如果有文件要传输,可以不考虑是否有文件正在传输,只要把要传输的文件放入 “文件池”就可以了 , 同时,不考虑“文件池”的大小,线程1是文件池的服务线程,它检测文件池的大小,如果非空,就会逐次传输文件。   这里需要特别注意的就是关于文件夹的传输,这个FreeEIM(飞鸽传书)一个难点,应为对与文件夹的内容是没有显示的,需要我们逐次的判断,在飞鸽传书是这么处理的,如果是一个文件夹,就发送文件属性为IPMSG_FILE_DIR的信息包,FreeEIM(飞鸽传书)客户端收到这个信息包后,就创建这个文件夹,然后发起发送的FreeEIM(飞鸽传书)客户端,进入文件夹,传送文件夹内的文件,如果该文件夹下,还有文件夹,使相同的方法,在文件夹内的文件传送结束后,就发送FREEEIM_FILE_RETPARENT信息包,接受的FREEEI_FILE_RETP报文的FreeEIM(飞鸽传书)客户端,执行返回上一级目录,FreeEIM(飞鸽传书)发送端,就需发送目录下的文件。这样循环操作,最终完成文件的传输,这个过程比较难以理解。   有了上边的知识,开发文件传输功能就变得简单多了,文件的接受也可以类推了,同样开启一个线程维护接受文件链表,逐次接受身下的文件,链表为空时。文件传输会遇到文件读写问题,有的文件发送是被打开了,这样会造成访问违规,所以要有相应的处理,才能让程序更加稳健。   程序启动时先读取户配置文件,一般是"*.ini"格式,然后,使Winsock的广播消息给整个局域网发送一个数据包,这时候,如果其他电脑已经运行了飞鸽传书,那么他收到这个包后,会将包的信息读取出来,当然,这个包里有户的IP,户名,性别等等。这样,在户列表里就多了一个户了。他的户检查方式就如此简单而已。至于跨网段的实现,只需简单地修改一下广播地址就行了,如果不考虑速度,你可以给整个internet发广播消息。 消息发送,文件传输这些功能,都比较简单,如果你会网络编程,给你对方IP地址,这些功能实现起来再简单不过了。语音、视屏等,只需编写一些语音视频采集代码,传书的话,就像传文件一样。这里给段广播消息的实现代码吧:   // 发送广播登陆消息   void EM_UserLogin::SendLogin_BC(LPEM_DATA msg)   {   SOCKET m_socket;   m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);   if (INVALID_SOCKET == m_socket)   {   MessageBox(0, "socket failed.", NULL, MB_OK);   }   SOCKADDR_IN sin;sin.sin_addr.s_addr = htonl(INADDR_BROADCAST);   sin.sin_family = AF_INET;   sin.sin_port = htons(BROADCAST_SEND_PORT);BOOL bOpt = TRUE;   if (SOCKET_ERROR == setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)))   {   // Error occurred   ::MessageBox(0,"BC setsockopt error.",0,0);   return;   }   char *tmpBuf = msg->GetBuffer();   if (SOCKET_ERROR == sendto(m_socket, tmpBuf, msg->GetLength(), 0, (PSOCKADDR)&sin, sizeof(sin)))   {   // Error occurred   ::MessageBox(0,"BC sendto error.",0,0);   return;   }closesocket(m_socket);    相关信息   - 所有的设置信息都保存在注册表的以下位置:   \\HKEY_CURRENT_USER\Software\HSTools\   户密码以不可逆加密方式存储.   *******************************************************************   * 如果你忘记了密码, 可以在注册表将此键值删除 *   * \\HKEY_CURRENT_USER\Software\HSTools\IPMsgEng\PasswordStr *   *******************************************************************   - 本软件使的默认端口为 2425   若仅使 UDP 协议的端口, 将不能传送文件/文件夹   (如果安装了防火墙, 则必须打开相应的 TCP 和 UDP 端口)   - 本软件为自由软件, 你可以随意传播, 但源码使请参见许可协议.   - 只有在启动或退出程序, 使离开模式, 刷新在线户时 IPMsg 才会进行消息广播.   - 本软件由 Microsoft Visual C++ 6.0 编译 广域网设置(广播设置)   - 主机号全部为 1 的 IP 地址, 即广播地址   例如, 连接到一个 C 类子网(即 24 位网络号, 8 位主机号), IP 地址为   aaa.bbb.ccc.ddd, 其广播地址即为: aaa.bbb.ccc.255   若对方处于另一个私有子网, 广播可能无效.   - 更多问题, 请参阅相关资料或咨询你的网络管理员.   - 若两台主机的连接经过了多个路由器, 请直接指定对方IP地址   - 拨号上网户请勾选 [拨号连接]   当刷新在线户列表时, 列表不会被清空 补充   - 启动飞鸽传书前, 你可以指定其运行时使的端口,   且可以使不同的端口打开多个窗口. 法如下:   ipmsg.exe 2426 (你可在快捷方式上设置)   但是你只能与同时也使该端口的户通信.   - 所以你尽可选你喜欢的端口运行本软件.   介于 10000 至 60000 可能更安全些.   你也可以咨询你的网络管理员.   - 如果有多个网卡(IP), 你可以将飞鸽传书与指定的网卡(IP)进行绑定.   命令格式如下(你可以在快捷方式上设置):   ipmsg.exe [端口] /NIC IP地址   例如:   C:\>ipmsg.exe /NIC 192.168.10.100   - 支持命令方式发送消息   命令格式如下:   ipmsg.exe [端口] /MSG [/LOG][/SEAL] <主机名或IP地址> <消息>   例如:   C:\>ipmsg.exe /MSG /SEAL localhost Hello.    支持   - IPMsg 的技术讨论区是开放的.   如果你想订阅相关邮件, 请联系 ipmsg-subscribe@ring.gr.jp   - 欢迎报告 bug, 以及提出建议   - 如果你有任何疑问, 请 E-mail 联系.   shirouzu@h.email.ne.jp   文版可联系阿志: hiwyz@163.net   - 发送错误报告, 请勿必记录以下信息:   软件版本, 操作系统, 故障描述, 以及故障重现方法等. 更新历史   ver 1.00 ... 日文版 (1996/08/19)   ver 1.31 ... 英文版/日文版 (1997/09/01)   ver 2.00 ... 英文版/日文版 (2002/11/19)   支持文件/文件夹传送   支持通信数据加密   ver 2.03 ... Bug 修正 (文件传送引起缓冲溢出)   广播设置支持主机地址(FQDN)解析   ver 2.04 ... 增加绑定网卡(IP)功能   ver 2.05 ... Bug 修正 (2.04版当激活发送/接收消息窗口时,无法注销/关闭系统)   ver 2.06 ... 很小的调整   ver 2007 ... 全面调整软件的界面可性、性能稳定性 注意:本版本为 IPMSG 2.06版 编译环境: WINXP & VS2005, 可正确编译。
发帖
网络编程

1.8w+

社区成员

VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
帖子事件
创建了帖子
2005-08-01 08:01
社区公告
暂无公告