8小白 2022-10-07 19:32 采纳率: 0%
浏览 19

tcp网络编程socket

socket通信怎么传进度条从1--100
在传递信息是const char而定义的是char,怎么用循环去传递这个信息从服务端到客户端

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-09 15:31
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 看下这篇博客,也许你就懂了,链接:TCP-socket异常情况
    • 除此之外, 这篇博客: 糖儿飞教你学C++ Socket网络编程——8. 异步通信版的TCP通信程序中的 4.2.1 服务器端程序制作步骤 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      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;        }


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月7日