下面是客户端模拟并发连接并收发简单数据的代码:
#include   <afxwin.h> 
#include<stdio.h>
#include<winsock2.h>
#include<fstream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int k=0;
HANDLE m_hEvent; UINT testThread(LPVOID param)  
{
SOCKET sock;
struct sockaddr_in sa;
int err;
int servport=4567;
char buff[1024];
int len;
WSADATA ws;

// 初始化Winsock
if(WSAStartup(0x0101,&ws)!=0)
  {
     printf("WSAStartup() failed!\n");
     exit(-1);
  }  //创建套接字
  sock=socket(AF_INET,SOCK_STREAM,0);
  
  //定义服务器地址结构
  memset(&sa,0,sizeof(sa));
  sa.sin_family=AF_INET;
  sa.sin_port=htons(servport);  
  sa.sin_addr.s_addr=inet_addr("127.0.0.1");  WaitForSingleObject(m_hEvent,INFINITE);  // 连接服务器
  err=connect(sock,(const sockaddr*)&sa,sizeof(sa));
 
char sendBuf[1024] ={0};
char recvBuf[1024] ={0};
sprintf(sendBuf,"Test %d", ++k);
send(sock,sendBuf,strlen(sendBuf)+1,0);
recv(sock,recvBuf,sizeof(recvBuf),0);
printf("%s\n",recvBuf);   ofstream fout("output.txt",ios::app);//这里是保存发送和接受的信息,以便查看成功的次数
  fout <<sendBuf<<"***"<< recvBuf<<"\n";
  fout << flush;
  fout.close();   //关闭连接
  closesocket(sock);
  WSACleanup();
}void main()
{
HANDLE        hThread;   
    DWORD         dwThreadId;  
int k;
m_hEvent = CreateEvent(NULL,TRUE,false,0);
for(k = 0;k <5000 ; k++)
{
hThread =AfxBeginThread(testThread,NULL);
 CloseHandle(hThread);
}
SetEvent(m_hEvent);
Sleep(9999999);}1.请问一下我这个测试代码合理吗?
2.为什么我设置了5000个进程并发连接测试,但是在output.txt里面却只记录了大概1500个左右呢?
3.在output.txt里面的记录按理说应该是按照 fout <<sendBuf<<"***"<< recvBuf<<"\n";这种形式一行一条,但实际中出现这种情况:
Test 850***Test 850---------9***1024 
4
Test 1228***Test 1228---------10***1024
Test 1238***Test 1238---------10***102TesTest 861***Test 861---------9***102TesTest 1241***Test这里没有换行1241---------10***102Test 872***Test 872---------9***1024
我觉得可能是进程并发时候对文件同时操作导致会出现上面这种错误出现,不知道理解的对不对?

解决方案 »

  1.   

    系统对tcp连接数应该是有限制的
    多线程读写文件没有做同步
      

  2.   

    感谢关注~!
    我的是WIN7,看了下系统,好像对tcp连接数没有限制了....
    我来改一下文件读写互斥那段代码看看先~谢
      

  3.   

    现在的问题就是为什么建立了5000个线程,却只有1500个左右的tcp连接?
      

  4.   

    一个进程最大能开的默认线程2000个左右。
    fout 不是线程安全。就是STL库不是安全的。
    测试并发性,可以多开几个一样的程序不就可以了。
      

  5.   

    下面这种情况可以用CriticalSection解决。3.在output.txt里面的记录按理说应该是按照 fout <<sendBuf<<"***"<< recvBuf<<"\n";这种形式一行一条,但实际中出现这种情况:
    Test 850***Test 850---------9***1024  
    4
    Test 1228***Test 1228---------10***1024
    Test 1238***Test 1238---------10***102TesTest 861***Test 861---------9***102TesTest 1241***Test这里没有换行1241---------10***102Test 872***Test 872---------9***1024
      

  6.   

    另外也没有判断socket创建会不会失改,连接会不会失败,文件打开是不是成功。