一个TCP通信程序要能够同时传送消息和传送文件需要创建两个不同的套接字吗

wuxia2118 2018-04-06 12:18:53
一个TCP通信程序要同时能够传送消息和传送文件需要创建两个不同的套接字吗,我觉得如果不创建两个套接字,那客户端接收时怎么知道这是传送的文件还是传送的消息呢。至少需要绑定2个不同的端口,分别用来传送文件和消息吧,我这样理解对吗。

是不是创建多线程也可以呢

哪位大神能给个这样的示例程序吗,最好是Win32 SDK版的
...全文
985 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-09
  • 打赏
  • 举报
回复
《Http权威指南》
赵4老师 2018-04-08
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
wuxia2118 2018-04-08
  • 打赏
  • 举报
回复
6楼的,你跟新手说这些,只会让人一头雾水
worldy 2018-04-07
  • 打赏
  • 举报
回复
两个套接字不需要,但也是一种可行的方案,但是感觉比较stupid 除非你是很简单的传输,否则,一般TCP/IP的使用,你需要定义一组应用层的协议来规范通信双方,既然需要应用层的协议,文件或信息是很容易区分的
wuxia2118 2018-04-07
  • 打赏
  • 举报
回复
不好意思,4楼客户端的代码发错了,正确的如下:
#include "stdafx.h"
#include "resource.h"
#include <CommDlg.h> 

#include <WINSOCK2.H>   //服务端
#include <stdio.h>
#include <iostream.h>
#pragma comment(lib,"ws2_32.lib")    //API链接库文件
#define SIZE 1024*8   //缓冲区大小 
#define MAX_LOADSTRING 100
static OPENFILENAME ofn ; 

// Global Variables:
HINSTANCE hInst;								// current instance
TCHAR szTitle[MAX_LOADSTRING];								// The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];								// The title bar text

// Foward declarations of functions included in this code module:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

void PopFileInitialize (HWND hDlg)  
{
	static TCHAR szFilter[] = TEXT ("文本文件(*.txt)\0*.txt; \0所有文件\0*.*");
	
	ofn.lStructSize       = sizeof (OPENFILENAME) ;  
	ofn.hwndOwner         = hDlg ;  
	ofn.hInstance         = NULL ;  
	ofn.lpstrFilter       = szFilter ;  
	ofn.lpstrCustomFilter = NULL ;  
	ofn.nMaxCustFilter    = 0 ;  
	ofn.nFilterIndex      = 0 ;  
	ofn.lpstrFile         = NULL ;          // Set in Open and Close functions  
	ofn.nMaxFile          = MAX_PATH ;  
	ofn.lpstrFileTitle    = NULL ;          // Set in Open and Close functions  
	ofn.nMaxFileTitle     = MAX_PATH ;  
	ofn.lpstrInitialDir   = NULL ;  
	ofn.lpstrTitle        = NULL ;  
	ofn.Flags             = 0 ;             // Set in Open and Close functions  
	ofn.nFileOffset       = 0 ;  
	ofn.nFileExtension    = 0 ;  
	ofn.lpstrDefExt       = TEXT ("sdkmesh") ;  
	ofn.lCustData         = 0L ;  
	ofn.lpfnHook          = NULL ;  
	ofn.lpTemplateName    = NULL ;  
	
}
BOOL PopFileOpenDlg (HWND hDlg, PTSTR pstrFileName, PTSTR pstrTitleName)  
{
	ofn.hwndOwner         = hDlg;  
	ofn.lpstrFile         = pstrFileName ;  
	ofn.lpstrFileTitle    = pstrTitleName ;  
	ofn.Flags             = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;  
	
	return GetOpenFileName (&ofn) ;
	
}

SOCKET clientSocket;
SOCKADDR_IN clientsock_in;
char receiveBuf[100]={"0"};
char ip_addr[16]={"127.0.0.1"};       //IP
int len=sizeof(SOCKADDR);
SOCKET serConn;
char sendBuf[50];   //缓冲区预大小
FILE *fp;
int err;
int length=0;

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
WSADATA wsaData;	
	int iErrorcode;
	iErrorcode=WSAStartup(MAKEWORD(2,2), &wsaData);
	if(iErrorcode)
	{
		cout <<"Winsock can not be init!" ;
		WSACleanup();
		return -1;
	}	

	DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, NULL, (DLGPROC)About);
	
	return 0;
}

// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	static TCHAR     szFileName[MAX_PATH], szTitleName[MAX_PATH] ;  
	char path[100]={"0"};
	switch (message)
	{
	case WM_INITDIALOG:
		clientSocket=socket(AF_INET,SOCK_STREAM,0);  //创建了可识别套接字,流式套接字,tcp/ip协议
		return TRUE;
		
	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK) 
		{
			EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
		}
		
		if (LOWORD(wParam) == IDC_CREATE) 
		{
			//连接服务器
				clientsock_in.sin_family=AF_INET;      //地址描述
			clientsock_in.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//ip地址等于
		
			clientsock_in.sin_port=htons(5566);
			connect(clientSocket,(SOCKADDR*)&clientsock_in,len);//开始连接
		//	recv(clientSocket,receiveBuf,101,0);   //接受成功返回信息,存放到接受buffer
			
			return TRUE;
		}
		
		if (LOWORD(wParam) == IDC_SEND) 
		{
			PopFileInitialize (hDlg);  //初始化ofn  
			PopFileOpenDlg(hDlg, szFileName, szTitleName);//打开文件对话框  
			//i=0;
			fp=fopen(szFileName,"rb");
			
			fseek(fp,0L,SEEK_END);
			length=ftell(fp);
//			printf("待传送文件大小: %d\n",length);
//			printf("文件已经打开 等待主机消息......\n");
			//得到主机开始传送消息
			recv(clientSocket,receiveBuf,101,0);
			//	printf("%s\n",receiveBuf);
			if(strcmp(receiveBuf,"开始传送")==0)
			{
				//传送文件长度
				char sendBuf[20];
				ltoa(length,sendBuf,10);
				send(clientSocket,sendBuf,21,0);
				fseek(fp,0L,SEEK_SET);
				//传送文件
				long int y=0;
				double cent;
				char trans[SIZE];
				while(!feof(fp))
				{
					
					fread(trans,1,SIZE,fp);
					y=y+SIZE;
					if(y<length)
					{
						cent=(double)y*100.0/(double)length;
						printf("已发送: %4.2f%\n",cent);
						send(clientSocket,trans,SIZE+1,0);
					}
					else
						
						send(clientSocket,trans,length+SIZE-y+1,0);
					
				}
				break;
			}
			return FALSE;
		}
	}
	return 0;
}
wuxia2118 2018-04-07
  • 打赏
  • 举报
回复
转成win32 SDK的程序,编译通过,但运行会非正常关闭,代码如下:

#include "stdafx.h"
#include "resource.h"

#include <CommDlg.h> 

#include <WINSOCK2.H>   //服务端
#include <stdio.h>
#include <iostream.h>
#pragma comment(lib,"ws2_32.lib")    //API链接库文件
#define WM_SOCKET WM_USER+0x10    //自定义socket消息
#define SIZE 1024*8   //缓冲区大小 
#define MAX_LOADSTRING 100

static OPENFILENAME ofn ; 
// Global Variables:
HINSTANCE hInst;						
TCHAR szTitle[MAX_LOADSTRING];					
TCHAR szWindowClass[MAX_LOADSTRING];				

ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

void PopFileInitialize (HWND hDlg)		//弹出文件对话框
{
	static TCHAR szFilter[] = TEXT ("文本文件(*.txt)\0*.txt; \0所有文件\0*.*");
	
	ofn.lStructSize       = sizeof (OPENFILENAME) ;  
	ofn.hwndOwner         = hDlg ;  
	ofn.hInstance         = NULL ;  
	ofn.lpstrFilter       = szFilter ;  
	ofn.lpstrCustomFilter = NULL ;  
	ofn.nMaxCustFilter    = 0 ;  
	ofn.nFilterIndex      = 0 ;  
	ofn.lpstrFile         = NULL ;          // Set in Open and Close functions  
	ofn.nMaxFile          = MAX_PATH ;  
	ofn.lpstrFileTitle    = NULL ;          // Set in Open and Close functions  
	ofn.nMaxFileTitle     = MAX_PATH ;  
	ofn.lpstrInitialDir   = NULL ;  
	ofn.lpstrTitle        = NULL ;  
	ofn.Flags             = 0 ;             // Set in Open and Close functions  
	ofn.nFileOffset       = 0 ;  
	ofn.nFileExtension    = 0 ;  
	ofn.lpstrDefExt       = TEXT ("sdkmesh") ;  
	ofn.lCustData         = 0L ;  
	ofn.lpfnHook          = NULL ;  
	ofn.lpTemplateName    = NULL ;  
	
}
BOOL PopFileOpenDlg (HWND hDlg, PTSTR pstrFileName, PTSTR pstrTitleName)  
{
	ofn.hwndOwner         = hDlg;  
	ofn.lpstrFile         = pstrFileName ;  
	ofn.lpstrFileTitle    = pstrTitleName ;  
	ofn.Flags             = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;  
	
	return GetOpenFileName (&ofn) ;
	
}
SOCKET serSocket;//创建了可识别套接字,流式套接字,tcp/ip协议
SOCKET serConn;
SOCKADDR_IN addr;
SOCKADDR_IN clientsocket;
int len=sizeof(SOCKADDR);

char sendBuf[50];   //缓冲区预大小

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	WSADATA wsaData;	
	int iErrorcode;
	iErrorcode=WSAStartup(MAKEWORD(2,2), &wsaData);
	if(iErrorcode)
	{
		cout <<"Winsock can not be init!" ;
		WSACleanup();
		return -1;
	}	
	
	DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, NULL, (DLGPROC)About);
	
	return 0;
}

// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	static TCHAR     szFileName[MAX_PATH], szTitleName[MAX_PATH] ;  
	switch (message)
	{
	case WM_INITDIALOG:
		serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字,流式套接字,tcp/ip协议
		WSAAsyncSelect(serSocket, hDlg,WM_SOCKET,FD_ACCEPT |FD_READ | FD_WRITE| FD_CLOSE);	//设置异步方式
		return TRUE;
		
		
	case WM_SOCKET:   //自定义消息
		
		switch (WSAGETSELECTEVENT(lParam))
		{
		case FD_ACCEPT:   //接收请求事件
			{
				
				serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听
				
			}
			break;
		case FD_READ:    //可读事件
			{
				PopFileInitialize (hDlg);  //初始化ofn  
				PopFileOpenDlg(hDlg, szFileName, szTitleName);//打开文件对话框  
				
				
				sprintf(sendBuf,"Successfully,welcome %s to Leon",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里
				
				send(serConn,sendBuf,strlen(sendBuf)+1,0);
				
				FILE *fp;
				//	lable1: printf("客户端已打开\n请输入存放文件地址:\n");
				char path[100]={"0"};
				int i=0;
				//while(path[i]!='\0')
				//{
				//   if(path[i]=='/')
				//    path[i]='\\';
				//   i++;
				//}
				//gets(path);
				
				fp=fopen(szFileName,"rb");
				
				long t1=GetTickCount();//程序段开始前取得系统运行时间(ms)
				Sleep(500);  //休眠时间
				printf("文件已打开 开始文件传输......\n");
				//发送开始标志
				send(serConn,"开始传送",strlen("开始传送")+1,0); 
				//得到文件大小
				char datalength[20];
				long int length=0;
				recv(serConn,datalength,21,0);
				length=atol(datalength);
				printf("得到文件大小: %d\n",length);
				//开始传送
				double cent=0.0;
				char receiveBuf[SIZE];
				long int x=0;
				while (1)
				{
					x=x+SIZE;
					if(x<length)
					{
						cent=(double)x*100.0/(double)length;  //计算每段buffer占的百分比=8*1024/总文件大小
						printf("已接收: %4.2f%\n",cent);
						recv(serConn,receiveBuf,SIZE+1,0);
						fwrite(receiveBuf,1,SIZE,fp);
					}
					else
					{
						recv(serConn,receiveBuf,length+SIZE-x+1,0);
						printf("文件接收完毕\n");
						fwrite(receiveBuf,1,length+SIZE-x,fp);
						long t2=GetTickCount();//程序段结束后取得系统运行时间(ms)
						
						long v;
						v=length/(t2-t1);
						printf("运行时间:%ld\n",t2-t1);
						printf("传输速率:%ld\n",v);
						fclose(fp);
						break;
					}
				}
				
				
				return TRUE;
			}
			break;
			
		case FD_CLOSE:  //关闭连接事件
			{
				MessageBoxA(NULL, "正常关闭连接", "tip", 0);
			}
			break;
		default:
			break;
		}
		
        break;
				
		case WM_COMMAND:
			if (LOWORD(wParam) == IDOK) 
			{
				EndDialog(hDlg, LOWORD(wParam));
				closesocket(serSocket);
				WSACleanup();
				
				return TRUE;
			}
			if (LOWORD(wParam) == IDC_CREATE) //创建服务器按钮
			{
				EnableWindow(GetDlgItem(hDlg,IDC_CREATE),FALSE);
				addr.sin_family=AF_INET;
				addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//ip地址
				addr.sin_port=htons(5566);//绑定端口
				bind(serSocket,(SOCKADDR*)&addr,len);//Ip与Socket连接
				listen(serSocket,3);//套接字描述符,最多的连接数1-5,监听
				
				
				return TRUE;
			}
			
			
			break;
	}
    return FALSE;
}
客户端:
#include <WINSOCK2.H>  //客户端
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SIZE 1024*8
int main()
{
FILE *fp;
int length=0;

//初始化协议栈
WSADATA wsaData;
int err=WSAStartup(MAKEWORD(2,2),&wsaData);    //Socket初始化
if (err==0)
  printf("已打开套接字\n");
else
{
    //进一步绑定套接字
    printf("嵌套字未打开!");
    return;
}

SOCKET clientSocket;
SOCKADDR_IN clientsock_in;
char receiveBuf[100]={"0"};
char ip_addr[16]={"127.0.0.1"};       //IP
clientSocket=socket(AF_INET,SOCK_STREAM,0);  //创建了可识别套接字,流式套接字,tcp/ip协议
printf("请输入主机IP:\n");
scanf("%s",ip_addr);
//连接服务器
clientsock_in.sin_addr.S_un.S_addr=inet_addr(ip_addr);//ip地址等于
clientsock_in.sin_family=AF_INET;      //地址描述
clientsock_in.sin_port=htons(6000);
connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
recv(clientSocket,receiveBuf,101,0);   //接受成功返回信息,存放到接受buffer
printf("%s\n",receiveBuf);
char path[100]={"0"};
gets(path);
int i=0;
do
{
   printf("请输入文件地址:\n");
   gets(path);
   while(path[i]!='\0')
   {
    if(path[i]=='/')
     path[i]='\\';
    i++;
   }
   i=0;
   if((fp=fopen(path,"rb"))==NULL)
   {
    i=1;
    printf("文件未打开\n");
   }
}while(i);
fseek(fp,0L,SEEK_END);
    length=ftell(fp);
printf("待传送文件大小: %d\n",length);
printf("文件已经打开 等待主机消息......\n");
//得到主机开始传送消息
recv(clientSocket,receiveBuf,101,0);
printf("%s\n",receiveBuf);
if(strcmp(receiveBuf,"开始传送")==0)
{
   //传送文件长度
   char sendBuf[20];
   ltoa(length,sendBuf,10);
   send(clientSocket,sendBuf,21,0);
   fseek(fp,0L,SEEK_SET);
   //传送文件
   long int y=0;
   double cent;
   char trans[SIZE];
   while(!feof(fp))
   {

    fread(trans,1,SIZE,fp);
    y=y+SIZE;
    if(y<length)
    {
     cent=(double)y*100.0/(double)length;
     printf("已发送: %4.2f%\n",cent);
     send(clientSocket,trans,SIZE+1,0);
    }
    else
    {
     send(clientSocket,trans,length+SIZE-y+1,0);
     closesocket(clientSocket);
     WSACleanup();
    }
   }
   fclose(fp);
}
printf("文件发送完毕\n");
system("pause");
}
wuxia2118 2018-04-07
  • 打赏
  • 举报
回复
我有个TCP传送文件的控制台程序,我想把它转成win32 SDK的,不知道哪里写错了,控制台程序如下:
#include <WINSOCK2.H>   //服务端
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")    //API链接库文件
#define SIZE 1024*8   //缓冲区大小
void main()
{
//初始化协议栈
WSADATA wsaData;
int err=WSAStartup(MAKEWORD(2,2),&wsaData);    //Socket初始化

SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字,流式套接字,tcp/ip协议
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址
addr.sin_port=htons(6000);//绑定端口
bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//Ip与Socket连接
listen(serSocket,5);//套接字描述符,最多的连接数1-5,监听

SOCKADDR_IN clientsocket;
int len=sizeof(SOCKADDR);
SOCKET serConn;
char sendBuf[50];   //缓冲区预大小
serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听
sprintf(sendBuf,"Successfully,welcome %s to Leon",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里

send(serConn,sendBuf,strlen(sendBuf)+1,0);

FILE *fp;
lable1: printf("客户端已打开\n请输入存放文件地址:\n");
char path[100]={"0"};
int i=0;
while(path[i]!='\0')
{
   if(path[i]=='/')
    path[i]='\\';
   i++;
}
gets(path);
if((fp=fopen(path,"wb"))==NULL)
{
   printf("文件未打开\n");
   goto lable1;
}
else
{
  long t1=GetTickCount();//程序段开始前取得系统运行时间(ms)
  Sleep(500);  //休眠时间
 printf("文件已打开 开始文件传输......\n");
   //发送开始标志
   send(serConn,"开始传送",strlen("开始传送")+1,0); 
   //得到文件大小
   char datalength[20];
   long int length=0;
   recv(serConn,datalength,21,0);
   length=atol(datalength);
   printf("得到文件大小: %d\n",length);
   //开始传送
   double cent=0.0;
   char receiveBuf[SIZE];
   long int x=0;
   while (1)
   {
    x=x+SIZE;
    if(x<length)
    {
     cent=(double)x*100.0/(double)length;  //计算每段buffer占的百分比=8*1024/总文件大小
     printf("已接收: %4.2f%\n",cent);
     recv(serConn,receiveBuf,SIZE+1,0);
     fwrite(receiveBuf,1,SIZE,fp);
    }
    else
    {
     recv(serConn,receiveBuf,length+SIZE-x+1,0);
     printf("文件接收完毕\n");
     fwrite(receiveBuf,1,length+SIZE-x,fp);
     long t2=GetTickCount();//程序段结束后取得系统运行时间(ms)

     long v;
     v=length/(t2-t1);
	 printf("运行时间:%ld\n",t2-t1);
     printf("传输速率:%ld\n",v);
     fclose(fp);
     break;
    }
   }
}
closesocket(serConn);//关闭
WSACleanup();//释放资源的操作
system("pause");
}
--------客户端
#include <WINSOCK2.H>  //客户端
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#define SIZE 1024*8
int main()
{
FILE *fp;
int length=0;

//初始化协议栈
WSADATA wsaData;
int err=WSAStartup(MAKEWORD(2,2),&wsaData);    //Socket初始化

SOCKET clientSocket;
SOCKADDR_IN clientsock_in;
char receiveBuf[100]={"0"};
char ip_addr[16]={"127.0.0.1"};       //IP
clientSocket=socket(AF_INET,SOCK_STREAM,0);  //创建了可识别套接字,流式套接字,tcp/ip协议
printf("请输入主机IP:\n");
scanf("%s",ip_addr);
//连接服务器
clientsock_in.sin_addr.S_un.S_addr=inet_addr(ip_addr);//ip地址等于
clientsock_in.sin_family=AF_INET;      //地址描述
clientsock_in.sin_port=htons(6000);
connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR));//开始连接
recv(clientSocket,receiveBuf,101,0);   //接受成功返回信息,存放到接受buffer
printf("%s\n",receiveBuf);
char path[100]={"0"};
gets(path);
int i=0;
do
{
   printf("请输入文件地址:\n");
   gets(path);
   while(path[i]!='\0')
   {
    if(path[i]=='/')
     path[i]='\\';
    i++;
   }
   i=0;
   if((fp=fopen(path,"rb"))==NULL)
   {
    i=1;
    printf("文件未打开\n");
   }
}while(i);
fseek(fp,0L,SEEK_END);
    length=ftell(fp);
printf("待传送文件大小: %d\n",length);
printf("文件已经打开 等待主机消息......\n");
//得到主机开始传送消息
recv(clientSocket,receiveBuf,101,0);
printf("%s\n",receiveBuf);
if(strcmp(receiveBuf,"开始传送")==0)
{
   //传送文件长度
   char sendBuf[20];
   ltoa(length,sendBuf,10);
   send(clientSocket,sendBuf,21,0);
   fseek(fp,0L,SEEK_SET);
   //传送文件
   long int y=0;
   double cent;
   char trans[SIZE];
   while(!feof(fp))
   {

    fread(trans,1,SIZE,fp);
    y=y+SIZE;
    if(y<length)
    {
     cent=(double)y*100.0/(double)length;
     printf("已发送: %4.2f%\n",cent);
     send(clientSocket,trans,SIZE+1,0);
    }
    else
    {
     send(clientSocket,trans,length+SIZE-y+1,0);
     closesocket(clientSocket);
     WSACleanup();
    }
   }
   fclose(fp);
}
printf("文件发送完毕\n");
system("pause");
}
ckc 2018-04-07
  • 打赏
  • 举报
回复
可以多个通道,这样容易些 也可以走一个通道,在通讯协议上动点脑筋,区分消息和文件就可以了

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧