现在几乎所有C/C++的后台程序都需要进行网络通讯,其实现方法无非有两种:使用系统底层socket或者使用已有的封装好的网络库。本文对两种方式进行总结,并介绍一个轻量级的网络通讯库ZeroMQ。
1.基本的Scoket编程
关于基本的scoket编程网络上已有很多资料,作者在这里引用一篇文章中的内容进行简要说明。
基于socket编程,基本上就是以下6个步骤:
1、socket()函数
2、bind()函数
3、listen()、connect()函数
4、accept()函数
5、read()、write()函数等
6、close()函数
下面直接引用文章里的代码说明。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
//服务器端 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define MAXLINE 4096 int main( int argc, char ** argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[4096]; int n; if ( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf ( "create socket error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } memset (&servaddr, 0, sizeof (servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(6666); if ( bind(listenfd, ( struct sockaddr*)&servaddr, sizeof (servaddr)) == -1){ printf ( "bind socket error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } if ( listen(listenfd, 10) == -1){ printf ( "listen socket error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } printf ( "======waiting for client's request======\n" ); while (1){ if ( (connfd = accept(listenfd, ( struct sockaddr*)NULL, NULL)) == -1){ printf ( "accept socket error: %s(errno: %d)" , strerror ( errno ), errno ); continue ; } n = recv(connfd, buff, MAXLINE, 0); buff[n] = '\0' ; printf ( "recv msg from client: %s\n" , buff); close(connfd); } close(listenfd); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
客户端 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define MAXLINE 4096 int main( int argc, char ** argv) { int sockfd, n; char recvline[4096], sendline[4096]; struct sockaddr_in servaddr; if ( argc != 2){ printf ( "usage: ./client <ipaddress>\n" ); exit (0); } if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf ( "create socket error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } memset (&servaddr, 0, sizeof (servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(6666); if ( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){ printf ( "inet_pton error for %s\n" ,argv[1]); exit (0); } if ( connect(sockfd, ( struct sockaddr*)&servaddr, sizeof (servaddr)) < 0){ printf ( "connect error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } printf ( "send msg to server: \n" ); fgets (sendline, 4096, stdin); if ( send(sockfd, sendline, strlen (sendline), 0) < 0) { printf ( "send msg error: %s(errno: %d)\n" , strerror ( errno ), errno ); exit (0); } close(sockfd); exit (0); } |
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://www.cnblogs.com/zhouwanqiu/p/6680092.html