现在几乎所有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