网络Windows 下 socket 编程范例

Posted ybhello

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络Windows 下 socket 编程范例相关的知识,希望对你有一定的参考价值。

  1 #include "winsock2.h"
  2 #include <stdint.h>
  3 #include <stdio.h>
  4 
  5 #include <ctype.h>
  6 #include <time.h>
  7 
  8 #define MAX_BUF_LEN 1024
  9 
 10 #define ERR (-1)
 11 #define OK  0
 12 
 13 enum 
 14     TCP = 6,
 15     UDP = 17,
 16 ;
 17 
 18 struct ClientPeer;
 19 typedef int (*ClientVoidHandler)(struct ClientPeer *);
 20 typedef int (*ClientRecvHandler)(struct ClientPeer *peer, char *buf, int len);
 21 typedef int (*ClientSendHandler)(struct ClientPeer *peer, const char *buf, int len);
 22 
 23 struct ClientPeerOp 
 24     ClientVoidHandler createsocket;
 25     ClientVoidHandler connect;
 26     ClientRecvHandler recv;
 27     ClientSendHandler send;
 28     ClientVoidHandler close;
 29 ;
 30 
 31 struct ClientPeer 
 32     ClientPeerOp op;
 33 
 34     SOCKET fd;
 35 
 36     struct sockaddr_in remote;
 37 ;
 38 
 39 int PeerEnvInit(void)
 40 
 41     WORD sockVersion = MAKEWORD(2, 2);
 42     WSADATA wsaData;
 43     if (WSAStartup(sockVersion, &wsaData) != 0) 
 44         return ERR;
 45     
 46     return OK;
 47 
 48 
 49 int PeerEnvDestroy(void)
 50 
 51     WSACleanup();
 52     return OK;
 53 
 54 
 55 struct ClientPeer *ClientPeerNewWithRemote(const char *ip, unsigned short port)
 56 
 57     struct ClientPeer *peer = (struct ClientPeer *)calloc(1, sizeof(struct ClientPeer));
 58 
 59     peer->remote.sin_family = AF_INET;
 60     peer->remote.sin_port = htons(port);
 61     peer->remote.sin_addr.S_un.S_addr = inet_addr(ip);
 62 
 63     return peer;
 64 ;
 65 
 66 int TCPClientPeerCreateSocket(struct ClientPeer *peer)
 67 
 68     SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 69     if (fd == INVALID_SOCKET) 
 70         printf("socket error !");
 71         return ERR;
 72     
 73     peer->fd = fd;
 74     return OK;
 75 
 76 
 77 int TCPClientPeerConnect(struct ClientPeer *peer)
 78 
 79     if (connect(peer->fd, (struct sockaddr *)&(peer->remote), sizeof(struct sockaddr)) == SOCKET_ERROR) 
 80         printf("connect error !");
 81         return ERR;
 82     
 83     return OK;
 84 
 85 
 86 int TCPClientPeerSend(struct ClientPeer *peer, const char *buf, int len)
 87 
 88     return send(peer->fd, buf, len, 0);
 89 
 90 
 91 int TCPClientPeerRecv(struct ClientPeer *peer, char *buf, int len)
 92 
 93     return recv(peer->fd, buf, len, 0);
 94 
 95 
 96 int TCPClientPeerClose(struct ClientPeer *peer)
 97 
 98     closesocket(peer->fd);
 99     return OK;
100 
101 
102 
103 int UDPClientPeerCreateSocket(struct ClientPeer *peer)
104 
105     SOCKET fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
106     if (fd == INVALID_SOCKET) 
107         printf("socket error !");
108         return ERR;
109     
110     peer->fd = fd;
111     return OK;
112 
113 
114 int UDPClientPeerConnect(struct ClientPeer *peer)
115 
116     return OK;
117 
118 
119 int UDPClientPeerSend(struct ClientPeer *peer, const char *buf, int len)
120 
121     return sendto(peer->fd, buf, len, 0, (struct sockaddr *)&(peer->remote), sizeof(struct sockaddr));
122 
123 
124 int UDPClientPeerRecv(struct ClientPeer *peer, char *buf, int len)
125 
126     int addrlen = sizeof(struct sockaddr_in);
127     return recvfrom(peer->fd, buf, len, 0, (struct sockaddr *)&(peer->remote), &addrlen);
128 
129 
130 int UDPClientPeerClose(struct ClientPeer *peer)
131 
132     closesocket(peer->fd);
133     return OK;
134 
135 
136 struct ClientPeer *ClientPeerFactory(int type, const char *ip, unsigned short port)
137 
138     struct ClientPeer *peer = ClientPeerNewWithRemote(ip, port);
139 
140     switch (type) 
141         case TCP:
142             peer->op.createsocket = TCPClientPeerCreateSocket;
143             peer->op.connect = TCPClientPeerConnect;
144             peer->op.recv = TCPClientPeerRecv;
145             peer->op.send = TCPClientPeerSend;
146             peer->op.close = TCPClientPeerClose;
147             break;
148 
149         case UDP:
150             peer->op.createsocket = UDPClientPeerCreateSocket;
151             peer->op.connect = UDPClientPeerConnect;
152             peer->op.recv = UDPClientPeerRecv;
153             peer->op.send = UDPClientPeerSend;
154             peer->op.close = UDPClientPeerClose;
155             break;
156     
157 
158     return peer;
159 
160 
161 
162 
163 
164 struct ServerPeer;
165 typedef int (*ServerVoidHandler)(struct ServerPeer *);
166 typedef int (*ServerRecvHandler)(struct ServerPeer *peer, char *buf, int len);
167 typedef int (*ServerSendHandler)(struct ServerPeer *peer, const char *buf, int len);
168 
169 struct ServerPeerOp 
170     ServerVoidHandler createsocket;
171     ServerVoidHandler bindaddr;
172     ServerVoidHandler listen;
173     ServerVoidHandler accept;
174     ServerRecvHandler recv;
175     ServerSendHandler send;
176     ServerVoidHandler closeclient;
177     ServerVoidHandler close;
178 ;
179 
180 struct ServerPeer 
181     SOCKET lfd;
182     SOCKET rfd;
183 
184     struct sockaddr_in laddr;
185     struct sockaddr_in raddr;
186 
187     struct ServerPeerOp op;
188 ;
189 
190 
191 struct ServerPeer *ServerPeerNewWithAddr(const char *ip, unsigned short port)
192 
193     struct ServerPeer *peer = (struct ServerPeer *)calloc(1, sizeof(struct ServerPeer));
194 
195     peer->laddr.sin_family = AF_INET;
196     peer->laddr.sin_port = htons(port);
197     peer->laddr.sin_addr.S_un.S_addr = inet_addr(ip);
198 
199     return peer;
200 
201 
202 int TCPServerPeerCreateSocket(struct ServerPeer *peer)
203 
204 
205     SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
206     if (fd == INVALID_SOCKET) 
207         printf("socket error !");
208         return ERR;
209     
210     peer->lfd = fd;
211     return OK;
212 
213 
214 int TCPServerPeerBindaddr(struct ServerPeer *peer)
215 
216     if (bind(peer->lfd, (struct sockaddr *)&(peer->laddr), sizeof(struct sockaddr)) == SOCKET_ERROR) 
217         printf("bind error !");
218         return ERR;
219     
220 
221     return OK;
222 
223 
224 int TCPServerPeerListen(struct ServerPeer *peer)
225 
226     if (listen(peer->lfd, 5) == SOCKET_ERROR) 
227         printf("listen error !");
228         return ERR;
229     
230 
231     return OK;
232 
233 
234 int TCPServerPeerAccept(struct ServerPeer *peer)
235 
236     int len = sizeof(struct sockaddr_in);
237     peer->rfd = accept(peer->lfd, (struct sockaddr *)&(peer->raddr), &len);
238     if (peer->rfd == INVALID_SOCKET) 
239         printf("accept error !");
240         return ERR;
241     
242     return OK;
243 
244 
245 int TCPServerPeerSend(struct ServerPeer *peer, const char *buf, int len)
246 
247     return send(peer->rfd, buf, len, 0);
248 
249 
250 int TCPServerPeerRecv(struct ServerPeer *peer, char *buf, int len)
251 
252     return recv(peer->rfd, buf, len, 0);
253 
254 
255 int TCPServerPeerCloseClient(struct ServerPeer *peer)
256 
257     closesocket(peer->rfd);
258     return OK;
259 
260 
261 int TCPServerPeerClose(struct ServerPeer *peer)
262 
263     closesocket(peer->lfd);
264     return OK;
265 
266 
267 
268 
269 
270 
271 
272 
273 
274 int UDPServerPeerCreateSocket(struct ServerPeer *peer)
275 
276 
277     SOCKET fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
278     if (fd == INVALID_SOCKET) 
279         printf("socket error !");
280         return ERR;
281     
282     peer->lfd = fd;
283     return OK;
284 
285 
286 int UDPServerPeerBindaddr(struct ServerPeer *peer)
287 
288     if (bind(peer->lfd, (struct sockaddr *)&(peer->laddr), sizeof(struct sockaddr)) == SOCKET_ERROR) 
289         printf("bind error !");
290         return ERR;
291     
292 
293     return OK;
294 
295 
296 int UDPServerPeerListen(struct ServerPeer *peer)
297 
298     return OK;
299 
300 
301 int UDPServerPeerAccept(struct ServerPeer *peer)
302 
303     return OK;
304 
305 
306 int UDPServerPeerSend(struct ServerPeer *peer, const char *buf, int len)
307 
308     return sendto(peer->lfd, buf, len, 0, (struct sockaddr *)&(peer->raddr), sizeof(struct sockaddr_in));
309 
310 
311 int UDPServerPeerRecv(struct ServerPeer *peer, char *buf, int len)
312 
313     int addrlen = sizeof(struct sockaddr_in);
314     return recvfrom(peer->lfd, buf, len, 0, (struct sockaddr *)&(peer->raddr), &addrlen);
315 
316 
317 int UDPServerPeerCloseClient(struct ServerPeer *peer)
318 
319     return OK;
320 
321 
322 int UDPServerPeerClose(struct ServerPeer *peer)
323 
324     closesocket(peer->lfd);
325     return OK;
326 
327 
328 
329 struct ServerPeer *ServerPeerFactory(int type, const char *ip, unsigned short port)
330 
331     struct ServerPeer *peer = ServerPeerNewWithAddr(ip, port);
332 
333     switch (type) 
334         case TCP:
335             peer->op.createsocket = TCPServerPeerCreateSocket;
336             peer->op.bindaddr = TCPServerPeerBindaddr;
337             peer->op.listen = TCPServerPeerListen;
338             peer->op.accept = TCPServerPeerAccept;
339             peer->op.recv = TCPServerPeerRecv;
340             peer->op.send = TCPServerPeerSend;
341             peer->op.closeclient = TCPServerPeerCloseClient;
342             peer->op.close = TCPServerPeerClose;
343             break;
344 
345         case UDP:
346             peer->op.createsocket = UDPServerPeerCreateSocket;
347             peer->op.bindaddr = UDPServerPeerBindaddr;
348             peer->op.listen = UDPServerPeerListen;
349             peer->op.accept = UDPServerPeerAccept;
350             peer->op.recv = UDPServerPeerRecv;
351             peer->op.send = UDPServerPeerSend;
352             peer->op.closeclient = UDPServerPeerCloseClient;
353             peer->op.close = UDPServerPeerClose;
354             break;
355     
356 
357     return peer;
358 
359 
360 
361 struct Peer;
362 typedef void (*runhandler)(struct Peer *);
363 
364 
365 
366 struct Peer 
367     union 
368         ClientPeer *client;
369         ServerPeer *server;
370     ;
371     runhandler op;
372 ;
373 
374 void ServerRun(struct Peer *p)
375 
376     struct ServerPeer *peer = p->server;
377     struct ServerPeerOp *op = &(peer->op);
378 
379     op->createsocket(peer);
380     op->bindaddr(peer);
381     op->listen(peer);
382     op->accept(peer);
383     while (1) 
384         int ret;
385         char buf[MAX_BUF_LEN];
386         time_t t = time(NULL);
387 
388         memset(buf, 0, sizeof(buf));
389         op->recv(peer, buf, sizeof(buf));
390 
391         printf("server recv: %s\\n", buf);
392 
393         strncpy(buf, ctime(&t), sizeof(buf));
394         ret = op->send(peer, buf, strlen(buf));
395         if (ret <= 0) 
396             printf("send failed(%d - %d).\\n", ret, WSAGetLastError());
397             break;
398         
399     
400 
401 
402 void ClientRun(struct Peer *p)
403 
404     struct ClientPeer *peer = p->client;
405     struct ClientPeerOp *op = &(peer->op);
406 
407     op->createsocket(peer);
408     op->connect(peer);
409 
410     char hello[] = "Hello, I am client.\\n";
411 
412     op->send(peer, hello, strlen(hello));
413 
414     while (1) 
415         char buf[MAX_BUF_LEN] = 0;
416         int len = 0;
417 
418         len = op->recv(peer, buf, sizeof(buf));
419         if (len <= 0) 
420             printf("recv error (%d - %d) !\\n", len, WSAGetLastError());
421             break;
422         
423         printf("client recv: %s\\n", buf);
424 
425         for (int i = 0; i < len; i++) 
426             buf[i] = toupper(buf[i]);
427         
428         op->send(peer, buf, strlen(buf));
429 
430         Sleep(1000);
431     
432 
433     op->close(peer);
434 
435 
436 
437 enum 
438     TCP_SERVER = 1,
439     TCP_CLIENT,
440     UDP_SERVER,
441     UDP_CLIENT,
442 ;
443 
444 struct Peer *PeerFactory(int type, const char *ip, unsigned short port)
445 
446     struct Peer *peer = (struct Peer *)calloc(1, sizeof(struct Peer));
447 
448     switch (type) 
449         case TCP_SERVER:
450             peer->server = ServerPeerFactory(TCP, ip, port);
451             peer->op = ServerRun;
452             break;
453         case TCP_CLIENT:
454             peer->client = ClientPeerFactory(TCP, ip, port);
455             peer->op = ClientRun;
456             break;
457         case UDP_SERVER:
458             peer->server = ServerPeerFactory(UDP, ip, port);
459             peer->op = ServerRun;
460             break;
461         case UDP_CLIENT:
462             peer->client = ClientPeerFactory(UDP, ip, port);
463             peer->op = ClientRun;
464             break;
465     
466 
467     return peer;
468 ;
469 
470 
471 void PeerRun(struct Peer *peer)
472 
473     peer->op(peer);
474 
475 
476 
477 int main()
478 
479     int type;
480     printf("input way:              \\n\\
481               1. tcp server         \\n482               2. tcp client         \\n483               3. udp server         \\n484               4. udp client         \\n485            ");
486     scanf("%d", &type);
487 
488     const char *ip = "127.0.0.1";
489     unsigned short port = 10240;
490 
491     PeerEnvInit();
492 
493     struct Peer *peer = NULL;
494 
495     switch(type) 
496         case 1:
497         case 2:
498         case 3:
499         case 4:
500             peer = PeerFactory(type, ip, port);
501             PeerRun(peer);
502             break;
503         default:
504             printf("unknown.");
505             break;
506     
507 
508     PeerEnvDestroy();
509 

 

使用的是 codeblock,需要链接 wsock32

 

技术图片

 

以上是关于网络Windows 下 socket 编程范例的主要内容,如果未能解决你的问题,请参考以下文章

Windows 环境下的 Socket 编程 1 - 环境搭建和 Socket 相关函数

在windows下用C语言如何实现socket网络编程,需要用到哪些头文件或者库?

Socket网络编程

Windows网络编程:阻塞模式下的Socket编程

windows下的socket网络编程(入门级)

关于WinSock编程的多线程控制