两台Linux虚拟机socket通信(Version 1.0)

此篇博客展示了如何使用C语言实现TCP/IP通信,客户端每秒生成一个随机数并发送给服务器,服务器接收到数据后打印到终端。程序可用于PC和ARM开发板之间的数据交换,涉及socket编程、bind、listen、accept及send、recv等关键函数。
摘要由CSDN通过智能技术生成

下面的两个程序实现了这样的功能: 客户端每1s产生一个随机数, 之后将产生的随机数转为字符串类型, 发送至服务端; 服务端在接收到数据后通过printf()函数将这个随机数显示到终端. 这个程序的思路可用于PC机和ARM开发板间的数据通信.

// server.c 服务端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h> 
#define SERVPORT 3333
#define BACKLOG 10
int main()
{	
    int sockfd,client_fd;
    int recvbytes;
    int sin_size;
    char buf[50];
    struct sockaddr_in my_addr;    
    struct sockaddr_in remote_addr; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0);//建立socket --
    my_addr.sin_family=AF_INET;//AF_INET地址族
    my_addr.sin_port=htons(SERVPORT);//设定端口号(host -> networks)
    my_addr.sin_addr.s_addr = INADDR_ANY;//32位IPv4地址
    bzero(&(my_addr.sin_zero),8); //置前8个字节为0
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) 
     {
  	  perror("bind 出错!");		
	  exit(1);	
     }
    if (listen(sockfd, BACKLOG) == -1) //监听socket连接,设置队列中最多拥有连接个数为10  --
     {	
	  perror("listen 出错!");	
        exit(1);     
     }
    while(1)
     {
	  sin_size = sizeof(struct sockaddr_in);//记录sockaddr_in结构体所占字节数
	  if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) //accept()缺省是阻塞函数,阻塞到有连接请求为止 --
          {	
	      perror("accept error");		
	      continue;		
	  }
	  printf("收到一个连接来自: %s\n", inet_ntoa(remote_addr.sin_addr));
	  if (!fork()) 
          { 
		if (send(client_fd, "连接上了 \n", 26, 0) == -1) //--		
		    perror("send 出错!");	  
		//receive pieces of message from host
		while(1)
		{
		    recvbytes = recv(client_fd, buf, 50, 0);
		    buf[recvbytes] = '\0';
		    if(recvbytes == 0)//indicating that the client has been off
		    {
			printf("connection to %s closed.\n",inet_ntoa(remote_addr.sin_addr));
			break;
		    }
		    printf("%s\n", buf);
		    sleep(1);
		}
		
            close(client_fd);	
            exit(0);		
          }
	  close(client_fd);
     }
} 
// client.c 客户端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <time.h>
#define SERVPORT 3333
#define MAXDATASIZE 100
int random_number()//generating a random number
{
    int a;
    srand((unsigned)time(NULL));
    a = rand();
    return a;
}
int main(int argc, char *argv[])
{
    int sockfd, recvbytes;
    int value = 0;
    char buf[MAXDATASIZE];
    struct hostent *host;
    struct sockaddr_in serv_addr;
    if(argc < 2) 
     {
	  fprintf(stderr,"Please enter the server's hostname!\n");
	  exit(1);	
     }
    if((host=gethostbyname(argv[1]))==NULL)
     {
	  herror("gethostbyname error!");	
	  exit(1);	
     }
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)//建立socket --
     { 
	  perror("socket create error!");	
	  exit(1);	
     }
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(SERVPORT);
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero),8);
    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1) //请求连接 --
     {
	  perror("connect error!");
	  exit(1);
     }
    //successful connection
    if((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)//接收数据 --
     {
	  perror("connect 出错!");
	  exit(1);
     }
    buf[recvbytes] = '\0';
    printf("收到: %s",buf);
    //send pieces of message to server
    while(1)
    {
	//generating a random number and sending it to the host
	value = random_number();
        sprintf(buf, "%d", value);//int to string
        send(sockfd, buf, (int)strlen(buf), 0);
	//every one second client sends a random number converted to string to host
	sleep(1);
    }
    close(sockfd);//关闭连接 --
}

server端等待连接.
在这里插入图片描述
client端请求连接并发送数据至server端.
在这里插入图片描述
server端收到数据并显示到终端.
在这里插入图片描述
在client端结束连接.
在这里插入图片描述
server端提示该client端连接结束, 并继续等待新的连接请求.
在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值