一个基本的网络通信有关问题,请大家帮忙看下啊

一个基本的网络通信问题,请大家帮忙看下啊~
1、客户端将设置好的参数发给服务器端
2、服务器端将状态信息返回给客户端
3、服务器端将处理好的结果发送给客户端

是否需要建立两条TCP连接呢?一条连接主管步骤1和2,一条主管3
是否需要两个线程?
那些设置过的参数,要用自定义的格式发送出去,是声明个结构体保存么?

都是些很基本的问题,可是希望能得到大家具体的指导。最好是如果大家有这样的例程,能否发给我一份呢?谢谢啊!
flowerseashine@yahoo.com.cn


------解决方案--------------------
一个Socket连接来交换数据,
结构体填充好数据后,转成TCHAR*,然后发送出去,接收端再转换回结构体
------解决方案--------------------


网上看到的,希望对你有帮助,我感觉写的不错(我是还是比较菜)















TCP协议实现文件传输
 使用TCP协议实现传输文件
程序分为发送端和接收端。首先在传输文件数据之前,发送端会把将装有文件名称和文件长度等
信息的数据包发送至接收端。接收端收到文件名称和文件长度信息后会创建好空白文件。接着开始传输
文件数据。下面介绍实现功能的主要过程:

1.创建套接字、绑定、监听、连接、接受连接
//创建TCP协议的套接字
m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(SOCKET_ERROR == m_Socket)
AfxMessageBox("Create Socket Error! ", 0, 0);

//绑定与监听
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.s_addr = inet_addr(sIP);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(Port);
int ret = bind(m_Socket, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
if(ret==SOCKET_ERROR)
AfxMessageBox("Bind Socket Error!", 0, 0);

//连接
SOCKADDR_IN ServerAddr;
ServerAddr.sin_addr.s_addr = inet_addr(ServerAddr_in);
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(ServerPort);
int Result = connect(m_Socket, (struct sockaddr*)&ServerAddr, sizeof(struct sockaddr));
if(SOCKET_ERROR == Result)
AfxMessageBox("Connet Failed!");

//接受连接
SOCKADDR_IN ClientAddr;
int len = sizeof(SOCKADDR_IN);
SOCKET ClientSock = accept(m_Socket, (struct sockaddr*)&ClientAddr, &len);
if(SOCKET_ERROR == ClientSock)
AfxMessageBox("Accept Failed!");

2.声明宏和结构体
声明套接字缓冲区和一次发送文件数据的缓冲区大小
#define SOCKET_BUFF 80000 //套接字缓冲区大小
#define PACK_BUFF 50000 //数据包缓冲区大小


声明文件I/O缓冲区和最大文件路径长度
#define FILE_NAME_MAX 100 //文件路径最大长度
#define FILE_IO_BUFF PACK_BUFF //文件IO缓冲区


//文件信息
typedef struct _FileInfor
{
u_long ulFileLen;
char sFileName[ FILE_NAME_MAX ];
}_FileInfor;

//数据包
typedef struct _DataPack
{
char cType; //'D'为数据 'M'为文件信息
int nPackLen;
char sContent[ PACK_BUFF ]; //数据包缓冲区
u_long nPosition; //数据在文件中的位置
int nContentLen; //数据字节数
_FileInfor FileInfor; //文件信息
}_DataPack;



3.发送端
//发送线程需要的全局变量
char sPath[FILE_NAME_MAX]; //文件地址
u_long FileByteCount; //文件大小
SOCKET ClientSocket; //


(1)设置套接字发送缓冲区大小,在32位Windows XP环境下,系统为每个套接字分配的默认发送数据缓
冲区为8192字节。由于传输的文件很大,可能几十兆,或者更大。那么系统为每个套接字分配的默认
缓冲区显然过小。为此在创建套接字之后,需要修改套接字发送数据缓冲尺寸。在这里我修改为80k,
差不多可以够用了。
//设置套接字发送缓冲区
int nBuf = SOCKET_BUFF;
int nBufLen = sizeof(nBuf);
int nRe = setsockopt(ClientSock, SOL_SOCKET, SO_SNDBUF, (char*)&nBuf, nBufLen);//完成套接字与缓冲区的联系
if(SOCKET_ERROR == nRe)
AfxMessageBox("setsockopt error!");
//检查缓冲区是否设置成功
nRe = getsockopt(ClientSock, SOL_SOCKET, SO_SNDBUF, (char*)&nBuf, &nBufLen);
if(SOCKET_BUFF != nBuf)
AfxMessageBox("检查缓冲区:setsockopt error!");

(2)测量文件大小并发送文件大小和名称给客户端

首先使用C库函数对源文件进行测量
//得到文件地址
LPTSTR lpPath = m_sPath.GetBuffer( m_sPath.GetLength ());
//打开文件
FILE *File = fopen(lpPath, "rb"); 
if(NULL == File)
AfxMessageBox("打开文件失败!");
//测量文件大小
char Buff[PACK_BUFF];