栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

完美实现 Windows 下网络通信

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

完美实现 Windows 下网络通信

编译环境:DEV C++配置编译器

Windows 下 实现 Socket 编译需要 ws2_32.lib 这个库的支撑,所以我们编译前应该配置下编译器,具体配置步骤如下:

Tools -> Compiler Options

加入 -l 链接,如图所示:

实现的功能

服务器端与客户端可以互相自由给对方发送消息,无需在意接收与发送的顺序(利用线程实现)!可以实现加法运算。如需其它的功能,可以自行补充,如:实现四则运算、文件传输等。

服务器程序
#include     
#include 
 #include 
 #include #define PORT        8080  
 #define BUFSIZE     1
 024SOCKET client;unsigned char SendBuf[BUFSIZE+1];enum{
    NoConnection,
    Connected,
}linkStatus;DWORD WINAPI print_message(LPVOID arg){  
  while(1){        if(!linkStatus){           
   printf("    等待客户端连接 .... rn");
            sleep(1);
        }
    }
}DWORD WINAPI send_message(LPVOID arg){   
    while(1){        memset(SendBuf, 0, 1024); 
        fgets(SendBuf, 1024, stdin);
        send(client, SendBuf, 1024, 0);
    }
} 

int main(int argc, char* argv[]){
    WSADATA wsaData;    struct sockaddr_in sin_addr;
    struct sockaddr_in remoteAddr;
    unsigned char recvData[BUFSIZE+1];    int nAddrlen = sizeof(remoteAddr);    
    unsigned int num_l, num_r;    unsigned char sum_buf[100] = {0};    
    
    HANDLE pthread;    
    
    WORD sockVersion = MAKEWORd(2, 2);    if (WSAStartup(sockVersion, &wsaData)){
        perror("WSA boot failed!");        return -1;
    }    
    SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (server == INVALID_SOCKET){
        perror("socket error!");        return -1;
    }    
    sin_addr.sin_family = AF_INET;
    sin_addr.sin_port = htons(PORT);    
    sin_addr.sin_addr.S_un.S_addr = INADDR_ANY; 
    //    sin_addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.149"); 
    
    
    if (bind(server, (LPSOCKADDR)&sin_addr, sizeof(sin_addr)) == SOCKET_ERROR){
        perror("bind error!");        return -1;
    }    
    if (listen(server, 100) == SOCKET_ERROR){
        perror("listen error!");        return -1;
    }    
    puts("服务器成功启动"); 
    
    
    CreateThread(NULL,0,print_message,NULL,0,NULL);    
    pthread = CreateThread(NULL,0,send_message,NULL,0,NULL);    while (1)
    {   
        linkStatus = NoConnection;
        client = accept(server, (SOCKADDR *)&remoteAddr, &nAddrlen);
        linkStatus = Connected;        
        if (client == INVALID_SOCKET)
        {
            perror("accept error!");            continue;
        }        
        printf("客户端:%s 已连接rn", inet_ntoa(remoteAddr.sin_addr));       
         while(1){            
            memset(recvData, 0, sizeof(recvData));            
            int ret = recv(client, recvData, 1024, 0);           
             if (ret > 0){               
              printf("Recv:   %s", recvData);               
               
                if(sscanf(recvData, "%d + %d =", &num_l, &num_r) == 2){                    
                sprintf(sum_buf, "%d + %d ,sum is %d", num_l, num_r, num_l + num_r);
                    send(client, sum_buf, sizeof(sum_buf), 0);                   
                     memset(sum_buf, 0, sizeof(sum_buf));
                }
            }else
                
                goto Reconnect;                
            
            if(!strncmp(recvData, "quit", 4))               
             goto Reconnect;
        }
        
    Reconnect:
        closesocket(client);        puts("*** 客户端已断开");
    }    
    closesocket(server); 
    WSACleanup();    
    return 0;
}
客户端程序
#include   #include   #include   
#include 
  #define PORT        8080  
  #define BUFSIZE     1024unsigned char recvData[BUFSIZE+1] = {0};  

HANDLE pthread;DWORD WINAPI recv_message(LPVOID arg){    
int res;    
    while(1){        memset(recvData, 0, 1024); 
        res = recv((SOCKET)arg, recvData, 1024, 0);       
         if(res > 0)           
          printf("Recv:   %s", recvData);       
          else{          
            printf("*** 服务器已退出(回车退出程序)");           
             return 0;
        } 
    }
}  
int main(int argc, char * argv[])  {  
    unsigned char SendBuf[BUFSIZE+1] = {0};  
    WSADATA wsaData;
    SOCKADDR_IN addrServ;  
    
    if(argc != 2){        puts("argc error");        
    puts("Usage:  ");        return -1;
    }    
    WORD sockVersion = MAKEWORd(2, 2);    
    if (WSAStartup(sockVersion, &wsaData)){
        perror("WSA boot failed!");        return -1;
    }    
    
    SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
    if (client == INVALID_SOCKET){  
        perror("socket failed");  
        return -1;  
    }  
    
    
    addrServ.sin_family = AF_INET;  
    addrServ.sin_port = htons(PORT);  
    
    addrServ.sin_addr.S_un.S_addr = inet_addr(argv[1]);  
      
    
    int ret = connect(client,(SOCKADDR*)&addrServ,sizeof(SOCKADDR));   
     if (SOCKET_ERROR == ret){  
        perror("socket connect failed");  
        closesocket(client);  
        WSACleanup();  
        return -1;  
    }  
    
    
    pthread = CreateThread(NULL,0 ,recv_message,(LPVOID)client,0,NULL);    
    puts("客户端成功启动,输入'quit'关闭客户端"); 
    
    while(1)
    {        memset(SendBuf,0,sizeof(SendBuf));  
        
        fgets(SendBuf, 1024, stdin);
        
        ret = send(client, SendBuf, 1024, 0);  
        if (SOCKET_ERROR == ret){  
            closesocket(client);  
            exit(0);
        } 
        
        
        if(!strncmp(SendBuf, "quit", 4))          
          goto Disconnect;
    }

Disconnect:  
    closesocket(client);  
    WSACleanup();  
    
    return 0;  
}
运行结果演示

打开 CMD,进入可执行文件所在目录

执行 server.exe 运行服务器;
启动另一个 CMD,执行 client.exe 127.0.0.1 运行客户端。

双方可进行通信,效果如图:

你的支持就是我的动力! 转载请注明出处,谢谢!

作者:Lance#

原文链接:https://www.cnblogs.com/GyForever1004/p/9082360.html


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/233319.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号