赞
踩
网络通信方式可选择一台主机里的两个虚拟机,也可以两台主机里的两个虚拟机,本文采用方式二。
主机一IP地址为192.168.1.109
主机二IP地址为192.168.1.24
必须使两台主机在一个网段内,并且可以ping通才可进行以下操作。
客户端(主机一)代码
TCP_client.c
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdlib.h>
- #include <arpa/inet.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- 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("%s\n", recv_buf);
- close(sockfd);
- return 0;
- }
服务器端(主机二)代码
TCP_server.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- 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 %d\n", 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 = %s\n", cli_ip);
-
- while((recv_len = recv(connfd, recv_buf, sizeof(recv_buf), 0)) > 0)
- send(connfd, recv_buf, recv_len, 0);
- printf("%s\n",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_client.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
-
- 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] ='\0';
-
- 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("%s\n",send_buf);
- }
- close(sockfd);
- return 0;
-
- }
服务器端(主机二)代码
UDP_server.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
-
- 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 %d\n", 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 = %s\n", cli_ip);
- printf("recver message :%s\n",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
发送端(主机一)代码
send.c
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <sys/types.h>
- #include <arpa/inet.h>
-
- 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<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- #include<sys/types.h>
- #include<netinet/in.h>
- #include<netdb.h>
- #include<sys/socket.h>
- #include<sys/wait.h>
- #include<arpa/inet.h>
- int main(){
- int sockListen;
- if((sockListen = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
- printf("socket fail\n");
- 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 fail\n");
- 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] = '\0';
- printf("receive a broadCast messgse:%s\n", recvbuf);
- }else{
- printf("recvfrom fail\n");
- }
- close(sockListen);
- return 0;
- }
发送端输入代码
- gcc send.c -o send
- ./send
接收端输入代码
- gcc recv.c -o recv
- ./recv
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。