• WinSocket简单聊天程序客户端


      1 #pragma comment(lib,"Ws2_32.lib") 
      2 #include <stdio.h>
      3 #include <Winsock2.h>
      4 SOCKET sockClient;
      5 //设置接收数据和发送数据的缓存数组
      6 char recvBuf[50];
      7 char sendBuf[50];
      8 SOCKADDR_IN addrClient;
      9 DWORD WINAPI funB(LPVOID lp);
     10 
     11 void main(){
     12     //要求使用的版本
     13     WORD wVersionRequested;
     14     //
     15     WSADATA wsaData;
     16     int err;
     17     
     18     wVersionRequested = MAKEWORD(1,1);
     19     //初始化WinSock dll库 WSAStartup 函数返回0表示初始化成功
     20     err = WSAStartup(wVersionRequested,&wsaData);
     21     //测试版本获取结果
     22     //printf("%d
    ",err);
     23     if(err!=0){
     24         printf("WinSock初始化失败
    ");
     25         return;
     26         
     27     }
     28     
     29     if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1){
     30         WSACleanup();
     31         return;
     32     }
     33     printf("......客户端程序已启动......
    ");
     34     char addr[20];
     35     int port;
     36     printf("请输入服务器的IP地址:");
     37     scanf("%s",addr);
     38     printf("请输入服务器的端口号:");
     39     scanf("%d",&port);
     40     //创建Socket套接字
     41     sockClient = socket(AF_INET,SOCK_STREAM,0);
     42     
     43     //通讯的IP地址
     44     addrClient.sin_addr.S_un.S_addr=inet_addr(addr);
     45     //使用IP地址族
     46     addrClient.sin_family=AF_INET;
     47     //通讯的端口号
     48     addrClient.sin_port=htons(port);
     49     
     50     connect(sockClient,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
     51     
     52     strcpy(recvBuf,"");
     53     //从服务器中获得IP地址 并向服务器发送建立连接的消息
     54     recv(sockClient,recvBuf,50,0);
     55     send(sockClient,"已经建立通讯连接",strlen("已经建立通讯连接")+1,0);
     56 
     57     if( strlen(recvBuf)==0){
     58         printf("警告:服务器未启动,请先启动服务器!!!
    ");
     59         //system("pause");
     60         exit(0);
     61     }else{
     62         printf("服务器信息:%s
    ",recvBuf);
     63     }
     64     
     65     HANDLE a; 
     66     DWORD dwT; 
     67     //参数1:使用默认的安全性;参数2:与调用线程一样的栈大小;
     68     //参数3:线程入口函数地址;参数4:传递给线程的参数;参数5:线程创建标记;参数6:新线程的ID
     69     a=CreateThread(NULL,0,funB,0,0,&dwT); 
     70     //循环接收和发送消息
     71     //关闭新线程的句柄
     72     CloseHandle(a); 
     73     
     74     while(1){
     75         //从控制台接收用户输入数据发送到客户端
     76         //printf("客户端说:");
     77         scanf("%s",sendBuf);
     78         send(sockClient,sendBuf,strlen(sendBuf)+1,0);
     79     }
     80     
     81     //关闭套接字和连接
     82     closesocket(sockClient);
     83     WSACleanup();
     84     
     85 }
     86 
     87 DWORD WINAPI funB(LPVOID lp) 
     88 {    
     89     char   Message[50];
     90     while (TRUE)
     91     {
     92         //从服务器接收数据显示到控制台
     93         if(recv(sockClient,Message,50,0) != -1){
     94             printf("服务器说:%s
    ",Message);
     95         }else{
     96             printf("连接已经中断.....请检查服务端是否启动并重试。");
     97             system("pause");
     98             exit(0);
     99         }
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    使用MetaLogo对不等长序列绘制Sequence logo
    RocketMQ源码 索引文件/indexFile 和 消费队列/ConsumeQueue
    看了两篇教程,我的博客炸了
    BCD注册表找不到怎么办?
    扫一扫PC版 V0.3
    java_Lambda表达式
    Java_多线程
    java_静态方法和非静态方法的区别
    idea_快捷键
    Java_稀疏数组
  • 原文地址:https://www.cnblogs.com/rememberme/p/ClientSocket.html
Copyright © 2020-2023  润新知