Windows下字符命令客户端

对应的Linux服务器使用select模型实现:

 

Linux下select函数实现的聊天服务器

http://blog.csdn.net/microtong/archive/2009/12/12/4989902.aspx

 

 

运行命令行为:Client.exe 127.0.0.1 8000

 

命令行参数分别为要连接的IP地址和端口

 

[cpp]  view plain copy
  1. //Client.cpp  
  2. #include <winsock2.h>  
  3. #include <stdio.h>  
  4. #include <windows.h>  
  5. //引入静态链接库  
  6. #pragma comment(lib,"ws2_32.lib")  
  7. //缓冲区大小  
  8. #define BUFFER_SIZE  4096  
  9. //用来修改用户姓名的命令  
  10. const char* CMD_NAME="name";  
  11. //用来退出系统的命令  
  12. const char* CMD_BYE="bye";  
  13. //负责接收数据的线程  
  14. DWORD WINAPI ReceiveThreadProc( LPVOID lpParameter);  
  15. int main(int argc, char* argv[]){  
  16.     //判断是否输入了IP地址和端口号  
  17.     if(argc!=3){  
  18.         printf("Usage: %s IPAddress PortNumber/n",argv[0]);  
  19.         exit(-1);  
  20.     }  
  21.     //把字符串的IP地址转化为u_long  
  22.     unsigned long ip;  
  23.     if((ip=inet_addr(argv[1]))==INADDR_NONE){  
  24.         printf("不合法的IP地址:%s",argv[1]);  
  25.         exit(-1);  
  26.     }  
  27.     //把端口号转化成整数  
  28.     short port;  
  29.     if((port = atoi(argv[2]))==0){  
  30.         printf("端口号有误!");  
  31.         exit(-1);  
  32.     }  
  33.     printf("Connecting to %s:%d....../n",inet_ntoa(*(in_addr*)&ip),port);  
  34.     WSADATA wsa;  
  35.     //初始化套接字DLL  
  36.     if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){  
  37.         printf("套接字初始化失败!");  
  38.         exit(-1);  
  39.     }  
  40.     //创建套接字  
  41.     SOCKET sock;  
  42.     if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET){  
  43.         printf("创建套接字失败!");  
  44.         exit(-1);  
  45.     }  
  46.     struct sockaddr_in serverAddress;  
  47.     memset(&serverAddress,0,sizeof(sockaddr_in));  
  48.     serverAddress.sin_family=AF_INET;  
  49.     serverAddress.sin_addr.S_un.S_addr = ip;  
  50.     serverAddress.sin_port = htons(port);  
  51.     //建立和服务器的连接  
  52.     if(connect(sock,(sockaddr*)&serverAddress,sizeof(serverAddress))==SOCKET_ERROR){  
  53.         printf("建立连接失败!");  
  54.         exit(-1);  
  55.     }  
  56.     //创建从服务器接收数据的线程  
  57.     DWORD threadId;  
  58.     CreateThread(NULL,0,ReceiveThreadProc,&sock,0,&threadId);  
  59.     printf(">");  
  60.     char buf[BUFFER_SIZE];  
  61.     while(1){  
  62.         //从控制台读取一行数据  
  63.         gets(buf);  
  64.         printf(">");  
  65.           
  66.         //发送给服务器  
  67.        if(send(sock,buf,strlen(buf),0)==SOCKET_ERROR){  
  68.             printf("发送数据失败!");  
  69.             exit(-1);  
  70.         }  
  71.       
  72.     }  
  73.     //清理套接字占用的资源  
  74.     WSACleanup();  
  75.     return 0;  
  76. }  
  77. DWORD WINAPI ReceiveThreadProc( LPVOID lpParameter){  
  78.     SOCKET s = *(SOCKET*)lpParameter;  
  79.     char receiveBuf[BUFFER_SIZE];  
  80.     int bytes;  
  81.     while(1){  
  82.         if((bytes=recv(s,receiveBuf,sizeof(receiveBuf),0))==SOCKET_ERROR){  
  83.             printf("接收数据失败!/n");  
  84.             exit(-1);  
  85.         }  
  86.         if(bytes==0){  
  87.             printf("server is down./n");  
  88.             exit(-1);  
  89.         }  
  90.         receiveBuf[bytes]='/0';  
  91.         //如果用户输入了“bye”  
  92.         if(strcmp(receiveBuf,CMD_BYE)==0){  
  93.             closesocket(s);  
  94.             exit(0);  
  95.         }  
  96.         printf("/n%s/n>",receiveBuf);  
  97.     }  
  98. }  

  99. 转载点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值