关于Socket问题,高手请指点谜经!很急!!! server端每次接收一个客户端连接之后应该开启一个线程(将新的socket传给它)为客户端服务直至结束 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 推荐你先看书: <TCP/IP网络互联技术 卷III>winsock版。第8章: 服务器软件设计的问题。看完就明白了。 服务器要不断地m_sListenSocket.Accept(m_sConnectSocket)来接收连接还是先看看TCP/IP协议吧, 看看连接的三次握手 看看《TCP/IP详解》,注意分配好PAIR SOCKET。 http://www.csdn.net/expert/topic/737/737424.xml?temp=.5668909 好难呀,说实话,我才学习vc不到三个月的时间,我看了那个地址的内容了,大体的意思我能明白一些了,但是关于多线程编程我真的不太通,也许你们会笑我真的是个白痴,但没办法,人学习新东西都要经过这个过程的,我的时间很少了,你们能不能再帮我想想有没有什么好的办法能实现这个功能的?谢谢了,不胜感激!!!对了,哪里能载到《vc++技术内幕》电子版的? 服务器端应该建立两个Socket对象,一个用于监听,另一个用于收发信息,这样就可以了连接多个客户端了,进行异步通信。推荐网址:http://home.qianmen.com.cn/vcmanor/netdoc.asp 客户端的m_sConnectSocket.Create(4000);在多次调用时,会有多个socket bind到4000端口,所以除了第一次成功,后面的都会失败的。改为m_sConnectSocket.Create(0);就可以了 对于只有先启动服务器才能进行连接,是因为你的服务器接收到连接以后就停止了,你应该在服务器端创建一个线程专门用于listen监听连接请求,当接收到一个连接后,新建一个线程与一个客户端accept建立连接。 服务器端用两个SOCKET类,一个等待连接,另外一个是和客户端对应的,客户端每来一个连接信号,则在连接里追加一个对象 写个代码给你试试:服务器:#define FD_SETSIZE 4#include <winsock2.h>#include <windows.h>#include <cstdio>#include <cstdlib>//#include "debug/cppmg.hpp"//#include "debug/cobj.cpp"//#include "multithread.h"#include <cassert>#define countof(x) (sizeof(x)/sizeof(x[0]))#pragma comment(lib,"ws2_32")#include <process.h>typedef unsigned (__stdcall *pThreadFun)(void *);typedef DWORD (__stdcall *pThreadFun1)(void *);__inline HANDLE ThreadCreate(pThreadFun1 threadAddress,LPVOID pParm=NULL,DWORD flag=0,LPDWORD pctx=NULL){ DWORD ctx; return (HANDLE)_beginthreadex(NULL,0,(pThreadFun)(threadAddress),(pParm),(flag),(UINT*)(pctx? pctx:&ctx) );}__inline HANDLE ThreadCreate(pThreadFun threadAddress,LPVOID pParm=NULL,DWORD flag=0,LPDWORD pctx=NULL){ DWORD ctx; return (HANDLE)_beginthreadex(NULL,0,(pThreadFun)(threadAddress),(pParm),(flag),(UINT*)(pctx? pctx:&ctx) );}#define ErrorMsg printfDWORD __stdcall TransmitThread(LPVOID parm){ SOCKET s=pram; char buffer[4096]; int nRead while((nRead=recv(s,buffer,4096,0))>0) { buffer[nRead]=0; printf("%s",buffer); }; closesocket(s); return 0;}void main(int argc,char** argv){ if(argc<2) { ErrorMsg( "Usage\n" "\tSockSvr localport \n"); return; } SOCKET s; WSADATA wsd; int port1; port1=atoi(argv[1]); if(WSAStartup(MAKEWORD(2,2),&wsd)!=0) { ErrorMsg("WSAStartup failed\n"); return; } s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { ErrorMsg("Create socket failed %d\n",WSAGetLastError()); return; } sockaddr_in addr; memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_port=htons(port1); addr.sin_addr.S_un.S_addr=INADDR_ANY; if(bind(s,(SOCKADDR*)&addr,sizeof(addr))) { ErrorMsg("Failed to bind socket %d\n",WSAGetLastError()); return; } while(1) { listen(s,5); sockaddr_in inaddr; int sz=sizeof(inaddr); SOCKET s1=accept(s,(SOCKADDR*)&inaddr,&sz); CloseHandle(ThreadCreate(TransmitThread,(LPVOID)s1)); } WSACleanup();};客户端就不写了,你在本机运行服务器后自己用telnet localhost port试吧比如服务器:(机器名server)socksvr 8080客户端运行telnet server 8080然后客户端输入在服务器端应该可以看到 Create(4000)的问题改用Create(0)Windows会自动分配空闲的端口 用Create(0)我试过了,不行的!不知道什么原因! 怎么修改atl com 方法参数 VC连接数据库,建了个ADOConn类负责连接,求帮忙看下报错原因 请问我的try...catch为什么抓不住异常,程序还是直接出错? 关于组播地址和普通网络地址 菜鸟问个很菜的问题! 新手问个买书的问题!!! 紧急!!!!!寻求afxres.h文件!!!!!!!! SQL语句没有正确结束 关于析构函数的简单问题,但是很急!!!在线等待 怎样让列表控件listctrol存储和显示文字信息不同呢?今天分不够了! 如何作一个像小车模样的按钮控件? 我该学什么?学了两年依然迷惑,向高手请教!
第8章: 服务器软件设计的问题。看完就明白了。
推荐网址:
http://home.qianmen.com.cn/vcmanor/netdoc.asp
在多次调用时,会有多个socket bind到4000端口,所以除了第一次成功,后面的都会失败的。
改为m_sConnectSocket.Create(0);就可以了
服务器:
#define FD_SETSIZE 4
#include <winsock2.h>
#include <windows.h>
#include <cstdio>
#include <cstdlib>
//#include "debug/cppmg.hpp"
//#include "debug/cobj.cpp"
//#include "multithread.h"
#include <cassert>
#define countof(x) (sizeof(x)/sizeof(x[0]))
#pragma comment(lib,"ws2_32")
#include <process.h>
typedef unsigned (__stdcall *pThreadFun)(void *);
typedef DWORD (__stdcall *pThreadFun1)(void *);
__inline HANDLE ThreadCreate(pThreadFun1 threadAddress,LPVOID pParm=NULL,DWORD flag=0,LPDWORD pctx=NULL)
{
DWORD ctx;
return (HANDLE)_beginthreadex(NULL,0,(pThreadFun)(threadAddress),(pParm),(flag),(UINT*)(pctx? pctx:&ctx) );
}
__inline HANDLE ThreadCreate(pThreadFun threadAddress,LPVOID pParm=NULL,DWORD flag=0,LPDWORD pctx=NULL)
{
DWORD ctx;
return (HANDLE)_beginthreadex(NULL,0,(pThreadFun)(threadAddress),(pParm),(flag),(UINT*)(pctx? pctx:&ctx) );
}
#define ErrorMsg printfDWORD __stdcall TransmitThread(LPVOID parm)
{
SOCKET s=pram;
char buffer[4096];
int nRead
while((nRead=recv(s,buffer,4096,0))>0)
{
buffer[nRead]=0;
printf("%s",buffer);
};
closesocket(s);
return 0;
}void main(int argc,char** argv)
{
if(argc<2)
{
ErrorMsg( "Usage\n"
"\tSockSvr localport \n");
return;
}
SOCKET s;
WSADATA wsd; int port1;
port1=atoi(argv[1]); if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
ErrorMsg("WSAStartup failed\n");
return;
}
s=socket(AF_INET,SOCK_STREAM,0);
if(s==INVALID_SOCKET)
{
ErrorMsg("Create socket failed %d\n",WSAGetLastError());
return;
}
sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(port1);
addr.sin_addr.S_un.S_addr=INADDR_ANY; if(bind(s,(SOCKADDR*)&addr,sizeof(addr)))
{
ErrorMsg("Failed to bind socket %d\n",WSAGetLastError());
return;
} while(1)
{
listen(s,5);
sockaddr_in inaddr;
int sz=sizeof(inaddr);
SOCKET s1=accept(s,(SOCKADDR*)&inaddr,&sz);
CloseHandle(ThreadCreate(TransmitThread,(LPVOID)s1));
}
WSACleanup();
};
客户端就不写了,你在本机运行服务器后自己用telnet localhost port试吧
比如
服务器:(机器名server)
socksvr 8080
客户端运行
telnet server 8080然后客户端输入在服务器端应该可以看到
改用Create(0)
Windows会自动分配空闲的端口