服务端

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <ctype.h>
#define PORT 9999//端口号 
#define MAX 5//最大监听数
 
int main(){
	//sockfd服务器 文件描述符 
	//cfd 和客户端建立连接后的文件描述符 
	int sockfd,cfd,i;
	//服务器地址 
	struct sockaddr_in my_addr;
	//客户端地址 
	struct sockaddr_in their_addr;

	int sin_size;  
 	//AF_INET:IPV4 ,SOCK_STREAM 流式 默认tcp,0代表默认的,流式tcp报式udp 
	sockfd=socket(AF_INET,SOCK_STREAM,0);//建立socket 
	
	my_addr.sin_family=AF_INET;/*该属性表示接收本机或其他机器传输*/
	my_addr.sin_port=htons(PORT);/*端口号,本地字节序转网络字节序,防止大小端不同问题*/
	my_addr.sin_addr.s_addr=htonl(INADDR_ANY);/*IP,括号内容在这里表示本机IP*/
	bzero(&(my_addr.sin_zero),8);/*将其他属性置0*/

	bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr));
    listen(sockfd,MAX);//开启监听 ,第二个参数是最大监听数 
    	
    sin_size=sizeof(struct sockaddr_in);
   	cfd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);//阻塞在此,直到有客户端连接 
   	//不停接收消息并转发回去 
    while(1){
    	char recv_buf[512] = "";
		int rs=read(cfd,recv_buf,sizeof(recv_buf));
		printf("server receive:%s\n",recv_buf);
		for (i = 0; i < rs; i++)
            recv_buf[i] = toupper(recv_buf[i]);//转大写 
    	write(cfd,recv_buf,rs);
    }	
	return 0;
} 

客户端

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h> 
#define DEST_PORT 9999//目标地址端口号 
#define DEST_IP "127.32.255.2"/*目标地址IP,这里设为本机,不一定非得是127.0.0.1,只要127开头并且不是127.0.0.0和127.255.255.255即可*/ 
#define MAX_DATA 100//接收到的数据最大程度 
 
int main(){
	int sockfd;
	struct sockaddr_in dest_addr;
	char buf[MAX_DATA];
 
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	
	dest_addr.sin_family=AF_INET;
 	dest_addr.sin_port=htons(DEST_PORT);
	dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);
	bzero(&(dest_addr.sin_zero),8);
	connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr));

	printf("connect success");
	while(1){
		char send_buf[512] = "";
		scanf("%s",&send_buf);
		write(sockfd,send_buf,sizeof(send_buf));
		
		read(sockfd,send_buf,sizeof(send_buf));
    	printf("client receive:%s\n",send_buf);
	}

	return 0;
} 

centos执行
gcc -o server.out server.c
gcc -o client.out client.c
得到执行文件server.out,client.out
用xshell 对一个虚拟机开两个item窗口,一个执行./server.out ,另一个执行./client.out