socket通信怎么传进度条从1--100
在传递信息是const char而定义的是char,怎么用循环去传递这个信息从服务端到客户端
1)新建工程,选择“Win32 Application”,输入工程名(如TCPAsync_Server),然后选择“一个典型的Hello World程序”。
2)在左侧选择FileView选项卡,找到对应的源文件(如TCPAsync_Server.cpp),将WinMain函数中DialogBox一行(148行)和return 0; 保留,其他代码全部删除,再将DialogBox中第3个参数HWnd改为NULL。
3)切换到ResourceView选项卡,找到Dialog下的“IDD_ABOUTBOX”,将对话框的界面及各个控件的ID值设置为如图4-2所示。
图4-2 对话框的界面及各控件ID值
4)打开TCPAsync_Server.cpp文件,编写如下代码:
#include "stdafx.h"
#include "resource.h"
#include "stdio.h"
#include "WINSOCK2.h"
#include <time.h>
#pragma comment(lib,"ws2_32.lib")
#define WM_SOCKET WM_USER+0x10 //自定义socket消息
HINSTANCE hInst;
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
SOCKET sockSer,sockConn;
SOCKADDR_IN addrSer, addrCli;
int len =sizeof(SOCKADDR);
char sendbuf[256], recvbuf[256];
char clibuf[999]="客户端: >", serbuf[999]="服务器: >";
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow){
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, NULL, (DLGPROC)About);
return 0;
}
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
char port[5],ip[16];
time_t tt = time(NULL); //这句返回的只是一个时间cuo
tm* t= localtime(&tt);
char szTime[20]; //用来保存时间
switch (message) {
case WM_INITDIALOG:
SetDlgItemText(hDlg,IDC_IP,"127.0.0.1");
SetDlgItemText(hDlg,IDC_PORT,"5566");
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2), &wsaData)) {
MessageBox(hDlg,"Winsock加载失败","警告",0);
WSACleanup();
return -1; }
sockSer=socket(AF_INET,SOCK_STREAM,0);
//设置异步方式
WSAAsyncSelect(sockSer, hDlg,WM_SOCKET,FD_ACCEPT |FD_READ | FD_CLOSE);
return TRUE;
case WM_SOCKET: //自定义消息
switch (WSAGETSELECTEVENT(lParam)) { //选择要处理的事件
case FD_ACCEPT:{ //接收请求事件
sockConn=accept(sockSer,(SOCKADDR*) &addrCli,&len); }
break;
case FD_READ: { //可读事件
recv(sockConn,recvbuf,256,0); //接收消息
strcat(clibuf,recvbuf);
//将接收到的消息添加到列表框中
SendDlgItemMessage(hDlg,IDC_RECVBUF,LB_ADDSTRING,0,(LPARAM)clibuf);
strcpy(clibuf, "客户端: >"); } //重新给字符串赋值
break;
case FD_CLOSE: { //关闭连接事件
MessageBoxA(NULL, "正常关闭连接", "tip", 0); }
break; }
break;
case WM_COMMAND: {
switch(LOWORD(wParam) )
{ case IDC_QUIT: //单击了退出按钮
EndDialog(hDlg, LOWORD(wParam));
closesocket(sockSer);
WSACleanup();
return TRUE;
case IDC_CREATE: //单击了创建服务器按钮
GetDlgItemText(hDlg,IDC_IP,ip,16);
GetDlgItemText(hDlg,IDC_PORT,port,5);
EnableWindow(GetDlgItem(hDlg,IDC_CREATE),FALSE); //使该按钮失效
addrSer.sin_family=AF_INET;
addrSer.sin_port=htons(atoi(port));
addrSer.sin_addr.S_un.S_addr=inet_addr(ip);
bind(sockSer,(SOCKADDR*) &addrSer,len);
listen(sockSer,5);
break;
case IDC_SEND: //单击了发送按钮
sprintf(szTime," %02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec);
GetDlgItemText(hDlg,IDC_SENDBUF,sendbuf,256);
strcat(sendbuf,szTime);
send(sockConn,sendbuf,strlen(sendbuf)+1,0); //发送带时间的消息
SetDlgItemText(hDlg,IDC_SENDBUF,NULL);
strcat(serbuf,sendbuf);
SendDlgItemMessage(hDlg,IDC_RECVBUF,LB_ADDSTRING,0,(LPARAM)serbuf);
strcpy(serbuf, "服务器: >"); //重新给字符串赋值
break; } }
break; }
return FALSE; }
服务端是否可以先把传输的大小先传过去,然后客户端自己判断就行了
char的问题,可以类型转换吧?