请求帮忙,关于局域网聊天的 http://www.hongen.com/pc/program/codtutor/code0001/code01.htm 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我用Winsock却出现了一些问题在主程序上假如登陆了一个客户但却不能显示因为Winsock的事件中没有Index 变量不知怎么解决本题可以用数据库解决也比较简单 有多少机子上连就需多少winsock控件,你可以用load,使他保持始终有一个winsock控件监听,连了一台机子后,就load一次。 用TTL控件将文字转换成语音! 我也想做这么一个东西,感兴趣。作出来了能不能发给我啊。 [email protected]谢了在此给一点参考 Speech API 4.0以上+中文语音包 Winsock接口为进程间通信提供了一种新的手段,它不但能用于同一机器中的进程 之间 通信,而且支持网络通信功能。随着Windows 95的推出。Winsock已经被正式集成 到了W indows系统中,同时包括了16位和32位的编程接口。而Winsock的开发工具也可以 在Bor land C++4.0、Visual C++2.0这些C编译器中找到,主要由一个名为winsock.h的头 文件 和动态连接库winsock.dll或wsodk32.dll组成,这两种动态连接库分别用于Win16 和Win 32的应用程序。 本文针对话音的全双工传输要求,采用UDP协议实现了实时网络通信。使用 VisualC++2. 0编译环境,其动态连接库名为wsock32.dll。 二、主要函数的使用要点 通过建立双套接字,可以很方便地实现全双工网络通信。 1.套接字建立函数: SOCKET socket(int family,int type,int protocol) 对于UDP协议,写为: SOCKRET s; s=socket(AF_INET,SOCK_DGRAM,0); 或s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP) 为了建立两个套接字,必须实现地址的重复绑定,即,当一个套接字已经绑定到某 本地 地址后,为了让另一个套接字重复使用该地址,必须为调用bind()函数绑定第二个 套接 字之前,通过函数setsockopt()为该套接字设置SO_REUSEADDR套接字选项。通过函 数ge tsockopt()可获得套接字选项设置状态。需要注意的是,两个套接字所对应的端口 号不 能相同。 此外,还涉及到套接字缓冲区的设置问题,按规定,每个区的设置范围是:不小于 512个 字节,大大于8k字节,根据需要,文中选用了4k字节。 2.套接字绑定函数 int bind(SOCKET s,struct sockaddr_in*name,int namelen) s是刚才创建好的套接字,name指向描述通讯对象的结构体的指针,namelen是该结 构体 的长度。该结构体中的分量包括:IP地址(对应name.sin_addr.s_addr)、端口号 (name. sin_port)、地址类型(name.sin_family,一般都赋成AF_INET,表示是internet地 址)。 (1)IP地址的填写方法:在全双工通信中,要把用户名对应的点分表示法地址转换 成32位 长整数格式的IP地址,使用inet_addr()函数。 (2)端口号是用于表示同一台计算机不同的进程(应用程序),其分配方法有两种: 1)进程 可以让系统为套接字自动分配一端口号,只要在调用bind前将端口号指定为0即可 。由系 统自动分配的端口号位于1024~5000之间,而1~1023之间的任一TCP或UDP端口都是 保留的 ,系统不允许任一进程使用保留端口,除非其有效用户ID是零(超级用户)。 2)进程可为套接字指定一特定端口。这对于需要给套接字分配一众所端口的服务器 是很 有用的。指定范围为1024和65536之间。可任意指定。 在本程序中,对两个套接字的端口号规定为2000和2001,前者对应发送套接字,后 者对 应接收套接字。 端口号要从一个16位无符号数(u_short类型数)从主机字节顺序转换成网络字节顺 序,使 用 htons()函数。 根据以上两个函数,可以给出双套接字建立与绑定的程序片断; //设置有关的全局变量 SOCKET sr,ss; HPSTR sockBufferS,sockBufferR; HANDLE hSendData,hReceiveData; DWROD dwDataSize=1024*4; struct sockaddr_in therel.there2; #DEFINE LOCAL_HOST_ADDR 200.200.200.201 #DEFINE REMOTE_HOST-ADDR 200.200.200.202 #DEFINE LOCAL_HOST_PORT 2000 #DEFINE LOCAL_HOST_PORT 2001 //套接字建立函数 BOOL make_skt(HWND hwnd) { struct sockaddr_in here,here1; ss=socket(AF_INET,SOCK_DGRAM,0); sr=socket(AF_INET,SOCK_DGRAM,0); if((ss==INVALID_SOCKET)||(sr==INVALID_SOCKET)) { MessageBox(hwnd,“套接字建立失败!”,“”,MB_OK); return(FALSE); } here.sin_family=AF_INET; here.sin_addr.s_addr=inet_addr(LOCAL_HOST_ADDR); here.sin_port=htons(LICAL_HOST_PORT); //another socket herel.sin_family=AF_INET; herel.sin_addr.s_addr(LOCAL_HOST_ADDR); herel.sin_port=htons(LOCAL_HOST_PORT1); SocketBuffer();//套接字缓冲区的锁定设置 setsockopt(ss,SOL_SOCKET,SO_SNDBUF,(char FAR*)sockBufferS,dwDataSize); if(bind(ss,(LPSOCKADDR)&here,sizeof(here))) { MessageBox(hwnd,“发送套接字绑定失败!”,“”,MB_OK); return(FALSE); } setsockopt(sr SQL_SOCKET,SO_RCVBUF|SO_REUSEADDR,(char FAR*) sockBufferR,dwDataSize); if(bind(sr,(LPSOCKADDR)&here1,sizeof(here1))) { MessageBox(hwnd,“接收套接字绑定失败!”,“”,MB_OK); return(FALSE); } return(TRUE); } //套接字缓冲区设置 void sockBuffer(void) { hSendData=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize); if(!hSendData) { MessageBox(hwnd,“发送套接字缓冲区定位失败!”,NULL, MB_OK|MB_ICONEXCLAMATION); return; } if((sockBufferS=GlobalLock(hSendData)==NULL) { MessageBox(hwnd,“发送套接字缓冲区锁定失败!”,NULL, MB_OK|MB_ICONEXCLAMATION); GlobalFree(hRecordData[0]; return; } hReceiveData=globalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize); if(!hReceiveData) { MessageBox(hwnd,"“接收套接字缓冲区定位败!”,NULL MB_OK|MB_ICONEXCLAMATION); return; } if((sockBufferT=Globallock(hReceiveData))=NULL) MessageBox(hwnd,"发送套接字缓冲区锁定失败!”,NULL, MB_OK|MB_ICONEXCLAMATION); GlobalFree(hRecordData[0]); return; } winsock是不支持语音的,找个弟三方控件试试。delphi中有。 TICQ是我刚上传的一个软件,最适合你的情况TICQ 是一个用于网络的信息交流、传送的工具,它的最大特点是除了可以一次性传送多个文件以外,还可以直接传送目录,免去了用户在传送目录前还要对一些文件或目录进行压缩之类的操作,大大的方便了用户,也可避免因网络共享而造成的病毒攻击。TICQ用户上线可即时通知,聊友可分类管理,使用简单方便的,极其适合在小型局域网中使用 最近本人在Win2000上找到一个东东 Dialer.exe ,局域网聊天效果非常好。不知道能给大家带来什么启示? 如何捕捉键盘输入内容? 求助vb 正弦拟合 曲线 vb代码应该注意什么? 已得到外部菜单句柄,如何判断菜单是否可用? 求助大侠们快进来!!!! 如何动态创建数组控件,高手请进 大家看看一个非常专业的商贸企业管理软件,要源码好商量! 如何打包VB程序? 各位大狭帮我!急!急!急! Appendchunk和Getchunk用法调查! 创建控件问题! 急问!!如何进行激活某一可执行文件生行的关联文件?
在主程序上
假如登陆了一个客户但却不能显示
因为Winsock的事件中没有Index 变量
不知怎么解决本题可以用数据库解决也比较简单
作出来了能不能发给我啊。 [email protected]
谢了
在此给一点参考 Speech API 4.0以上+中文语音包
之间
通信,而且支持网络通信功能。随着Windows 95的推出。Winsock已经被正式集成
到了W
indows系统中,同时包括了16位和32位的编程接口。而Winsock的开发工具也可以
在Bor
land C++4.0、Visual C++2.0这些C编译器中找到,主要由一个名为winsock.h的头
文件
和动态连接库winsock.dll或wsodk32.dll组成,这两种动态连接库分别用于Win16
和Win
32的应用程序。
本文针对话音的全双工传输要求,采用UDP协议实现了实时网络通信。使用
VisualC++2.
0编译环境,其动态连接库名为wsock32.dll。
二、主要函数的使用要点
通过建立双套接字,可以很方便地实现全双工网络通信。
1.套接字建立函数:
SOCKET socket(int family,int type,int protocol)
对于UDP协议,写为:
SOCKRET s;
s=socket(AF_INET,SOCK_DGRAM,0);
或s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
为了建立两个套接字,必须实现地址的重复绑定,即,当一个套接字已经绑定到某
本地
地址后,为了让另一个套接字重复使用该地址,必须为调用bind()函数绑定第二个
套接
字之前,通过函数setsockopt()为该套接字设置SO_REUSEADDR套接字选项。通过函
数ge
tsockopt()可获得套接字选项设置状态。需要注意的是,两个套接字所对应的端口
号不
能相同。
此外,还涉及到套接字缓冲区的设置问题,按规定,每个区的设置范围是:不小于
512个
字节,大大于8k字节,根据需要,文中选用了4k字节。
2.套接字绑定函数
int bind(SOCKET s,struct sockaddr_in*name,int namelen)
s是刚才创建好的套接字,name指向描述通讯对象的结构体的指针,namelen是该结
构体
的长度。该结构体中的分量包括:IP地址(对应name.sin_addr.s_addr)、端口号
(name.
sin_port)、地址类型(name.sin_family,一般都赋成AF_INET,表示是internet地
址)。
(1)IP地址的填写方法:在全双工通信中,要把用户名对应的点分表示法地址转换
成32位
长整数格式的IP地址,使用inet_addr()函数。
(2)端口号是用于表示同一台计算机不同的进程(应用程序),其分配方法有两种:
1)进程
可以让系统为套接字自动分配一端口号,只要在调用bind前将端口号指定为0即可
。由系
统自动分配的端口号位于1024~5000之间,而1~1023之间的任一TCP或UDP端口都是
保留的
,系统不允许任一进程使用保留端口,除非其有效用户ID是零(超级用户)。
2)进程可为套接字指定一特定端口。这对于需要给套接字分配一众所端口的服务器
是很
有用的。指定范围为1024和65536之间。可任意指定。
在本程序中,对两个套接字的端口号规定为2000和2001,前者对应发送套接字,后
者对
应接收套接字。
端口号要从一个16位无符号数(u_short类型数)从主机字节顺序转换成网络字节顺
序,使
用
htons()函数。
根据以上两个函数,可以给出双套接字建立与绑定的程序片断;
//设置有关的全局变量
SOCKET sr,ss;
HPSTR sockBufferS,sockBufferR;
HANDLE hSendData,hReceiveData;
DWROD dwDataSize=1024*4;
struct sockaddr_in therel.there2;
#DEFINE LOCAL_HOST_ADDR 200.200.200.201
#DEFINE REMOTE_HOST-ADDR 200.200.200.202
#DEFINE LOCAL_HOST_PORT 2000
#DEFINE LOCAL_HOST_PORT 2001
//套接字建立函数
BOOL make_skt(HWND hwnd)
{
struct sockaddr_in here,here1;
ss=socket(AF_INET,SOCK_DGRAM,0);
sr=socket(AF_INET,SOCK_DGRAM,0);
if((ss==INVALID_SOCKET)||(sr==INVALID_SOCKET))
{
MessageBox(hwnd,“套接字建立失败!”,“”,MB_OK);
return(FALSE);
}
here.sin_family=AF_INET;
here.sin_addr.s_addr=inet_addr(LOCAL_HOST_ADDR);
here.sin_port=htons(LICAL_HOST_PORT);
//another socket
herel.sin_family=AF_INET;
herel.sin_addr.s_addr(LOCAL_HOST_ADDR);
herel.sin_port=htons(LOCAL_HOST_PORT1);
SocketBuffer();//套接字缓冲区的锁定设置
setsockopt(ss,SOL_SOCKET,SO_SNDBUF,(char FAR*)sockBufferS,dwDataSize);
if(bind(ss,(LPSOCKADDR)&here,sizeof(here)))
{
MessageBox(hwnd,“发送套接字绑定失败!”,“”,MB_OK);
return(FALSE);
}
setsockopt(sr SQL_SOCKET,SO_RCVBUF|SO_REUSEADDR,(char FAR*)
sockBufferR,dwDataSize);
if(bind(sr,(LPSOCKADDR)&here1,sizeof(here1)))
{
MessageBox(hwnd,“接收套接字绑定失败!”,“”,MB_OK);
return(FALSE);
}
return(TRUE);
}
//套接字缓冲区设置
void sockBuffer(void)
{
hSendData=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize);
if(!hSendData)
{
MessageBox(hwnd,“发送套接字缓冲区定位失败!”,NULL,
MB_OK|MB_ICONEXCLAMATION);
return;
}
if((sockBufferS=GlobalLock(hSendData)==NULL)
{
MessageBox(hwnd,“发送套接字缓冲区锁定失败!”,NULL,
MB_OK|MB_ICONEXCLAMATION);
GlobalFree(hRecordData[0];
return;
}
hReceiveData=globalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize);
if(!hReceiveData) {
MessageBox(hwnd,"“接收套接字缓冲区定位败!”,NULL
MB_OK|MB_ICONEXCLAMATION);
return;
}
if((sockBufferT=Globallock(hReceiveData))=NULL)
MessageBox(hwnd,"发送套接字缓冲区锁定失败!”,NULL,
MB_OK|MB_ICONEXCLAMATION);
GlobalFree(hRecordData[0]);
return;
}