下面是客户端模拟并发连接并收发简单数据的代码:
#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
我觉得可能是进程并发时候对文件同时操作导致会出现上面这种错误出现,不知道理解的对不对?
#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
我觉得可能是进程并发时候对文件同时操作导致会出现上面这种错误出现,不知道理解的对不对?
解决方案 »
- webbrowser如何让滚动条滚动
- 程序不能调试
- VISTA下reg.exe进程卡死的问题
- 请问ms_chart控件的Y坐标的取值如何反过来啊?
- "SM_MOUSEWHEELPRESENT"明明在"WINUSER.H"的头文件中有定义,却提示无定义?怎么回事?
- 用ODBC访问EXCEL时,怎么知道EXCEL文件中有那些表?急!(另送50)
- 各位官人看过来,小生有个问题########################
- 求教高手有关listview 的问题,高分!
- DLL程序如何获知调用它的线程的句柄?
- 一个困扰了我很久的问题,请VC高手朋友进来
- CHtmlView 中检索网页文字过程中 get_outerHTML() 访问冲突,why ?
- HTTP向服务器目录上传文件问题?
多线程读写文件没有做同步
我的是WIN7,看了下系统,好像对tcp连接数没有限制了....
我来改一下文件读写互斥那段代码看看先~谢
fout 不是线程安全。就是STL库不是安全的。
测试并发性,可以多开几个一样的程序不就可以了。
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