linux 下用socket 文件传输问题(UDP)
要下班了,时间急,不写代码了先给你一个思路 1 实现最简单的udp socket 模型,实现发送一个字符串。2 实现一个侍运橡简单的打开文件,读取文件的例子,如用fgets(),类似的函数有很多,然后再把读取的文件内容忘另一个文件里写(相关函数fopen(),write(),read())。3 把上面两个函数结合到一起,在客户端实现打开要传送的文件,按一定的大小读取,读取后调用sendto()发送到服务器端。在服务器端创建一个文件,然后调用recvfrom()接受客户端发送过来的数据,向来是创建的那个文件中写。下面是改好的udp发送文件的例子。 服务器端程序的编译gcc -o file_server file_server客户端程序的编译gcc -o file_client file_client.c服务器程序和客户端程应当分别运行在2台计算机上.服务器端程序的运行,在一个计算机的终端执行./file_server客户端程序的运行,在另一个计算机的终端中执行./file_client 运行服务器程序的计算机的IP地址根据提示输入要传输的服务器上的文件,该文件在服务器的运行目录上在实际编程和测试中,可以用2个终端代替2个计算机,这样就可以在一台计算机上测试网络程序,服务器端程序的运行,在一个终端执行./file_server客户端程序的运行,在另一个终端中执行./file_client 127.0.0.1说明: 任何计算机都可以通过127.0.0.1访问自己. 也可以用计算机的实际IP地址代替127.0.0.1//////////////////////////////////////////////////////////////////////////////////////// file_server.c 文件传输顺序服务器示例////////////////////////////////////////////////////////////////////////////////////////本文件是服务器的代码#include // for sockaddr_in#include // for socket#include // for socket#include // for printf#include // for exit#include // for bzero/*#include #include #include #include */#define HELLO_WORLD_SERVER_PORT 6666#define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512 int main(int argc, char **argv){//设置一个socket地址老旁结构server_addr,代表服务器internet地址, 端口struct sockaddr_in server_addr, pcliaddr;bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); //创建用于internet的据报套接字(UDPt,用server_socket代表服务器socket // 创建数据报套接悄碧字(UDP)int server_socket = socket(PF_INET,SOCK_DGRAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);} //把socket和socket地址结构联系起来if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))){printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);exit(1);} while (1) //服务器端要一直运行{//定义客户端的socket地址结构client_addrstruct sockaddr_in client_addr;socklen_t n = sizeof(client_addr) ;int length; char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);length = recvfrom(new_server_socket,buffer,BUFFER_SIZE,0,&pcliaddr,&n);if (length < 0){printf("Server Recieve Data Failed!n");break;}char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));// int fp = open(file_name, O_RDONLY);// if( fp < 0 )FILE * fp = fopen(file_name,"r");if(NULL == fp ){printf("File:t%s Not Foundn", file_name);}else{bzero(buffer, BUFFER_SIZE);int file_block_length = 0;// while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0){printf("file_block_length = %dn",file_block_length);//发送buffer中的字符串到new_server_socket,实际是给客户端if(send(new_server_socket,buffer,file_block_length,0)<0){printf("Send File:t%s Failedn", file_name);break;}bzero(buffer, BUFFER_SIZE);}// close(fp);fclose(fp);printf("File:t%s Transfer Finishedn",file_name);}}} //////////////////////////////////////////////////////////////////////////////////////// file_client.c 文件传输客户端程序示例////////////////////////////////////////////////////////////////////////////////////////本文件是客户机的代码#include // for sockaddr_in#include // for socket#include // for socket#include // for printf#include // for exit#include // for bzero/*#include #include #include #include */ #define HELLO_WORLD_SERVER_PORT 6666#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512 int main(int argc, char **argv){if (argc != 2){printf("Usage: ./%s ServerIPAddressn",argv[0]);exit(1);} //设置一个socket地址结构client_addr,代表客户机internet地址, 端口struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0client_addr.sin_family = AF_INET; //internet协议族client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址client_addr.sin_port = htons(0); //0表示让系统自动分配一个空闲端口//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socketint client_socket = socket(AF_INET,SOCK_DGRAM,0);if( client_socket < 0){printf("Create Socket Failed!n");exit(1);} //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数{printf("Server IP Address Error!n");exit(1);}server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr); char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);printf("Please Input File Name On Server:t");scanf("%s", file_name); char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));//向服务器发送buffer中的数据socklen_t n = sizeof(server_addr) ;sendto(client_socket,buffer,BUFFER_SIZE,0,(struct sockaddr*)&server_addr,n); // int fp = open(file_name, O_WRONLY|O_CREAT);// if( fp < 0 )FILE * fp = fopen(file_name,"w");if(NULL == fp ){printf("File:t%s Can Not Open To Writen", file_name);exit(1);} //从服务器接收数据到buffer中bzero(buffer,BUFFER_SIZE);int length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0)){if(length < 0){printf("Recieve Data From Server %s Failed!n", argv[1]);break;}// int write_length = write(fp, buffer,length);int write_length = fwrite(buffer,sizeof(char),length,fp);if (write_length服务器端程序的编译 gcc -o file_serverfile_server客户端程序的编译gcc -o file_clientfile_client.c服务器程序和客户端程应当分别运行在2台计算机上.服务器端程序的运行,在一个计算机的终端执行./file_server客户端程序的运行,在另一个计算机的终端中执行./file_client运行服务器程序的计算机的IP地址根据提示输入要传输的服务器上的文件,该文件在服务器的运行目录上在实际编程和测试中,可以用2个终端代替2个计算机,这样就可以在一台计算机上测试网络程序,服务器端程序的运行,在一个终端执行./file_server客户端程序的运行,在另一个终端中执行./file_client127.0.0.1说明: 任何计算机都可以通过127.0.0.1访问自己. 也可以用计算机的实姿派际IP地址代替127.0.0.1//////////////////////////////////////////////族野////////////////////////////////////////// file_server.c文件传输顺序服务器示例////////////////////////////////////////////////////////////////////////////////////////本文件是服务器的代码#include // for sockaddr_in#include // for socket#include // for socket#include // for printf#include // for exit#include // for bzero/*#include #include #include #include */#define HELLO_WORLD_SERVER_PORT6666#define LENGTH_OF_LISTEN_QUEUE20#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512 int main(int argc, char **argv){//设置一个socket地址结构server_addr,代表服务器internet地址, 端口struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); //创建用于internet的流协议(TCP)socket,用server_socket代表服务器socketint server_socket = socket(PF_INET,SOCK_STREAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);} //把socket和socket地址结构联系起来if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))){printf("迹穗贺Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);exit(1);} //server_socket用于监听if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ){printf("Server Listen Failed!");exit(1);}while (1) //服务器端要一直运行{//定义客户端的socket地址结构client_addrstruct sockaddr_in client_addr;socklen_t length = sizeof(client_addr); //接受一个到server_socket代表的socket的一个连接//如果没有连接请求,就等待到有连接请求--这是accept函数的特性//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信//new_server_socket代表了服务器和客户端之间的一个通信通道//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);if ( new_server_socket < 0){printf("Server Accept Failed!n");break;} char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);length = recv(new_server_socket,buffer,BUFFER_SIZE,0);if (length < 0){printf("Server Recieve Data Failed!n");break;}char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));//int fp = open(file_name, O_RDONLY);//if( fp < 0 )FILE * fp = fopen(file_name,"r");if(NULL == fp ){printf("File:t%s Not Foundn", file_name);}else{bzero(buffer, BUFFER_SIZE);int file_block_length = 0;//while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0){printf("file_block_length = %dn",file_block_length);//发送buffer中的字符串到new_server_socket,实际是给客户端if(send(new_server_socket,buffer,file_block_length,0)<0){printf("Send File:t%s Failedn", file_name);break;}bzero(buffer, BUFFER_SIZE);}//close(fp);fclose(fp);printf("File:t%s Transfer Finishedn",file_name);}//关闭与客户端的连接close(new_server_socket);}//关闭监听用的socketclose(server_socket);return 0;} //////////////////////////////////////////////////////////////////////////////////////// file_client.c文件传输客户端程序示例////////////////////////////////////////////////////////////////////////////////////////本文件是客户机的代码#include // for sockaddr_in#include // for socket#include // for socket#include // for printf#include // for exit#include // for bzero/*#include #include #include #include */ #define HELLO_WORLD_SERVER_PORT6666#define BUFFER_SIZE 1024#define FILE_NAME_MAX_SIZE 512 int main(int argc, char **argv){if (argc != 2){printf("Usage: ./%s ServerIPAddressn",argv[0]);exit(1);} //设置一个socket地址结构client_addr,代表客户机internet地址, 端口struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0client_addr.sin_family = AF_INET;//internet协议族client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址client_addr.sin_port = htons(0);//0表示让系统自动分配一个空闲端口//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socketint client_socket = socket(AF_INET,SOCK_STREAM,0);if( client_socket < 0){printf("Create Socket Failed!n");exit(1);}//把客户机的socket和客户机的socket地址结构联系起来if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))){printf("Client Bind Port Failed!n");exit(1);} //设置一个socket地址结构server_addr,代表服务器的internet地址, 端口struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数{printf("Server IP Address Error!n");exit(1);}server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr);//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0){printf("Can Not Connect To %s!n",argv[1]);exit(1);} char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);printf("Please Input File Name On Server:t");scanf("%s", file_name); char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));//向服务器发送buffer中的数据send(client_socket,buffer,BUFFER_SIZE,0); //int fp = open(file_name, O_WRONLY|O_CREAT);//if( fp < 0 )FILE * fp = fopen(file_name,"w");if(NULL == fp ){printf("File:t%s Can Not Open To Writen", file_name);exit(1);} //从服务器接收数据到buffer中bzero(buffer,BUFFER_SIZE);int length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0)){if(length < 0){printf("Recieve Data From Server %s Failed!n", argv[1]);break;}//int write_length = write(fp, buffer,length);int write_length = fwrite(buffer,sizeof(char),length,fp);if (write_length你传输文本的时候用的什么函数阿?send/recv?还是sendto/recvfrom?或者直接read/write? 文纳前件不是一样的?只不过需要自己拟定一如芦个协议,比如先发送文件大小,然后把文件打开了往里放不就好了,没有难度洞橡清吧

基于mfc的socket编程怎么进行文件传输
1.采用了多线程的方法,文件传输时使用AfxBeginThread()开启新线程 void CClientsockDlg::OnBnClickedSend(){pThreadSend = AfxBeginThread(Thread_Send,this);/}文件的发送和接收都开起了新线程UINTThread_Send(LPVOID lpParam){代码略…}2.支持从配置文件configuration.ini中获取服务器参数采用GetPrivateProfileString()和GetPrivateProfileInt()分别获取位于ServerConfiguration.ini文件中的String类型的IP和int类型的portCString IP;int port;GetPrivateProfileString(L"ServerConfiguration",L"IP",L"没有读取到数据!",IP.GetBuffer(10),10,L".\configuration.ini");port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\configuration.ini");3.采用了面向对象的设计方式,功能之间按模块划分MFC本身具有良好的面向对象的特性,本程序严格按照MFC框架结构编写代码,每个按钮对应一个功能函数,降低了代码之间的耦合性,有利于程序的扩展和复用。void CServersockDlg::OnBnClickedChoose()void CServersockDlg::OnBnClickedSend()void CServersockDlg::OnBnClickedRecvdata()void CServersockDlg::OnBnClickedAbout()void CServersockDlg::OnBnClickedWriteini()4.采用了CSocket类,代码相对更简单CSocket类是MFC框架对socket编程中的winsockAPI的封装,因此通过这个类管理收发数据更加便利。代码也跟那个既简单易懂。//创建if(!Clientsock.Socket()){CString str;str.Format(_T("Socket创建失败:%d"),GetLastError());AfxMessageBox(str);}//连接if(!Clientsock.Connect(IP,port)){CString str;str.Format(_T("Socket连接失败:%d"),GetLastError());AfxMessageBox(str);}else{AfxMessageBox(_T("Socket连接成功"));代码略…//发送while(nSizeGetDlgItem(IDC_SEND))->EnableWindow(TRUE);AfxMessageBox(_T("文件发送成功"));dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));}return 0;5.支持数据在服务器与客户端之间双向传输本程序不但可以从客户端往服务器端传文件,而且可以从服务器端往客户端传文件。但是互传文件的方式并不是完全相同的。服务器端不管是接收文件还是发送文件始终是对绑定的端口进行监听。//绑定if(!Serversock.Bind(port)){CString str;str.Format(_T("Socket绑定失败: %d"),GetLastError());AfxMessageBox(str);}//监听if(!Serversock.Listen(10)){CString str;str.Format(_T("Socket监听失败:%d"),GetLastError());AfxMessageBox(str);}客户端不管是接收文件还是发送文件始终是进行连接。if(!Clientsock.Connect(IP,port)){CString str;str.Format(_T("Socket连接失ì败:%d"),GetLastError());AfxMessageBox(str);}else{略…6.完全图形化操作界面二.软件使用说明客户端主界面如图所示:单击“选择文件”弹出文件对话框,选择一个要发送的文件,同时保存文件的路径。单击“发送”则会读取ServerConfiguration.ini文件中的配置信息(IP和port),并根据此信息建立Socket连接,发送文件。注意:服务器端应该先单击了“接受客户端数据”,否则发送失败。单击“接收”也会读取ServerConfiguration.ini文件中的配置信息(IP和port),并根据此信息建立Socket连接,接收文件。注意:服务器端应该先选择了向客户端发送的文件,并单击了“发送”,否则接受失败。单击“读取配置文件”,会从ServerConfiguration.ini文件中读取配置信息,并以可编辑的文本形式显示出来,修改完后,单击“写入配置文件”,会将修改后的信息保存到配置文件中。单击“关于”可以了解到软件相关信息。代码注释里有更详细的说明服务器端主界面如图所示u 单击“接受客户端数据”,开始监听客户端的链接。u单击“选择文件”弹出文件对话框,选择一个要发送的文件,同时保存文件的路径。u单击“发送”则会读取ServerConfiguration.ini文件中的配置信息(port),并监听对应端口,准备发送文件。注意:客户端选择“接收”以后才能发送成功。u单击“读取配置文件”,会从ServerConfiguration.ini文件中读取配置信息,并以可编辑的文本形式显示出来,修改完后,单击“写入配置文件”,会将修改后的信息保存到配置文件中。但是服务器的IP是不可以修改的,它是在程序开始运行时从服务器所在机器的网卡上获取的。u单击“关于”可以了解到软件相关信息。u代码注释里有更详细的说明代码下载地址:http://download.csdn.net/detail/leixiaohua1020/6320417在此附上客户端使用CSocket发起连接的代码[cpp] view plain copy//----------------------------发送文件的线程------------------------------UINT Thread_Send(LPVOID lpParam){CClientsockDlg *dlg=(CClientsockDlg *)lpParam;(dlg->GetDlgItem(IDC_SEND))->EnableWindow(FALSE);CSocket Clientsock; //definition socket.if(!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);}CString IP;int port;GetPrivateProfileString(L"ServerConfiguration",L"IP",L"没有读取到数据!",IP.GetBuffer(100),100,L".\configuration.ini");port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\configuration.ini");//创建if(!Clientsock.Socket()){CString str;str.Format(_T("Socket创建失败: %d"),GetLastError());AfxMessageBox(str);}//连接//if(!Clientsock.Connect(_T("127.0.0.1"),8088))if(!Clientsock.Connect(IP,port)){CString str;str.Format(_T("Socket连接失败: %d"),GetLastError());AfxMessageBox(str);}else{AfxMessageBox(_T("Socket连接成功"));WIN32_FIND_DATA FindFileData;CString strPathName; //定义用来保存发送文件路径的CString对象dlg->GetDlgItemTextW(IDC_FILEPATHNAME,strPathName);FindClose(FindFirstFile(strPathName,&FindFileData));Clientsock.Send(&FindFileData,sizeof(WIN32_FIND_DATA));CFile file;if(!file.Open(strPathName,CFile::modeRead|CFile::typeBinary)){AfxMessageBox(_T("文件不存在"));return 1;}UINT nSize = 0;UINT nSend = 0;char *szBuff=NULL;//发送while(nSizeGetDlgItem(IDC_SEND))->EnableWindow(TRUE);AfxMessageBox(_T("文件发送成功"));dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));}return 0;}以及服务器端使用CSocket监听的代码:[cpp] view plain copy//----------------------------监听文件的线程------------------------------UINT Thread_Func(LPVOID lpParam)//接收文件的线程函数{CServersockDlg *dlg = (CServersockDlg *)lpParam; //获取对话框指针(dlg->GetDlgItem(IDC_RECVDATA))->EnableWindow(FALSE);if(!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);}CString IP;int port;GetPrivateProfileString(L"ServerConfiguration",L"IP",L"没有读取到数据!",IP.GetBuffer(100),100,L".\configuration.ini");port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\configuration.ini");char errBuf[100]={0};// 临时缓存SYSTEMTIME t; //系统时间结构CFile logErrorfile;if(!logErrorfile.Open(_T("logErrorfile.txt"),CFile::modeCreate|CFile::modeReadWrite)){return 1;}CSocket Serversock;CSocket Clientsock;//创建if(!Serversock.Socket()){CString str;str.Format(_T("Socket创建失败: %d"),GetLastError());AfxMessageBox(str);}BOOL bOptVal = TRUE;int bOptLen = sizeof(BOOL);Serversock.SetSockOpt(SO_REUSEADDR,(void *)&bOptVal,bOptLen,SOL_SOCKET);//绑定if(!Serversock.Bind(port)){CString str;str.Format(_T("Socket绑定失败: %d"),GetLastError());AfxMessageBox(str);}//监听if(!Serversock.Listen(10)){CString str;str.Format(_T("Socket监听失败: %d"),GetLastError());AfxMessageBox(str);}GetLocalTime(&t);sprintf_s(errBuf,"服务器已经启动...正在等待接收文件...rn时间:%d年%d月%d日 %2d:%2d:%2d rn",t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond);int len = strlen(errBuf);logErrorfile.Write(errBuf,len);AfxMessageBox(_T("启动成功等待接收文件"));while(1){//AfxMessageBox(_T("服务器启动成功..."));if(!Serversock.Accept(Clientsock)) //等待接收{continue;}else{WIN32_FIND_DATA FileInfo;Clientsock.Receive(&FileInfo,sizeof(WIN32_FIND_DATA));CFile file;file.Open(FileInfo.cFileName,CFile::modeCreate|CFile::modeWrite);//AfxMessageBox(FileInfo.cFileName);int length = sizeof(FileInfo.cFileName);logErrorfile.Write(FileInfo.cFileName,length);//Receive文件的数据UINT nSize = 0;UINT nData = 0;char *szBuff=NULL;while(nSizeGetDlgItem(IDC_RECVDATA))->EnableWindow(TRUE);sprintf_s(errBuf,"文件接收成功...rn时间:%d年%d月%d日 %2d:%2d:%2d rn",t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond);int len = strlen(errBuf);logErrorfile.Write(errBuf,len);//AfxMessageBox(_T("文件接收成功..."));break;}}return 0; }
首先创建一个MFC项目,修改名称以及存放路径。 项目配置,在向导过程中选择“基于对话框”模式,并选择“windows”套接字。设计服务器界面,控件有:4个静态文本(Static Text),最后一个用于指示用户连接个数;一个按钮(Button),用于打开或关闭服务器;2个编辑框(Edit Control),一个用于输入端口号,另一个只读的用于显示事件日志。修改各个控件的属性,注意编辑框2还要把Multiline和Vertical Scroll属性选为true,以实现多行显示并自带滚动条。1、 给控件添加变量和事件处理函数,这个通过类向导就可以完成,变量如上表所示,事件只有“按钮按下”一个,双击按钮自动生成函数,后面添加相关代码即可。2、 在类视图中添加一个新类CServerSocket,派生于CSocket类,对该类进行类向导添加三个函数: OnAccept()、OnClose()、OnReceive()
