手贱改了dw里面 类 的名字,dw撤销快捷键以后也一直显示错误,不知道怎么弄了,菜鸟需要大神们的帮助啊!!!

想编写一个主机之间通信的程序,我在定义数组时直接定义的char【2048】,我的本意是通过socke接收过来数据存到数组,然后再显示到对话框然后保存到文件中,但是我用调试助手试过之后就是,接收的数据是对的,也可以显示保存也可以,但是只要对话框一被覆盖再点击对话框的时候就会未响应!跪求啊,菜鸟真的很无助,求带!
以下是部分代码
真心求帮助,麻烦大神多多照顾
void&CTESTDlg::OnSocket()
SOCKADDR_IN&addrC
int&len=sizeof(SOCKADDR);
SOCKET&sockconn=accept(m_socket,(SOCKADDR*)&addrClient,&len);
&&&&&&&&char&sendbuf[100];
sprintf(sendbuf,&welcome&%s&to&yyy&,inet_ntoa(addrClient.sin_addr));
send(sockconn,sendbuf,strlen(sendbuf)+1,0);
recv(sockconn,recvbuf,strlen(recvbuf),0);
recvbuf+='\0';
&&&&&&&&//printf(&%s\n&,recvbuf);
CClientDC&dc(this);
GetClientRect(&rt);
int&pos_x=0;
int&pos_y=0;
for(int&i=0;i&800;i++)
dc.TextOut(x+pos_x,y+pos_y,recvbuf[i]);
pos_x=pos_x+10;
if(x+pos_x&rt.Width())
if(y+pos_y&rt.Height())
AfxMessageBox(&error!&);
&&&&&&&&CStdioFile&
CString&strname=&D:\\练习\\复件&TEST\\1.txt&;
file.Open((LPCTSTR)strname,CFile::modeCreate||CFile::modeReadWrite);
// file.SeekToEnd();
&&&&&&&&file.WriteString(recvbuf);
file.Close();
closesocket(sockconn);
回复讨论(解决方案)
这个是前面初始化部分的
BOOL&CTESTDlg::OnInitSock()
WORD&wVersionR
WSADATA&wsaD
wVersionRequested&=&MAKEWORD(1,&1);
//加载套接字
if&(&WSAStartup(&wVersionRequested,&&wsaData&)&!=&0&)&
// AfxMessageBox(&套接字加载失败!&);
return&FALSE;
//确认套接字版本
if&(&LOBYTE(&wsaData.wVersion&)&!=&1||&HIBYTE(&wsaData.wVersion&)&!=&1&)&
// AfxMessageBox(&套接字版本错误!&);
WSACleanup();
return&FALSE;&
m_socket=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==m_socket&)
AfxMessageBox(&创建套接字失败!&);
return&FALSE;
SOCKADDR_IN&
addrsrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrsrv.sin_family=AF_INET;
addrsrv.sin_port=htons(6000);
if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrsrv,sizeof(SOCKADDR)))
MessageBox(&绑定套接字失败!&);
return&FALSE;
listen(m_socket,5);
&&&&return&TRUE;
#include&sys/socket.h&
int&PASCAL&FAR&recv(&SOCKET&s,&char&FAR*&buf,&int&len,&int&flags);
s:一个标识已连接套接口的描述字。
buf:用于接收数据的缓冲区。
len:缓冲区长度。
flags:指定调用方式。
这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时:
(1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR;
(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的);
你recv(sockconn,recvbuf, 2048,0);后面的没看先试试
我想,&多半是你在UI线程中处理接收数据了,&这样UI线程被阻塞了,&&未响应是很正常的事.
OnSocket&很像是一按钮的响应函数,&你写在这里面接收数据,&UI线程就被卡死了.
你需要把这些接收数据的代码放到线程中.
我想,&多半是你在UI线程中处理接收数据了,&这样UI线程被阻塞了,&&未响应是很正常的事.
OnSocket&很像是一按钮的响应函数,&你写在这里面接收数据,&UI线程就被卡死了.
你需要把这些接收数据的代码放到线程中.
就是这个理儿!
我想,&多半是你在UI线程中处理接收数据了,&这样UI线程被阻塞了,&&未响应是很正常的事.
OnSocket&很像是一按钮的响应函数,&你写在这里面接收数据,&UI线程就被卡死了.
你需要把这些接收数据的代码放到线程中.
那应该怎么处理才行呀,我就是在对话框上新建了一个按钮,然后点击按钮接收数据的,应该怎样将接收数据的代码放到线程里呢,对线程概念很模糊,一般是哪个函数里面呀?因为比较急,所以跪求大神们帮助[
我想,&多半是你在UI线程中处理接收数据了,&这样UI线程被阻塞了,&&未响应是很正常的事.
OnSocket&很像是一按钮的响应函数,&你写在这里面接收数据,&UI线程就被卡死了.
你需要把这些接收数据的代码放到线程中.
就是这个理儿!
不知大神有没有时间呢,有时间可以帮我修改下吗?菜鸟真心对程序充满了恐怖啊
我想,&多半是你在UI线程中处理接收数据了,&这样UI线程被阻塞了,&&未响应是很正常的事.
OnSocket&很像是一按钮的响应函数,&你写在这里面接收数据,&UI线程就被卡死了.
你需要把这些接收数据的代码放到线程中.
是要创建多线程吗?应该没有必要那么麻烦把?真心乏力呀!好心人多帮帮我哦
MYVOID&thdLSs_recv(void&*pcn)&{
&&&&char&&&&&&&&*recv_
&&&&int&&&&&&&&&&recv_
&&&&int&&&&&&&&&&
&&&&SOCKADDR_IN&&dest_
&&&&bool&&&&&&&&&
&&&&int&&&&&&&&&&
&&&&cn=(int)
//&&Log(&%03d&%s#%d&thdLSs_recv&thread&begin...\n&,cn,__FILE__,__LINE__);
&&&&Log(&%03d&thdLSs_recv&&&&&&&thread&begin...\n&,cn);
&&&&recv_buf=(char&*)(LSs_recv_buf[cn]);
&&&&while&(1)&{
&&&&&&&&sleep_ms(10);
&&&&&&&&if&('c'==LSs_cs[cn])&{
&&&&&&&&&&&&if&('b'==LSs_state[cn])&{//请求连接APP
&&&&&&&&&&&&&&&&LSs[cn]=socket(AF_INET,SOCK_STREAM,0);
&&&&&&&&&&&&&&&&if&(INVALID_SOCKET==LSs[cn])&{
&&&&&&&&&&&&&&&&&&&&Log(&%03d&error&on&(socket)&%d\n&,cn,LastError());
&&&&&&&&&&&&&&&&&&&&//
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&val=
&&&&&&&&&&&&&&&&setsockopt(LSs[cn],SOL_SOCKET,((int)(SO_REUSEADDR)),(LPCSTR)&val,4);
&&&&&&&&&&&&&&&&dest_sin.sin_family=AF_INET;
&&&&&&&&&&&&&&&&dest_sin.sin_addr.s_addr=inet_addr(LSs_ip[cn]);
&&&&&&&&&&&&&&&&dest_sin.sin_port=htons(LSs_port[cn]);
&&&&&&&&&&&&&&&&if&(SOCKET_ERROR==connect(LSs[cn],(PSOCKADDR)&dest_sin,sizeof(dest_sin)))&{
&&&&&&&&&&&&&&&&&&&&Log(&%03d&error&on&(connect)&%d\n&,cn,LastError());
&&&&&&&&&&&&&&&&&&&&closesocket(LSs[cn]);
&&&&&&&&&&&&&&&&&&&&LSs_state[cn]='r';//准备重连APP
&&&&&&&&&&&&&&&&&&&&sleep_ms(GAP_LSC_RECONN);
&&&&&&&&&&&&&&&&&&&&LSs_state[cn]='b';
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&Log(&%03d&(connect)&OK\n&,cn);
&&&&&&&&&&&&&&&&Lock(&cs_DSBs);
&&&&&&&&&&&&&&&&DSBs[cn].head=0;
&&&&&&&&&&&&&&&&DSBs[cn].tail=0;
&&&&&&&&&&&&&&&&DSBs[cn].size=0;
&&&&&&&&&&&&&&&&Unlock(&cs_DSBs);
&&&&&&&&&&&&&&&&Lock(&cs_URBs);
&&&&&&&&&&&&&&&&URBs[cn].head=0;
&&&&&&&&&&&&&&&&URBs[cn].tail=0;
&&&&&&&&&&&&&&&&URBs[cn].size=0;
&&&&&&&&&&&&&&&&Unlock(&cs_URBs);
&&&&&&&&&&&&&&&&LSs_state[cn]='c';
&&&&&&&&&&&&}
&&&&&&&&if&('c'==LSs_state[cn])&{//已连接APP
&&&&&&&&&&&&while&(1)&{
&&&&&&&&&&&&&&&&Log(&%03d&calling&recv(socket=%d,MAX_L_BUFSIZE=%d)\n&,cn,LSs[cn],MAX_L_BUFSIZE);
&&&&&&&&&&&&&&&&recv_nbytes=recv(LSs[cn],recv_buf,MAX_L_BUFSIZE,0);
&&&&&&&&&&&&&&&&if&(SOCKET_ERROR==recv_nbytes||0==recv_nbytes)&{
&&&&&&&&&&&&&&&&&&&&Log(&%03d&error&on&(recv)&%d,%d\n&,cn,recv_nbytes,LastError());
&&&&&&&&&&&&&&&&&&&&closesocket(LSs[cn]);
&&&&&&&&&&&&&&&&&&&&if&('c'==LSs_cs[cn])&LSs_state[cn]='b';&else&LSs_state[cn]='i';
&&&&&&&&&&&&&&&&&&&&//
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&Log(&%03d&APP[%d]&total&recv&count&%08d:&0x%04x&bytes\n&,cn,cn,++APPs_trc[cn],recv_nbytes);
&&&&&&&&&&&&&&&&HexDump(cn,recv_buf,recv_nbytes);
&&&&&&&&&&&&&&&&wc=0;
&&&&&&&&&&&&&&&&while&(1)&{
&&&&&&&&&&&&&&&&&&&&if&(PutToLBuf(cn,&cs_URBs,&URBs[cn],recv_buf,recv_nbytes))&//
&&&&&&&&&&&&&&&&&&&&sleep_ms(GAP_WAIT);
&&&&&&&&&&&&&&&&&&&&if&('c'!=LSs_state[cn])&//
&&&&&&&&&&&&&&&&&&&&if&('E'==LSs_state[cn]||No_Loop)&//
&&&&&&&&&&&&&&&&&&&&wc++;
&&&&&&&&&&&&&&&&&&&&if&(wc&MAX_WAIT_COUNT)&Log(&%03d&%d==wc&MAX_WAIT_COUNT==%d!\n&,cn,wc,MAX_WAIT_COUNT);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&if&('E'==LSs_state[cn]||No_Loop)&//
&&&&&&&&&&&&}
&&&&&&&&if&(No_Loop)&//
#ifndef&WIN32
&&&&pthread_exit(NULL);
#ifdef&WIN32
&&&&for&(i=0;i&MAX_CONN;i++)&{
&&&&&&&&_beginthread((void(__cdecl&*)(void&*))thdLSs_recv,0,(void&*)i&&&&&&);
&&&&threadsN=0;
&&&&for&(i=0;i&MAX_CONN;i++)&{
&&&&&&&&rc=pthread_create(&(threads[threadsN++]),NULL,thdLSs_recv,(void&*)i&&&&&&);if&(rc)&Log(&%d=pthread_create&%03d&error!\n&,rc,threadsN-1);
MYVOID&thdLSs_recv(void&*pcn)&{
&&&&char&&&&&&&&*recv_
&&&&int&&&&&&&&&&recv_
&&&&int&&&&&&&&&&
&&&&SOCKADDR_IN&&dest_
&&&&bool&&&&&&&&&
&&&&int&&&&&&&&&&
&&&&cn=(int)
//&&Log(&%03d&%s#%d&thdLSs_recv&thread&begin...\n&,cn,__FILE__,__LINE__);
&&&&Log(&%03d&thdLSs_recv&&&&&&&thread&begin...\n&,cn);
&&&&recv_buf=(char&*)(LSs_recv_buf[cn]);
&&&&while&(1)&{
&&&&&&&&sleep_ms(10);
&&&&&&&&if&('c'==LSs_cs[cn])&{
&&&&&&&&&&&&if&('b'==LSs_state[cn])&{//请求连接APP
&&&&&&&&&&&&&&&&LSs[cn]=socket(AF_INET,SOCK_STREAM,0);
&&&&&&&&&&&&&&&&if&(INVALID_SOCKET==LSs[cn])&{
&&&&&&&&&&&&&&&&&&&&Log(&%03d&error&on&(socket)&%d\n&,cn,LastError());
&&&&&&&&&&&&&&&&&&&&//
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&val=
&&&&&&&&&&&&&&&&setsockopt(LSs[cn],SOL_SOCKET,((int)(SO_REUSEADDR)),(LPCSTR)&val,4);
&&&&&&&&&&&&&&&&dest_sin.sin_family=AF_INET;
&&&&&&&&&&&&&&&&dest_sin.sin_addr.s_addr=inet_addr(LSs_ip[cn]);
&&&&&&&&&&&&&&&&dest_sin.sin_port=htons(LSs_port[cn]);
&&&&&&&&&&&&&&&&if&(SOCKET_ERROR==connect(LSs[cn],(PSOCKADDR)&dest_sin,sizeof(dest_sin)))&{
&&&&&&&&&&&&&&&&&&&&Log(&%03d&error&on&(connect)&%d\n&,cn,LastError());
&&&&&&&&&&&&&&&&&&&&closesocket(LSs[cn]);
&&&&&&&&&&&&&&&&&&&&LSs_state[cn]='r';//准备重连APP
&&&&&&&&&&&&&&&&&&&&sleep_ms(GAP_LSC_RECONN);
&&&&&&&&&&&&&&&&&&&&LSs_state[cn]='b';
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&Log(&%03d&(connect)&OK\n&,cn);
&&&&&&&&&&&&&&&&Lock(&cs_DSBs);
&&&&&&&&&&&&&&&&DSBs[cn].head=0;
&&&&&&&&&&&&&&&&DSBs[cn].tail=0;
&&&&&&&&&&&&&&&&DSBs[cn].size=0;
&&&&&&&&&&&&&&&&Unlock(&cs_DSBs);
&&&&&&&&&&&&&&&&Lock(&cs_URBs);
&&&&&&&&&&&&&&&&URBs[cn].head=0;
&&&&&&&&&&&&&&&&URBs[cn].tail=0;
&&&&&&&&&&&&&&&&URBs[cn].size=0;
&&&&&&&&&&&&&&&&Unlock(&cs_URBs);
&&&&&&&&&&&&&&&&LSs_state[cn]='c';
&&&&&&&&&&&&}
&&&&&&&&if&('c'==LSs_state[cn])&{//已连接APP
&&&&&&&&&&&&while&(1)&{
&&&&&&&&&&&&&&&&Log(&%03d&calling&recv(socket=%d,MAX_L_BUFSIZE=%d)\n&,cn,LSs[cn],MAX_L_BUFSIZE);
&&&&&&&&&&&&&&&&recv_nbytes=recv(LSs[cn],recv_buf,MAX_L_BUFSIZE,0);
&&&&&&&&&&&&&&&&if&(SOCKET_ERROR==recv_nbytes||0==recv_nbytes)&{
&&&&&&&&&&&&&&&&&&&&Log(&%03d&error&on&(recv)&%d,%d\n&,cn,recv_nbytes,LastError());
&&&&&&&&&&&&&&&&&&&&closesocket(LSs[cn]);
&&&&&&&&&&&&&&&&&&&&if&('c'==LSs_cs[cn])&LSs_state[cn]='b';&else&LSs_state[cn]='i';
&&&&&&&&&&&&&&&&&&&&//
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&Log(&%03d&APP[%d]&total&recv&count&%08d:&0x%04x&bytes\n&,cn,cn,++APPs_trc[cn],recv_nbytes);
&&&&&&&&&&&&&&&&HexDump(cn,recv_buf,recv_nbytes);
&&&&&&&&&&&&&&&&wc=0;
&&&&&&&&&&&&&&&&while&(1)&{
&&&&&&&&&&&&&&&&&&&&if&(PutToLBuf(cn,&cs_URBs,&URBs[cn],recv_buf,recv_nbytes))&//
&&&&&&&&&&&&&&&&&&&&sleep_ms(GAP_WAIT);
&&&&&&&&&&&&&&&&&&&&if&('c'!=LSs_state[cn])&//
&&&&&&&&&&&&&&&&&&&&if&('E'==LSs_state[cn]||No_Loop)&//
&&&&&&&&&&&&&&&&&&&&wc++;
&&&&&&&&&&&&&&&&&&&&if&(wc&MAX_WAIT_COUNT)&Log(&%03d&%d==wc&MAX_WAIT_COUNT==%d!\n&,cn,wc,MAX_WAIT_COUNT);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&if&('E'==LSs_state[cn]||No_Loop)&//
&&&&&&&&&&&&}
&&&&&&&&if&(No_Loop)&//
#ifndef&WIN32
&&&&pthread_exit(NULL);
#ifdef&WIN32
&&&&for&(i=0;i&MAX_CONN;i++)&{
&&&&&&&&_beginthread((void(__cdecl&*)(void&*))thdLSs_recv,0,(void&*)i&&&&&&);
&&&&threadsN=0;
&&&&for&(i=0;i&MAX_CONN;i++)&{
&&&&&&&&rc=pthread_create(&(threads[threadsN++]),NULL,thdLSs_recv,(void&*)i&&&&&&);if&(rc)&Log(&%d=pthread_create&%03d&error!\n&,rc,threadsN-1);
这个是MFC么,貌似不是太看得懂,,大神
在类CTESTDlg中增加一个成员函数,&把原来OnSocket函数的代码全部复制到里面.
比如这个函数叫:
void&CTESTDlg::ProcRecv()
&&&&&&&//&OnSocket里的代码复制到这里
定义一个线程函数
UINT&WINAPI&&WorkThread(void&*pVoid)
&&&&&&&&&&&CTESTDlg*&pDlg&=&(CTESTDlg*)pV
&&&&&&&&&&&pDlg-&ProcRecv();&//
&&&&&&&&&&&return&0;
然后把你原来的OnSocket函数中创建出线程
void&CTESTDlg::OnSocket()
&&&&&&&&_beginthreadex(NULL,&0,&&WorkThread,&(void*)this,&0,&NULL);&&//注意,&这个函数需要头文件&process.h&
结合这个看,学到思路即可:
//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#ifdef&WIN32
&&&&#pragma&warning(disable:4996)
#include&&stdio.h&
#include&&stdlib.h&
#include&&string.h&
#ifdef&WIN32
&&&&#include&&windows.h&
&&&&#include&&process.h&
&&&&#include&&io.h&
&&&&#define&&MYVOID&&&&&&&&&&&&&void
&&&&#define&&vsnprintf&&&&&&&&&&_vsnprintf
&&&&#include&&unistd.h&
&&&&#include&&sys/time.h&
&&&&#include&&pthread.h&
&&&&#define&&CRITICAL_SECTION&&&pthread_mutex_t
&&&&#define&&MYVOID&&&&&&&&&&&&&void&*
#define&MAXLOGSIZE&
#define&MAXLINSIZE&16000
#include&&time.h&
#include&&sys/timeb.h&
#include&&stdarg.h&
char&logfilename1[]=&MyLog1.log&;
char&logfilename2[]=&MyLog2.log&;
static&char&logstr[MAXLINSIZE+1];
char&datestr[16];
char&timestr[16];
char&mss[4];
CRITICAL_SECTION&cs_
#ifdef&WIN32
void&Lock(CRITICAL_SECTION&*l)&{
&&&&EnterCriticalSection(l);
void&Unlock(CRITICAL_SECTION&*l)&{
&&&&LeaveCriticalSection(l);
void&sleep_ms(int&ms)&{
&&&&Sleep(ms);
void&Lock(CRITICAL_SECTION&*l)&{
&&&&pthread_mutex_lock(l);
void&Unlock(CRITICAL_SECTION&*l)&{
&&&&pthread_mutex_unlock(l);
void&sleep_ms(int&ms)&{
&&&&usleep(ms*1000);
void&LogV(const&char&*pszFmt,va_list&argp)&{
&&&&struct&tm&*
&&&&struct&timeb&
&&&&if&(NULL==pszFmt||0==pszFmt[0])&
&&&&vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
&&&&ftime(&tb);
&&&&now=localtime(&tb.time);
&&&&sprintf(datestr,&%04d-%02d-%02d&,now-&tm_year+1900,now-&tm_mon+1,now-&tm_mday);
&&&&sprintf(timestr,&%02d:%02d:%02d&,now-&tm_hour&&&&&,now-&tm_min&&,now-&tm_sec&);
&&&&sprintf(mss,&%03d&,tb.millitm);
&&&&printf(&%s&%s.%s&%s&,datestr,timestr,mss,logstr);
&&&&flog=fopen(logfilename1,&a&);
&&&&if&(NULL!=flog)&{
&&&&&&&&fprintf(flog,&%s&%s.%s&%s&,datestr,timestr,mss,logstr);
&&&&&&&&if&(ftell(flog)&MAXLOGSIZE)&{
&&&&&&&&&&&&fclose(flog);
&&&&&&&&&&&&if&(rename(logfilename1,logfilename2))&{
&&&&&&&&&&&&&&&&remove(logfilename2);
&&&&&&&&&&&&&&&&rename(logfilename1,logfilename2);
&&&&&&&&&&&&}
&&&&&&&&}&else&{
&&&&&&&&&&&&fclose(flog);
void&Log(const&char&*pszFmt,...)&{
&&&&va_list&
&&&&Lock(&cs_log);
&&&&va_start(argp,pszFmt);
&&&&LogV(pszFmt,argp);
&&&&va_end(argp);
&&&&Unlock(&cs_log);
#define&ASIZE&&&&200
#define&BSIZE&&&&240
#define&CSIZE&&&&&&2
char&Abuf[ASIZE];
char&Cbuf[CSIZE];
CRITICAL_SECTION&cs_HEX&;
CRITICAL_SECTION&cs_BBB&;
struct&FIFO_BUFFER&{
&&&&char&data[BSIZE];
int&No_Loop=0;
void&HexDump(int&cn,char&*buf,int&len)&{
&&&&int&i,j,k;
&&&&char&binstr[80];
&&&&Lock(&cs_HEX);
&&&&for&(i=0;i&i++)&{
&&&&&&&&if&(0==(i%16))&{
&&&&&&&&&&&&sprintf(binstr,&%03d&%04x&-&,cn,i);
&&&&&&&&&&&&sprintf(binstr,&%s&%02x&,binstr,(unsigned&char)buf[i]);
&&&&&&&&}&else&if&(15==(i%16))&{
&&&&&&&&&&&&sprintf(binstr,&%s&%02x&,binstr,(unsigned&char)buf[i]);
&&&&&&&&&&&&sprintf(binstr,&%s&&&,binstr);
&&&&&&&&&&&&for&(j=i-15;j&=i;j++)&{
&&&&&&&&&&&&&&&&sprintf(binstr,&%s%c&,binstr,('!'&buf[j]&&buf[j]&='~')?buf[j]:'.');
&&&&&&&&&&&&}
&&&&&&&&&&&&Log(&%s\n&,binstr);
&&&&&&&&}&else&{
&&&&&&&&&&&&sprintf(binstr,&%s&%02x&,binstr,(unsigned&char)buf[i]);
&&&&if&(0!=(i%16))&{
&&&&&&&&k=16-(i%16);
&&&&&&&&for&(j=0;j&k;j++)&{
&&&&&&&&&&&&sprintf(binstr,&%s&&&&,binstr);
&&&&&&&&sprintf(binstr,&%s&&&,binstr);
&&&&&&&&k=16-k;
&&&&&&&&for&(j=i-k;j&i;j++)&{
&&&&&&&&&&&&sprintf(binstr,&%s%c&,binstr,('!'&buf[j]&&buf[j]&='~')?buf[j]:'.');
&&&&&&&&Log(&%s\n&,binstr);
&&&&Unlock(&cs_HEX);
int&GetFromRBuf(int&cn,CRITICAL_SECTION&*cs,FIFO_BUFFER&*fbuf,char&*buf,int&len)&{
&&&&int&lent,len1,len2;
&&&&lent=0;
&&&&Lock(cs);
&&&&if&(fbuf-&size&=len)&{
&&&&&&&&lent=
&&&&&&&&if&(fbuf-&head+lent&BSIZE)&{
&&&&&&&&&&&&len1=BSIZE-fbuf-&
&&&&&&&&&&&&memcpy(buf&&&&&,fbuf-&data+fbuf-&head,len1);
&&&&&&&&&&&&len2=lent-len1;
&&&&&&&&&&&&memcpy(buf+len1,fbuf-&data&&&&&&&&&&&,len2);
&&&&&&&&&&&&fbuf-&head=len2;
&&&&&&&&}&else&{
&&&&&&&&&&&&memcpy(buf&&&&&,fbuf-&data+fbuf-&head,lent);
&&&&&&&&&&&&fbuf-&head+=
&&&&&&&&fbuf-&size-=
&&&&Unlock(cs);
&&&&return&
MYVOID&thdB(void&*pcn)&{
&&&&char&&&&&&&&*recv_
&&&&int&&&&&&&&&&recv_
&&&&int&&&&&&&&&&
&&&&int&&&&&&&&&&
&&&&int&&&&&&&&&&
&&&&cn=(int)
&&&&Log(&%03d&thdB&&&&&&&&&&&&&&thread&begin...\n&,cn);
&&&&while&(1)&{
&&&&&&&&sleep_ms(10);
&&&&&&&&recv_buf=(char&*)C
&&&&&&&&recv_nbytes=CSIZE;
&&&&&&&&wc=0;
&&&&&&&&while&(1)&{
&&&&&&&&&&&&pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);
&&&&&&&&&&&&if&(pb)&{
&&&&&&&&&&&&&&&&Log(&%03d&recv&%d&bytes\n&,cn,pb);
&&&&&&&&&&&&&&&&HexDump(cn,recv_buf,pb);
&&&&&&&&&&&&&&&&sleep_ms(1);
&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&sleep_ms(1000);
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(No_Loop)&//
&&&&&&&&&&&&wc++;
&&&&&&&&&&&&if&(wc&3600)&Log(&%03d&%d==wc&3600!\n&,cn,wc);
&&&&&&&&if&(No_Loop)&//
#ifndef&WIN32
&&&&pthread_exit(NULL);
int&PutToRBuf(int&cn,CRITICAL_SECTION&*cs,FIFO_BUFFER&*fbuf,char&*buf,int&len)&{
&&&&int&lent,len1,len2;
&&&&Lock(cs);
&&&&if&(fbuf-&size+lent&BSIZE)&{
&&&&&&&&lent=BSIZE-fbuf-&
&&&&if&(fbuf-&tail+lent&BSIZE)&{
&&&&&&&&len1=BSIZE-fbuf-&
&&&&&&&&memcpy(fbuf-&data+fbuf-&tail,buf&&&&&,len1);
&&&&&&&&len2=lent-len1;
&&&&&&&&memcpy(fbuf-&data&&&&&&&&&&&,buf+len1,len2);
&&&&&&&&fbuf-&tail=len2;
&&&&}&else&{
&&&&&&&&memcpy(fbuf-&data+fbuf-&tail,buf&&&&&,lent);
&&&&&&&&fbuf-&tail+=
&&&&fbuf-&size+=
&&&&Unlock(cs);
&&&&return&
MYVOID&thdA(void&*pcn)&{
&&&&char&&&&&&&&*send_
&&&&int&&&&&&&&&&send_
&&&&int&&&&&&&&&&
&&&&int&&&&&&&&&&
&&&&int&&&&&&&&&&&a;
&&&&int&&&&&&&&&&
&&&&cn=(int)
&&&&Log(&%03d&thdA&&&&&&&&&&&&&&thread&begin...\n&,cn);
&&&&while&(1)&{
&&&&&&&&sleep_ms(100);
&&&&&&&&memset(Abuf,a,ASIZE);
&&&&&&&&a=(a+1)%256;
&&&&&&&&if&(16==a)&{No_Loop=1;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop
&&&&&&&&send_buf=(char&*)A
&&&&&&&&send_nbytes=ASIZE;
&&&&&&&&Log(&%03d&sending&%d&bytes\n&,cn,send_nbytes);
&&&&&&&&HexDump(cn,send_buf,send_nbytes);
&&&&&&&&wc=0;
&&&&&&&&while&(1)&{
&&&&&&&&&&&&pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);
&&&&&&&&&&&&Log(&%03d&sent&%d&bytes\n&,cn,pa);
&&&&&&&&&&&&HexDump(cn,send_buf,pa);
&&&&&&&&&&&&send_buf+=
&&&&&&&&&&&&send_nbytes-=
&&&&&&&&&&&&if&(send_nbytes&=0)&//
&&&&&&&&&&&&sleep_ms(1000);
&&&&&&&&&&&&if&(No_Loop)&//
&&&&&&&&&&&&wc++;
&&&&&&&&&&&&if&(wc&3600)&Log(&%03d&%d==wc&3600!\n&,cn,wc);
&&&&&&&&if&(No_Loop)&//
#ifndef&WIN32
&&&&pthread_exit(NULL);
int&main()&{
#ifdef&WIN32
&&&&InitializeCriticalSection(&cs_log);
&&&&InitializeCriticalSection(&cs_HEX&);
&&&&InitializeCriticalSection(&cs_BBB&);
&&&&pthread_t&threads[2];
&&&&int&threadsN;
&&&&pthread_mutex_init(&cs_log,NULL);
&&&&pthread_mutex_init(&cs_HEX,NULL);
&&&&pthread_mutex_init(&cs_BBB,NULL);
&&&&Log(&Start===========================================================\n&);
&&&&BBB.head=0;
&&&&BBB.tail=0;
&&&&BBB.size=0;
#ifdef&WIN32
&&&&_beginthread((void(__cdecl&*)(void&*))thdA,0,(void&*)1);
&&&&_beginthread((void(__cdecl&*)(void&*))thdB,0,(void&*)2);
&&&&threadsN=0;
&&&&rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void&*)1);if&(rc)&Log(&%d=pthread_create&%d&error!\n&,rc,threadsN-1);
&&&&rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void&*)2);if&(rc)&Log(&%d=pthread_create&%d&error!\n&,rc,threadsN-1);
&&&&if&(!access(&No_Loop&,0))&{
&&&&&&&&remove(&No_Loop&);
&&&&&&&&if&(!access(&No_Loop&,0))&{
&&&&&&&&&&&&No_Loop=1;
&&&&while&(1)&{
&&&&&&&&sleep_ms(1000);
&&&&&&&&if&(No_Loop)&//
&&&&&&&&if&(!access(&No_Loop&,0))&{
&&&&&&&&&&&&No_Loop=1;
&&&&sleep_ms(3000);
&&&&Log(&End=============================================================\n&);
#ifdef&WIN32
&&&&DeleteCriticalSection(&cs_BBB&);
&&&&DeleteCriticalSection(&cs_HEX&);
&&&&DeleteCriticalSection(&cs_log);
&&&&pthread_mutex_destroy(&cs_BBB);
&&&&pthread_mutex_destroy(&cs_HEX);
&&&&pthread_mutex_destroy(&cs_log);
&&&&return&0;
在类CTESTDlg中增加一个成员函数,&把原来OnSocket函数的代码全部复制到里面.
比如这个函数叫:
void&CTESTDlg::ProcRecv()
&&&&&&&//&OnSocket里的代码复制到这里
定义一个线程函数
UINT&WINAPI&&WorkThread(void&*pVoid)
&&&&&&&&&&&CTESTDlg*&pDlg&=&(CTESTDlg*)pV
&&&&&&&&&&&pDlg-&ProcRecv();&//
&&&&&&&&&&&return&0;
然后把你原来的OnSocket函数中创建出线程
void&CTESTDlg::OnSocket()
&&&&&&&&_beginthreadex(NULL,&0,&&WorkThread,&(void*)this,&0,&NULL);&&//注意,&这个函数需要头文件&process.h&
在类CTESTDlg中增加一个成员函数,&把原来OnSocket函数的代码全部复制到里面.
比如这个函数叫:
void&CTESTDlg::ProcRecv()
&&&&&&&//&OnSocket里的代码复制到这里
定义一个线程函数
UINT&WINAPI&&WorkThread(void&*pVoid)
&&&&&&&&&&&CTESTDlg*&pDlg&=&(CTESTDlg*)pV
&&&&&&&&&&&pDlg-&ProcRecv();&//
&&&&&&&&&&&return&0;
然后把你原来的OnSocket函数中创建出线程
void&CTESTDlg::OnSocket()
&&&&&&&&_beginthreadex(NULL,&0,&&WorkThread,&(void*)this,&0,&NULL);&&//注意,&这个函数需要头文件&process.h&
真的是超级感谢你,未响应的已经解决了,其实我要做的就是下面叙述的;
老板最近让我编写一个上位机和下位机的通信,具体的实现流程如下:
1.&&&&我设置一个端口比如&&6023,监听,另一台主机会来连我,发送的数组中会将它的IP地址给我,然后我会回发一个当前主机已经连的节点数,回发过去
2&&&端口6040,也是作为服务器,下位机收到我之前发的数据后会根据我回的主机数隔段时间来连我,我接受之后就会实时的通信,数据量大概2K左右,
我现在就是想改怎样才能将下位机的数据接收过来呀?还有这个应答报道式的通信方式要多线程来编写吗?我只是想能稳定的收到数据,但是实在无从下手啊!,
我现在按照你的方法,单个节点都可以调通了,也不会出现未响应,那应该怎样才能将这些节点合理有序的按照老板说的那样工作呢?
还有一个就是我定义的数组写入文件或者在对话框上面时,数组没满的话会出现乱码应该怎样解决?我用memset函数貌似不行,会出现只能收到部分代码的情况
大神求救啊,太感谢你啦
我想,&多半是你在UI线程中处理接收数据了,&这样UI线程被阻塞了,&&未响应是很正常的事.
OnSocket&很像是一按钮的响应函数,&你写在这里面接收数据,&UI线程就被卡死了.
你需要把这些接收数据的代码放到线程中.
按照你的方法对话框未响应可以解决了,现在还有一比较大的问题就是,例如我将数组中的数显示到对话框上面的时候,只要有个界面覆盖上面的时候,再回来对话框被覆盖的位置就没数字了,应该怎样解决比较好呀,谢了
专门线程负责循环accept,&就是专门管理用户连接.&&&&&因为你开了两个服务器端口,&那应该是需要两个accept线程.&&
专门线程负责循环recv数据.&&因为你有两个端口,&最好是分开两个线程管理各自端口的收发.
至于你说的对话框被覆盖,回来就没数字了,&你不会是使用DC绘制的数字吧.......&&使用静态文本来显示你的数字,&或者编辑框也行.
如果还是不清楚,&那去看一下关于多线程和网络编程的教程吧.
这里给你推荐一个孙鑫老师的:&.cn/pcedu/empolder/gj/vc/.html
专门线程负责循环accept,&就是专门管理用户连接.&&&&&因为你开了两个服务器端口,&那应该是需要两个accept线程.&&
专门线程负责循环recv数据.&&因为你有两个端口,&最好是分开两个线程管理各自端口的收发.
至于你说的对话框被覆盖,回来就没数字了,&你不会是使用DC绘制的数字吧.......&&使用静态文本来显示你的数字,&或者编辑框也行.
如果还是不清楚,&那去看一下关于多线程和网络编程的教程吧.
这里给你推荐一个孙鑫老师的:&.cn/pcedu/empolder/gj/vc/.html
我现在写的就是连个线程,一共专门处理23口的收发,另一个专门处理46口的数据收发,现在经过你的指导数据都是可以接发了,就是现在还有两个问题,第一个就是数组写不满的话编辑框里面会出现很多乱码,用memset好像不行,还有我就是我定义的固定数组可以能够实时的接收数据吗?要动态的显示在编辑框上是不是要加个定时器定时更新才行?
专门线程负责循环accept,&就是专门管理用户连接.&&&&&因为你开了两个服务器端口,&那应该是需要两个accept线程.&&
专门线程负责循环recv数据.&&因为你有两个端口,&最好是分开两个线程管理各自端口的收发.
至于你说的对话框被覆盖,回来就没数字了,&你不会是使用DC绘制的数字吧.......&&使用静态文本来显示你的数字,&或者编辑框也行.
如果还是不清楚,&那去看一下关于多线程和网络编程的教程吧.
这里给你推荐一个孙鑫老师的:&.cn/pcedu/empolder/gj/vc/.html
现在数据接发都没什么问题了,为什么将对话框关闭的时候会出现警告呢?就是下面这样的,听起来很奇怪的声音,吓着了,太感谢你了大神,我真的编程很菜,多多包含
专门线程负责循环accept,&就是专门管理用户连接.&&&&&因为你开了两个服务器端口,&那应该是需要两个accept线程.&&
专门线程负责循环recv数据.&&因为你有两个端口,&最好是分开两个线程管理各自端口的收发.
至于你说的对话框被覆盖,回来就没数字了,&你不会是使用DC绘制的数字吧.......&&使用静态文本来显示你的数字,&或者编辑框也行.
如果还是不清楚,&那去看一下关于多线程和网络编程的教程吧.
这里给你推荐一个孙鑫老师的:&.cn/pcedu/empolder/gj/vc/.html
谢谢你哦,那个乱码的我已经解决了,就是现在有程序退出的时候会出现“应用程序发生异常0x”
我两个端口的接收数组都是定义的char&*,然后 recvbuf=new&char[2048];
memset(recvbuf,0,2048);这样的,不知道是不是这个原因引起的,那什么办法可以避免出现这样的异常吗
乱码问题,&多半是你发送数据是是strlen或者sizeof计算数据长度.&那肯定是不行的.&&需要自己计算数据真正长度.
strlen如果遇到数据中间有0,&那么就over了.
sizeof如果你传入的是一个缓冲区指针,&那也over了,&&如果是数组,&每次都会发送整个数组,&浪费网络带宽.
异常,&我想多半是你的程序退出,&而线程却还没有退出,&
至于在哪里异常的,&只需要在调试模式下,&异常的时候中断下来即可.
乱码问题,&多半是你发送数据是是strlen或者sizeof计算数据长度.&那肯定是不行的.&&需要自己计算数据真正长度.
strlen如果遇到数据中间有0,&那么就over了.
sizeof如果你传入的是一个缓冲区指针,&那也over了,&&如果是数组,&每次都会发送整个数组,&浪费网络带宽.
异常,&我想多半是你的程序退出,&而线程却还没有退出,&
至于在哪里异常的,&只需要在调试模式下,&异常的时候中断下来即可.
异常原因找到了,我线程结束的时候没有终止线程,你真的是太牛了哈哈!对了再麻烦问下,我要是数据实时接收的话是不是要加个定时器?就是定时去端口采集数据然后显示到编辑框上面?
&当有一个现成的你觉得麻烦的解决方案时,&如果要去找不麻烦的,&很可能找的时间已经够你把麻烦的实现好几遍了。&所以在寻找一会无果,或者找到的没有实现自己想要时,&果断去试麻烦的。&不能怕麻烦。&曾经多次怕麻烦&花好几天时间找简单解决方案的撸过。
定时器可以,&但是需要注意,&如果使用WM_TIMER定时器,&可能导致UI线程被阻塞,也就是界面&未响应&.
最好是线程中读取,&线程中定时简单是使用Sleep,&好点的使用事件.
定时器可以,&但是需要注意,&如果使用WM_TIMER定时器,&可能导致UI线程被阻塞,也就是界面&未响应&.
最好是线程中读取,&线程中定时简单是使用Sleep,&好点的使用事件.
为什么我在调试助手使用时不选择以16进制发的话收到的数据和发的数据是一样的,只要选择以16进制发的话,发送的数据还是会转换成字符串的格式输出,大神求帮忙看下问题出在哪里呀?应该怎样改下呢?我定义的接收数据的recvbuf为char&*,然后recvbuf&在初始化的时候new的一个char数组,求帮忙分析下问题出在哪里呀?
我想,&多半是你在UI线程中处理接收数据了,&这样UI线程被阻塞了,&&未响应是很正常的事.
OnSocket&很像是一按钮的响应函数,&你写在这里面接收数据,&UI线程就被卡死了.
你需要把这些接收数据的代码放到线程中.
就是这个理儿!
为什么我在调试助手使用时不选择以16进制发的话收到的数据和发的数据是一样的,只要选择以16进制发的话,发送的数据还是会转换成字符串的格式输出,大神求帮忙看下问题出在哪里呀?应该怎样改下呢?我定义的接收数据的recvbuf为char&*,然后recvbuf&在初始化的时候new的一个char数组,求帮忙分析下问题出在哪里呀?
结合这个看,学到思路即可:
//循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#ifdef&WIN32
&&&&#pragma&warning(disable:4996)
#include&&stdio.h&
#include&&stdlib.h&
#include&&string.h&
#ifdef&WIN32
&&&&#include&&windows.h&
&&&&#include&&process.h&
&&&&#include&&io.h&
&&&&#define&&MYVOID&&&&&&&&&&&&&void
&&&&#define&&vsnprintf&&&&&&&&&&_vsnprintf
&&&&#include&&unistd.h&
&&&&#include&&sys/time.h&
&&&&#include&&pthread.h&
&&&&#define&&CRITICAL_SECTION&&&pthread_mutex_t
&&&&#define&&MYVOID&&&&&&&&&&&&&void&*
#define&MAXLOGSIZE&
#define&MAXLINSIZE&16000
#include&&time.h&
#include&&sys/timeb.h&
#include&&stdarg.h&
char&logfilename1[]=&MyLog1.log&;
char&logfilename2[]=&MyLog2.log&;
static&char&logstr[MAXLINSIZE+1];
char&datestr[16];
char&timestr[16];
char&mss[4];
CRITICAL_SECTION&cs_
#ifdef&WIN32
void&Lock(CRITICAL_SECTION&*l)&{
&&&&EnterCriticalSection(l);
void&Unlock(CRITICAL_SECTION&*l)&{
&&&&LeaveCriticalSection(l);
void&sleep_ms(int&ms)&{
&&&&Sleep(ms);
void&Lock(CRITICAL_SECTION&*l)&{
&&&&pthread_mutex_lock(l);
void&Unlock(CRITICAL_SECTION&*l)&{
&&&&pthread_mutex_unlock(l);
void&sleep_ms(int&ms)&{
&&&&usleep(ms*1000);
void&LogV(const&char&*pszFmt,va_list&argp)&{
&&&&struct&tm&*
&&&&struct&timeb&
&&&&if&(NULL==pszFmt||0==pszFmt[0])&
&&&&vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
&&&&ftime(&tb);
&&&&now=localtime(&tb.time);
&&&&sprintf(datestr,&%04d-%02d-%02d&,now-&tm_year+1900,now-&tm_mon+1,now-&tm_mday);
&&&&sprintf(timestr,&%02d:%02d:%02d&,now-&tm_hour&&&&&,now-&tm_min&&,now-&tm_sec&);
&&&&sprintf(mss,&%03d&,tb.millitm);
&&&&printf(&%s&%s.%s&%s&,datestr,timestr,mss,logstr);
&&&&flog=fopen(logfilename1,&a&);
&&&&if&(NULL!=flog)&{
&&&&&&&&fprintf(flog,&%s&%s.%s&%s&,datestr,timestr,mss,logstr);
&&&&&&&&if&(ftell(flog)&MAXLOGSIZE)&{
&&&&&&&&&&&&fclose(flog);
&&&&&&&&&&&&if&(rename(logfilename1,logfilename2))&{
&&&&&&&&&&&&&&&&remove(logfilename2);
&&&&&&&&&&&&&&&&rename(logfilename1,logfilename2);
&&&&&&&&&&&&}
&&&&&&&&}&else&{
&&&&&&&&&&&&fclose(flog);
void&Log(const&char&*pszFmt,...)&{
&&&&va_list&
&&&&Lock(&cs_log);
&&&&va_start(argp,pszFmt);
&&&&LogV(pszFmt,argp);
&&&&va_end(argp);
&&&&Unlock(&cs_log);
#define&ASIZE&&&&200
#define&BSIZE&&&&240
#define&CSIZE&&&&&&2
char&Abuf[ASIZE];
char&Cbuf[CSIZE];
CRITICAL_SECTION&cs_HEX&;
CRITICAL_SECTION&cs_BBB&;
struct&FIFO_BUFFER&{
&&&&char&data[BSIZE];
int&No_Loop=0;
void&HexDump(int&cn,char&*buf,int&len)&{
&&&&int&i,j,k;
&&&&char&binstr[80];
&&&&Lock(&cs_HEX);
&&&&for&(i=0;i&i++)&{
&&&&&&&&if&(0==(i%16))&{
&&&&&&&&&&&&sprintf(binstr,&%03d&%04x&-&,cn,i);
&&&&&&&&&&&&sprintf(binstr,&%s&%02x&,binstr,(unsigned&char)buf[i]);
&&&&&&&&}&else&if&(15==(i%16))&{
&&&&&&&&&&&&sprintf(binstr,&%s&%02x&,binstr,(unsigned&char)buf[i]);
&&&&&&&&&&&&sprintf(binstr,&%s&&&,binstr);
&&&&&&&&&&&&for&(j=i-15;j&=i;j++)&{
&&&&&&&&&&&&&&&&sprintf(binstr,&%s%c&,binstr,('!'&buf[j]&&buf[j]&='~')?buf[j]:'.');
&&&&&&&&&&&&}
&&&&&&&&&&&&Log(&%s\n&,binstr);
&&&&&&&&}&else&{
&&&&&&&&&&&&sprintf(binstr,&%s&%02x&,binstr,(unsigned&char)buf[i]);
&&&&if&(0!=(i%16))&{
&&&&&&&&k=16-(i%16);
&&&&&&&&for&(j=0;j&k;j++)&{
&&&&&&&&&&&&sprintf(binstr,&%s&&&&,binstr);
&&&&&&&&sprintf(binstr,&%s&&&,binstr);
&&&&&&&&k=16-k;
&&&&&&&&for&(j=i-k;j&i;j++)&{
&&&&&&&&&&&&sprintf(binstr,&%s%c&,binstr,('!'&buf[j]&&buf[j]&='~')?buf[j]:'.');
&&&&&&&&Log(&%s\n&,binstr);
&&&&Unlock(&cs_HEX);
int&GetFromRBuf(int&cn,CRITICAL_SECTION&*cs,FIFO_BUFFER&*fbuf,char&*buf,int&len)&{
&&&&int&lent,len1,len2;
&&&&lent=0;
&&&&Lock(cs);
&&&&if&(fbuf-&size&=len)&{
&&&&&&&&lent=
&&&&&&&&if&(fbuf-&head+lent&BSIZE)&{
&&&&&&&&&&&&len1=BSIZE-fbuf-&
&&&&&&&&&&&&memcpy(buf&&&&&,fbuf-&data+fbuf-&head,len1);
&&&&&&&&&&&&len2=lent-len1;
&&&&&&&&&&&&memcpy(buf+len1,fbuf-&data&&&&&&&&&&&,len2);
&&&&&&&&&&&&fbuf-&head=len2;
&&&&&&&&}&else&{
&&&&&&&&&&&&memcpy(buf&&&&&,fbuf-&data+fbuf-&head,lent);
&&&&&&&&&&&&fbuf-&head+=
&&&&&&&&fbuf-&size-=
&&&&Unlock(cs);
&&&&return&
MYVOID&thdB(void&*pcn)&{
&&&&char&&&&&&&&*recv_
&&&&int&&&&&&&&&&recv_
&&&&int&&&&&&&&&&
&&&&int&&&&&&&&&&
&&&&int&&&&&&&&&&
&&&&cn=(int)
&&&&Log(&%03d&thdB&&&&&&&&&&&&&&thread&begin...\n&,cn);
&&&&while&(1)&{
&&&&&&&&sleep_ms(10);
&&&&&&&&recv_buf=(char&*)C
&&&&&&&&recv_nbytes=CSIZE;
&&&&&&&&wc=0;
&&&&&&&&while&(1)&{
&&&&&&&&&&&&pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);
&&&&&&&&&&&&if&(pb)&{
&&&&&&&&&&&&&&&&Log(&%03d&recv&%d&bytes\n&,cn,pb);
&&&&&&&&&&&&&&&&HexDump(cn,recv_buf,pb);
&&&&&&&&&&&&&&&&sleep_ms(1);
&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&sleep_ms(1000);
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(No_Loop)&//
&&&&&&&&&&&&wc++;
&&&&&&&&&&&&if&(wc&3600)&Log(&%03d&%d==wc&3600!\n&,cn,wc);
&&&&&&&&if&(No_Loop)&//
#ifndef&WIN32
&&&&pthread_exit(NULL);
int&PutToRBuf(int&cn,CRITICAL_SECTION&*cs,FIFO_BUFFER&*fbuf,char&*buf,int&len)&{
&&&&int&lent,len1,len2;
&&&&Lock(cs);
&&&&if&(fbuf-&size+lent&BSIZE)&{
&&&&&&&&lent=BSIZE-fbuf-&
&&&&if&(fbuf-&tail+lent&BSIZE)&{
&&&&&&&&len1=BSIZE-fbuf-&
&&&&&&&&memcpy(fbuf-&data+fbuf-&tail,buf&&&&&,len1);
&&&&&&&&len2=lent-len1;
&&&&&&&&memcpy(fbuf-&data&&&&&&&&&&&,buf+len1,len2);
&&&&&&&&fbuf-&tail=len2;
&&&&}&else&{
&&&&&&&&memcpy(fbuf-&data+fbuf-&tail,buf&&&&&,lent);
&&&&&&&&fbuf-&tail+=
&&&&fbuf-&size+=
&&&&Unlock(cs);
&&&&return&
MYVOID&thdA(void&*pcn)&{
&&&&char&&&&&&&&*send_
&&&&int&&&&&&&&&&send_
&&&&int&&&&&&&&&&
&&&&int&&&&&&&&&&
&&&&int&&&&&&&&&&&a;
&&&&int&&&&&&&&&&
&&&&cn=(int)
&&&&Log(&%03d&thdA&&&&&&&&&&&&&&thread&begin...\n&,cn);
&&&&while&(1)&{
&&&&&&&&sleep_ms(100);
&&&&&&&&memset(Abuf,a,ASIZE);
&&&&&&&&a=(a+1)%256;
&&&&&&&&if&(16==a)&{No_Loop=1;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop
&&&&&&&&send_buf=(char&*)A
&&&&&&&&send_nbytes=ASIZE;
&&&&&&&&Log(&%03d&sending&%d&bytes\n&,cn,send_nbytes);
&&&&&&&&HexDump(cn,send_buf,send_nbytes);
&&&&&&&&wc=0;
&&&&&&&&while&(1)&{
&&&&&&&&&&&&pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);
&&&&&&&&&&&&Log(&%03d&sent&%d&bytes\n&,cn,pa);
&&&&&&&&&&&&HexDump(cn,send_buf,pa);
&&&&&&&&&&&&send_buf+=
&&&&&&&&&&&&send_nbytes-=
&&&&&&&&&&&&if&(send_nbytes&=0)&//
&&&&&&&&&&&&sleep_ms(1000);
&&&&&&&&&&&&if&(No_Loop)&//
&&&&&&&&&&&&wc++;
&&&&&&&&&&&&if&(wc&3600)&Log(&%03d&%d==wc&3600!\n&,cn,wc);
&&&&&&&&if&(No_Loop)&//
#ifndef&WIN32
&&&&pthread_exit(NULL);
int&main()&{
#ifdef&WIN32
&&&&InitializeCriticalSection(&cs_log);
&&&&InitializeCriticalSection(&cs_HEX&);
&&&&InitializeCriticalSection(&cs_BBB&);
&&&&pthread_t&threads[2];
&&&&int&threadsN;
&&&&pthread_mutex_init(&cs_log,NULL);
&&&&pthread_mutex_init(&cs_HEX,NULL);
&&&&pthread_mutex_init(&cs_BBB,NULL);
&&&&Log(&Start===========================================================\n&);
&&&&BBB.head=0;
&&&&BBB.tail=0;
&&&&BBB.size=0;
#ifdef&WIN32
&&&&_beginthread((void(__cdecl&*)(void&*))thdA,0,(void&*)1);
&&&&_beginthread((void(__cdecl&*)(void&*))thdB,0,(void&*)2);
&&&&threadsN=0;
&&&&rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void&*)1);if&(rc)&Log(&%d=pthread_create&%d&error!\n&,rc,threadsN-1);
&&&&rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void&*)2);if&(rc)&Log(&%d=pthread_create&%d&error!\n&,rc,threadsN-1);
&&&&if&(!access(&No_Loop&,0))&{
&&&&&&&&remove(&No_Loop&);
&&&&&&&&if&(!access(&No_Loop&,0))&{
&&&&&&&&&&&&No_Loop=1;
&&&&while&(1)&{
&&&&&&&&sleep_ms(1000);
&&&&&&&&if&(No_Loop)&//
&&&&&&&&if&(!access(&No_Loop&,0))&{
&&&&&&&&&&&&No_Loop=1;
&&&&sleep_ms(3000);
&&&&Log(&End=============================================================\n&);
#ifdef&WIN32
&&&&DeleteCriticalSection(&cs_BBB&);
&&&&DeleteCriticalSection(&cs_HEX&);
&&&&DeleteCriticalSection(&cs_log);
&&&&pthread_mutex_destroy(&cs_BBB);
&&&&pthread_mutex_destroy(&cs_HEX);
&&&&pthread_mutex_destroy(&cs_log);
&&&&return&0;
赵老湿的代码随手拈来啊
Send&As&Hex&意思是你在编辑框中输入的是16进制的数据串.
也就是说,你输入:&&12&13&14&15&时,&实际发送的就是&&char&buf[4]={0x12,0x13,0x14,0x15};&&&即内存数据,&不是ASCII码.
Recv&As&Hex意思是接收后以16进制显示在界面上.
你以到char&buf[4]={0x12,0x13,0x14,0x15};&后就是显示为&12&13&14&15&,&是内存数据16进制表示.
如果你示选择Send&As&Hex,&那么输入:&12&13&14&15&&实际上发送的数据就是:&char&buf[]={'1','2','&','1','3','&','1','4','&','1','5'},&也就是ASCII码.
综上,&&As&Hex意思是你发送,&接收的数据以什么形式表现出来.&字符串,&还是&内存数据.
Send&As&Hex&意思是你在编辑框中输入的是16进制的数据串.
也就是说,你输入:&&12&13&14&15&时,&实际发送的就是&&char&buf[4]={0x12,0x13,0x14,0x15};&&&即内存数据,&不是ASCII码.
Recv&As&Hex意思是接收后以16进制显示在界面上.
你以到char&buf[4]={0x12,0x13,0x14,0x15};&后就是显示为&12&13&14&15&,&是内存数据16进制表示.
如果你示选择Send&As&Hex,&那么输入:&12&13&14&15&&实际上发送的数据就是:&char&buf[]={'1','2','&','1','3','&','1','4','&','1','5'},&也就是ASCII码.
综上,&&As&Hex意思是你发送,&接收的数据以什么形式表现出来.&字符串,&还是&内存数据.
恩恩这个我知道的,我现在想要实现的就是数据发送都是以ASCII码发出来,然后我收到的时候放入内存中也是ASCII码的形式,并且最后以ASCII码的形式显示在对话框的编辑框内,我现在的问题是发的时候是以Send&As&Hex的时候,我在程序里单步的时候看收到的还是字符串的形式,例如,我发30,buf收到的还是0,而且显示在编辑框的时候还是0,应该在程序中怎样修改才能使收到的是ASCII码,然后显示在编辑框上面也是ASCII码呢?多谢了,实在对这个力不从心
最近我也在写Socket程序,学习一下。
Send&As&Hex&意思是你在编辑框中输入的是16进制的数据串.
也就是说,你输入:&&12&13&14&15&时,&实际发送的就是&&char&buf[4]={0x12,0x13,0x14,0x15};&&&即内存数据,&不是ASCII码.
Recv&As&Hex意思是接收后以16进制显示在界面上.
你以到char&buf[4]={0x12,0x13,0x14,0x15};&后就是显示为&12&13&14&15&,&是内存数据16进制表示.
如果你示选择Send&As&Hex,&那么输入:&12&13&14&15&&实际上发送的数据就是:&char&buf[]={'1','2','&','1','3','&','1','4','&','1','5'},&也就是ASCII码.
综上,&&As&Hex意思是你发送,&接收的数据以什么形式表现出来.&字符串,&还是&内存数据.
我的意思也就是我应该怎样修改程序才能得到下面的结果,就是我以16进制发出去的数,在编辑框中同样的显示出来,现在的问题是我以16进制发的时候,显示的是这样的字符串,而不是68&74&74&70&3A&2F&2F&65&6E&2E&75&73&72&2E&63&6E
Send&As&Hex&意思是你在编辑框中输入的是16进制的数据串.
也就是说,你输入:&&12&13&14&15&时,&实际发送的就是&&char&buf[4]={0x12,0x13,0x14,0x15};&&&即内存数据,&不是ASCII码.
Recv&As&Hex意思是接收后以16进制显示在界面上.
你以到char&buf[4]={0x12,0x13,0x14,0x15};&后就是显示为&12&13&14&15&,&是内存数据16进制表示.
如果你示选择Send&As&Hex,&那么输入:&12&13&14&15&&实际上发送的数据就是:&char&buf[]={'1','2','&','1','3','&','1','4','&','1','5'},&也就是ASCII码.
综上,&&As&Hex意思是你发送,&接收的数据以什么形式表现出来.&字符串,&还是&内存数据.
额是不是问的太简单啦,自己确实比较菜还望大神见谅
不知道有多少前人掉在TCP&Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!

我要回帖

更多关于 花瓶大神很菜鸟txt 的文章

 

随机推荐