非常简单的Socket通信代码,上次使用过的,还花了一些时间,保留以适用于偶而需要通信的情况救急用。
以下的四段代码完成了使用简单的TCP/UDP协议来进行通信的全部所需!
以下的四段代码完成了使用简单的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 }
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 }