解决方案 »
- 如何禁止拖动CDHtmlDialog中的内容?
- 再求思路
- 请高手指点小弟,制作一个下拉菜单!!!
- 注册OCX控件报错:invalid access to memory location
- 请问_stprintf支持对int64的转换吗?
- 为什么默认焦点在IDOK上?我要设其他按钮为默认怎么办?
- 怎样用ADO把SQLServer2k的表导出到一个ACCESS文件中?
- 求助:用VC进行网络编程,该如何开始?谢谢大虾!:)
- 请问有没有vc的绘图控件?
- sdi中的mainframe是在那里new出来的,我在文件中找不到
- CTreeCtrl在自定义排序函数后,禁止!滚动条自动跑到选择的那个item上
- 关于滚动条 SetScrollPos
#include <Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
printf("建立套接字失败...");
return -1;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return -1;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
int retval;
retval=bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(sockSrv);
printf("端口绑定失败");
return -1;
}
printf("绑定成功开始监听...\n");
listen(sockSrv,5); SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char sendBuf[50];
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
while(1)
{
printf("请输入要发送的内容:");
scanf("%s",sendBuf);
//sprintf(sendBuf,"服务端IP:%s\n连接成功!\n",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
}
closesocket(sockConn);
WSACleanup();
return 0;
}
你没有实时的检测accept(),因此 ,你的accept()只用了一回,当然只能和一个客户端链接了。while(1)
{
accept();createthread();
}这样的思路才能和多客户端发送数据,还有的是,这仅仅是阻塞socket,因此实时检测基本就用线程来代替。异步的socket我也了解甚少,不过想必你也刚入门,多看看书吧,先把阻塞的弄明白了也算是入门了。
还有就是好像有意个 select() 让你可以同时监视多个套接字
请问如何用??
有没有人会用 select()急求用法 小菜感激了!
SelectTime.tv_usec = 500000; //500ms
iSelNum = select(0, &fdread, NULL, NULL, &SelectTime );
if ( 0 == iSelNum ) /*超时*/
{
continue; //Sleep( 1 );
}
这些在一个while循环里做,每次检查iSelNum 的值;iSelNum == -1 为错误的;
然后再对应的socket上应用recv函数接受消息;大致的思路就是这样的,具体细节看一下msdn;再有问题讨论!
请问用这个createthread 如何创造线程??
SOCKET s;
fd_set fdread;
int ret;
//创建套接字接受连接
//在套接字上管理IO连接
while(TRUE)
{
FD_ZERO(&fdread);
FD_SET(s,&fdread);
if(ret=select(0,&fdread,NULL,NULL,NULL)==SOCKET_ERROR)
{
//出错 }
if(ret>0)
{
if(FD_ISSET(s,&fdread))
{
//套接字s上发生一个事件
}
}
}
//循环接受客户的请求
while(TRUE)
{
NewConnection = accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen);
if(NewConnection == INVALID_SOCKET)
{
printf("Failed accept()\n");
continue;
}
printf("Received a link: %s\n",inet_ntoa(ClientAddr.sin_addr));
//向客户端发送信息
printf("请输入向客户端发送的信息:\n");
scanf("%s",szText);
send(NewConnection,szText,strlen(szText),0); //关闭同客户端的连接
closesocket(NewConnection);
}
顺便问一下,我这有台设备,我现在可以在不同的电脑上打开客户端去读取服务端(这台设备)的状态。而且在所有的客户端上都能实时的显示这台设备的状态。这样的TCP连接时阻塞式的还是非阻塞式的?有没有什么软件可以检测出是哪种连接方式吗?我想自己编一个客户端,采集并记录数据(原来的客户端功能太少)但是服务端是装在设备里,没办法查看的。现在只能去用第三方软件,去分析他们之间的通讯内容。