第一个windows网络程序

之前我一直在学习c#,相比c/c++来说,vs环境提供了更多的方便。

但是从今天开始我决定学习网络编程使用的语言不是c#,而是C/c++,虽然我不排斥c#和asp.net,因为他们具有更好的语法和开发效率,并且容易学习。

网络程序分为client 和server.windows封装了底层的网络操作,提供了一个通用的socket接口

常用函数WSAStartup(),socket(),closesocket(),WSACleanup(),connect().

常用数据结构sockaddr_in,和较早版本的sockaddr.

头文件:Wincock2.h

库文件:ws2_32.lib(使用这样的语法包含#pragma   comment(lib,"ws2_32.lib ")

下边贴上最基本的代码

server端 :
程序逻辑,建立监听5000端口,然后等待客户端连接,发送"hello"字符串,然后关闭连接,重新等待新连接

Code:
  1. #include <Winsock2.h>   
  2. #include <stdio.h>   
  3. #include <stdlib.h>   
  4. #pragma   comment(lib,"ws2_32.lib ")   
  5. #define PORT 5000   
  6. void main()   
  7. {   
  8.     int port = PORT;   
  9.     WSADATA wsadata;   
  10.     SOCKET sListen,sAccept;   
  11.     int iLen;   
  12.     int iSend;   
  13.     char buf[] = "hello";   
  14.     struct sockaddr_in serv,client;   
  15.     if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)   
  16.     {   
  17.         printf("Winsock load failed/n");   
  18.         return;   
  19.     }   
  20.     sListen = socket(AF_INET,SOCK_STREAM,0);   
  21.     if(sListen ==INVALID_SOCKET)   
  22.     {   
  23.         printf("socket failed:%d/n",WSAGetLastError());   
  24.         return;   
  25.     }   
  26.        
  27.        
  28.     serv.sin_family = AF_INET;   
  29.     serv.sin_port = htons(port);   
  30.     serv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);   
  31.     if(bind(sListen,(struct sockaddr*)&serv,sizeof(serv))==SOCKET_ERROR)   
  32.     {   
  33.         printf("bind() failed:%d/n",WSAGetLastError());   
  34.         return;   
  35.     }   
  36.     if(listen(sListen,5)==SOCKET_ERROR)   
  37.     {   
  38.         printf("listen failed:%d/n",WSAGetLastError());   
  39.         return;   
  40.   
  41.     }   
  42.     iLen = sizeof(client);   
  43.     while(1)   
  44.     {   
  45.         sAccept = accept(sListen,(struct sockaddr*)&client,&iLen);   
  46.         if(sAccept == INVALID_SOCKET)   
  47.         {   
  48.             printf("accept()error:%d/n",WSAGetLastError());   
  49.             return;   
  50.         }   
  51.         printf("accept client information:/n/tip:[%s],/n/tport:[%d]/n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));   
  52.         iSend = send(sAccept,buf,sizeof(buf),0);   
  53.         if(iSend == SOCKET_ERROR)   
  54.         {   
  55.             printf("send() failed:%d/n",WSAGetLastError());   
  56.             return;   
  57.         }   
  58.         else if(iSend==0)   
  59.             break;   
  60.         else  
  61.             printf("send() byte:%d/n",iSend);   
  62.         closesocket(sAccept);   
  63.     }   
  64.     closesocket(sListen);   
  65.     WSACleanup();   
  66. }  

client端
程序逻辑:主动连接192.168.0.100的5000端口,注意使用网络字节序和本地字节序的转换htons(),htonl(),ntohs(),ntohl().

Code:
  1. #include <Winsock2.h>   
  2. #include <stdio.h>   
  3. #include <stdlib.h>   
  4. #pragma   comment(lib,"ws2_32.lib ")   
  5.   
  6. #define PORT 5000   
  7. #define BUFFER 1024   
  8. # define serveraddr 127.0.0.1   
  9. void main(int argc,char *argv)   
  10. {   
  11.     WSADATA wsadata;   
  12.     SOCKET client;   
  13.     int port = PORT;   
  14.     int iLen;   
  15.     char buf[BUFFER];   
  16.     struct sockaddr_in serv;   
  17.     memset(buf,0,sizeof(buf));   
  18.     if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)   
  19.     {   
  20.         printf("Winsock load failed/n");   
  21.         return;   
  22.     }   
  23.     serv.sin_family = AF_INET;   
  24.     serv.sin_port = htons(port);   
  25.     serv.sin_addr.S_un.S_addr = inet_addr("192.168.0.100");   
  26.     client = socket(AF_INET,SOCK_STREAM,0);   
  27.     if(client == INVALID_SOCKET)   
  28.     {   
  29.         printf("socket()failed:%d",WSAGetLastError());   
  30.         return;   
  31.     }   
  32.     if(connect(client,(struct sockaddr*)&serv,sizeof(serv))==INVALID_SOCKET)   
  33.     {   
  34.         printf("connect() failed:%d/n",WSAGetLastError());   
  35.         return;   
  36.     }   
  37.     else  
  38.     {   
  39.         iLen = recv(client,buf,sizeof(buf),0);   
  40.         if(iLen ==0)   
  41.             return;   
  42.         else if(iLen ==SOCKET_ERROR)   
  43.         {   
  44.             printf("revc() failed:%d/n",WSAGetLastError());   
  45.             return;   
  46.   
  47.   
  48.         }   
  49.         else  
  50.         {   
  51.   
  52.         }   
  53.         printf("recv() data from server:%s/n",buf);   
  54.     }   
  55.     closesocket(client);   
  56.     WSACleanup();   
  57.     printf("/nok!");   
  58.     while(1);   
  59. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值