网络通信方式可选择一台主机里的两个虚拟机,也可以两台主机里的两个虚拟机,本文采用方式二。
主机一IP地址为192.168.1.109
主机二IP地址为192.168.1.24
必须使两台主机在一个网段内,并且可以ping通才可进行以下操作。
二、TCP连接客户端(主机一)代码
TCP_client.c
#include#include #include #include #include #include #include int main(int argc, char *argv[]) { unsigned short port = 8000; char *server_ip = "192.168.1.24"; //设置第二个主机ip地址为服务器地址,进行TCP通信 char send_buf[512] = "hello every!"; //设置发送的内容 char recv_buf[512] = ""; int sockfd = 0; int err_log = 0; struct sockaddr_in server_addr; if( argc > 1 ) server_ip = argv[1]; if( argc > 2 ) port = atoi(argv[2]); bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); inet_pton(AF_INET, server_ip, &server_addr.sin_addr); sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) { perror("socket"); exit(-1); } err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(err_log != 0) { perror("connect"); close(sockfd); exit(-1); } send(sockfd, send_buf, strlen(send_buf), 0); recv(sockfd, recv_buf, sizeof(recv_buf), 0); printf("%sn", recv_buf); close(sockfd); return 0; }
服务器端(主机二)代码
TCP_server.c
#include#include #include #include #include #include #include int main(int argc, char *argv[]) { char recv_buf[2048] = ""; int sockfd = 0; int connfd = 0; int err_log = 0; struct sockaddr_in my_addr; unsigned short port = 8000; if(argc > 1) port = atoi(argv[1]); printf("TCP Server Started at port %d!n", port); sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) { perror("socket"); exit(-1); } bzero(&my_addr, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(port); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); printf("Binding server to port %dn", port); err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr)); if( err_log != 0) { perror("binding"); close(sockfd); exit(-1); } err_log = listen(sockfd, 10); if(err_log != 0) { perror("listen"); close(sockfd); exit(-1); } printf("Waiting client...n"); while(1) { size_t recv_len = 0; struct sockaddr_in client_addr; char cli_ip[INET_ADDRSTRLEN] = ""; socklen_t cliaddr_len = sizeof(client_addr); connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len); if(connfd < 0) { perror("accept"); continue; } inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN); printf("client ip = %sn", cli_ip); while((recv_len = recv(connfd, recv_buf, sizeof(recv_buf), 0)) > 0) send(connfd, recv_buf, recv_len, 0); printf("%sn",recv_buf); close(connfd); printf("client closed!n"); } close(sockfd); return 0; }
客户端输入代码
gcc TCP_client.c -o TCP_client ./TCP_clent
服务器端输入代码
gcc TCP_server.c -o TCP_server ./TCP_server三、UDP连接
客户端(主机一)代码
UDP_client.c
#include#include #include #include #include #include #include int main (int argc, char *argv[]) { int sockfd = 0; struct sockaddr_in server_addr; unsigned short port = 8000; char *ser_ip = "192.168.1.24"; if(argc >1) ser_ip = argv[1]; if(argc >2) port = atoi(argv[2]); sockfd = socket (AF_INET, SOCK_DGRAM, 0); if(sockfd < 0) { perror("socket error!"); exit(-1); } bzero (&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); inet_pton(AF_INET, ser_ip,&server_addr.sin_addr); printf("ready send data to UDP server %s:%d!n",ser_ip,port); while (1) { char send_buf[2048] = ""; int len = 0; fgets(send_buf, sizeof(send_buf),stdin); send_buf[strlen(send_buf)-1] =' '; sendto(sockfd, send_buf, strlen(send_buf),0,(struct sockaddr*)&server_addr,sizeof(server_addr)); len = recvfrom(sockfd, send_buf, sizeof(send_buf),0,NULL,NULL); printf("%sn",send_buf); } close(sockfd); return 0; }
服务器端(主机二)代码
UDP_server.c
#include#include #include #include #include #include #include int main(int argc, char *argv[]) { int sockfd = 0; int error_log = 0; struct sockaddr_in bind_addr; unsigned short port = 8000; if (argc > 1) port = atoi(argv[1]); printf("UDP server Started!n"); sockfd = socket(AF_INET, SOCK_DGRAM,0); if (sockfd < 0) { perror("socket error"); exit(-1); } bzero(&bind_addr, sizeof(bind_addr)); bind_addr.sin_family = AF_INET; bind_addr.sin_port = htons(port); bind_addr.sin_addr.s_addr = htonl(INADDR_ANY); printf("Binding server to port %dn", port); error_log = bind(sockfd, (struct sockaddr *)&bind_addr, sizeof(bind_addr)); if (error_log != 0) { perror("bind error"); close(sockfd); exit(-1); } printf("waiting data from other client...n"); while(1) { char recv_buf[1024] = ""; char cli_ip[INET_ADDRSTRLEN] = ""; int recv_len =0; struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); recv_len = recvfrom(sockfd, recv_buf,sizeof(recv_buf), 0 ,(struct sockaddr*)&client_addr,&client_addr_len); inet_ntop(AF_INET, &client_addr.sin_addr,cli_ip,INET_ADDRSTRLEN); printf("clinet ip = %sn", cli_ip); printf("recver message :%sn",recv_buf); sendto(sockfd, recv_buf,recv_len,0,(struct sockaddr*)&client_addr,&client_addr_len); } close(sockfd); return 0; }
客户端输入代码
gcc UDP_client.c -o UDP_client ./UDP_client hello
服务器端输入代码
gcc UDP_server.c -o UDP_server ./UDP_server四、UDP广播
发送端(主机一)代码
send.c
#include#include #include #include #include #include #include #include int main(){ char msg[128] = "I am broadCast message from server!"; struct sockaddr_in saddr, caddr; socklen_t slen, clen; int lfd, ret; lfd = socket(AF_INET, SOCK_DGRAM, 0); if(lfd < 0){ perror("socket create error"); exit(1); } int flag = 1; setsockopt(lfd, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &flag, sizeof(flag) ); caddr.sin_family = AF_INET; caddr.sin_port = htons(4001); caddr.sin_addr.s_addr = inet_addr("192.168.1.255"); clen = sizeof(caddr); int n = sendto(lfd, msg, strlen(msg), 0, (struct sockaddr *)&caddr, clen); if(n < 0){ perror("sendto Error:"); exit(1); } close(lfd); return 0; }
接收端(主机二)代码
recv.c
#include#include #include #include #include #include #include #include #include int main(){ int sockListen; if((sockListen = socket(AF_INET, SOCK_DGRAM, 0)) == -1){ printf("socket failn"); return -1; } int set = 1; setsockopt(sockListen, SOL_SOCKET, SO_REUSEADDR, &set, sizeof(int)); struct sockaddr_in recvAddr; memset(&recvAddr, 0, sizeof(struct sockaddr_in)); recvAddr.sin_family = AF_INET; recvAddr.sin_port = htons(4001); recvAddr.sin_addr.s_addr = INADDR_ANY; if(bind(sockListen, (struct sockaddr *)&recvAddr, sizeof(struct sockaddr)) == -1){ printf("bind failn"); return -1; } int recvbytes; char recvbuf[128]; int addrLen = sizeof(struct sockaddr_in); if((recvbytes = recvfrom(sockListen, recvbuf, 128, 0, (struct sockaddr *)&recvAddr, &addrLen)) != -1){ recvbuf[recvbytes] = ' '; printf("receive a broadCast messgse:%sn", recvbuf); }else{ printf("recvfrom failn"); } close(sockListen); return 0; }
发送端输入代码
gcc send.c -o send ./send
接收端输入代码
gcc recv.c -o recv ./recv



