简易的Socket通信

11 篇文章 0 订阅
非常简单的Socket通信代码,上次使用过的,还花了一些时间,保留以适用于偶而需要通信的情况救急用。
以下的四段代码完成了使用简单的TCP/UDP协议来进行通信的全部所需!


  1  #include  < string >
  2  #include < stdlib.h >
  3  #include < stdio.h >
  4  #include < conio.h >
  5  #include < winsock2.h >
  6  #include < windows.h >
  7  #pragma comment(lib, " ws2_32.lib " )
  8  using   namespace  std;
  9 
 10  void  sbBroadcast( void )
 11  {
 12      SOCKET listener;
 13      sockaddr_in listen_adress;
 14      WSADATA wsdata;
 15      BOOL optval;
 16       // 启动SOCKET库,版本为2.0
 17      WSAStartup( 0x0202 , & wsdata);
 18      optval = TRUE;
 19 
 20       // 然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
 21      listen_adress.sin_family = AF_INET;
 22      listen_adress.sin_addr.s_addr = INADDR_ANY;
 23      listen_adress.sin_port = htons( 9290 );
 24      listener = socket(AF_INET,SOCK_DGRAM,  0 );
 25       // 设置该套接字为广播类型,
 26       // setsockopt(listener,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));
 27      bind(listener,(sockaddr  * ) & listen_adress, sizeof (sockaddr_in));
 28      listen(listener,  5 );
 29 
 30       char  buf[ 256 ];
 31       while ( 1 )
 32      { // 从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
 33          sockaddr_in from;
 34           int  fromlength  =   sizeof (SOCKADDR);
 35           int  rev  =  recvfrom(listener,buf,  sizeof (buf), 0 ,( struct  sockaddr FAR  * ) & from,( int  FAR  * ) & fromlength);
 36           if  (rev  !=  SOCKET_ERROR)
 37          {
 38               static   int  num  =   0 ;
 39              printf( " %s(%d) : %s\n " ,inet_ntoa(from.sin_addr), num, buf);  // 在此处输出检查到的IP,对吗????
 40              ZeroMemory(buf,  sizeof (buf));
 41              num ++ ;
 42          }
 43      }
 44  }
 45 
 46  void  fbBroadcast( void )
 47  {
 48      SOCKET s;
 49      sockaddr_in addrto;
 50      WSADATA wsdata;
 51      BOOL bsocket;
 52       char   * smsg = " 127.0.0.1&9290&255.255.255.255&9290&1&HelloMessage " ;
 53      WSAStartup( 0x0202 , & wsdata);
 54 
 55      s = WSASocket(AF_INET,SOCK_DGRAM, IPPROTO_UDP,NULL, 0 ,WSA_FLAG_OVERLAPPED);
 56      bsocket = TRUE;
 57       // 然后赋值给地址,用来从网络上的广播地址接收消息;
 58      addrto.sin_family = AF_INET;
 59      addrto.sin_addr.s_addr = INADDR_BROADCAST;
 60      addrto.sin_port = htons( 9290 );
 61       bool  opt = true ;
 62       // 设置该套接字为广播类型,
 63      setsockopt(s,SOL_SOCKET,SO_BROADCAST,( char  FAR  * ) & opt, sizeof (opt));
 64       int  nlen = sizeof (addrto);
 65       while ( 1 )
 66      {
 67          Sleep( 10 );
 68           static   int  num  =   0 ;
 69           // 从广播地址发送消息
 70           int  ret = sendto(s,smsg, 256 , 0 ,(sockaddr * ) & addrto,nlen);
 71           if (ret == SOCKET_ERROR)
 72          {
 73              printf( " GetLastError: %d \n " ,WSAGetLastError());
 74          }
 75           else
 76          {  
 77              printf( " ok, num = %d \n " , num);    
 78          }
 79          num ++ ;
 80          Sleep( 1000 );
 81      }
 82  }
 83 
 84  void  sbTcp( void )
 85  {
 86      SOCKET listener;
 87      sockaddr_in listen_adress;
 88      WSADATA wsdata;
 89       // 启动SOCKET库,版本为2.0
 90      WSAStartup( 0x0202 , & wsdata);
 91 
 92       // 然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
 93      listen_adress.sin_family = AF_INET;
 94      listen_adress.sin_addr.s_addr = INADDR_ANY;
 95      listen_adress.sin_port = htons( 9290 );
 96      listener = socket(AF_INET,SOCK_STREAM,  0 );
 97 
 98      bind(listener,(sockaddr  * ) & listen_adress, sizeof (sockaddr_in));
 99      listen(listener,  5 );
100 
101       char  buf[ 256 ];
102       while ( 1 )
103      { // 从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
104          sockaddr_in from;
105           int  fromlength  =   sizeof (SOCKADDR);
106          SOCKET temp  =  accept(listener, (sockaddr  * ) & from,  & fromlength);
107          
108          recv(temp, buf,  256 0 );
109          printf( " %s : %s\n " ,inet_ntoa(from.sin_addr), buf);  // 在此处输出检查到的IP,对吗????
110 
111          
112           string  msg  =   " ok~~~~~~~~~~ " ;
113 
114          printf( " preper to send\n " );
115 
116          send(temp, msg.c_str(), msg.size()  +   2 0 );
117          ZeroMemory(buf, 256 );
118          closesocket(temp);
119      }
120  }
121 
122 
123  void  FbTcp( void )
124  {
125      sockaddr_in server_addres;
126      WSADATA wsdata;
127       char   * smsg = " Hello Socket! " ;
128      WSAStartup( 0x0202 , & wsdata);
129 
130       // 然后赋值给地址,用来从网络上的广播地址接收消息;
131      server_addres.sin_family = AF_INET;
132      server_addres.sin_addr.s_addr  =  inet_addr( " 127.0.0.1 " );
133      server_addres.sin_port = htons( 9290 );
134      
135       int  nlen = sizeof (server_addres);
136       while ( 1 )
137      {
138          SOCKET s  =  socket(AF_INET,SOCK_STREAM,  0 );
139           int  ret  =  connect(s, (LPSOCKADDR) & server_addres,  sizeof (server_addres));
140          
141           static   int  num  =   0 ;
142           char  buf[ 256 ];
143           // 从广播地址发送消息
144          ret = send(s,smsg, 256 , 0 );
145          ret  =  recv(s, buf,  256 0 );
146          printf( " %s  @  %l " , buf,  & buf);
147           if (ret == SOCKET_ERROR)
148          {
149              printf( " GetLastError: %d \n " ,WSAGetLastError());
150          }
151           else
152          {  
153              printf( " ok, num = %d \n " , num);    
154          }
155          num ++ ;
156          closesocket(s);
157 
158          Sleep( 100 );
159      }
160  }
161 
162 
163 
164  #include  < string >
165  #include  < iostream >
166  using   namespace  std;
167 
168 
169 
170  int  main()
171  {
172       char  c  =  getchar();
173       if  (c  ==   ' s ' )
174      {
175          sbBroadcast();
176      }
177       else   if (c  ==   ' f ' )
178      {
179          fbBroadcast();
180      }
181       else   if  (c  ==   ' z ' )
182      {
183          sbTcp();
184      }
185       else
186      {
187          FbTcp();
188      }
189  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值