=======================================================================client============================================================================================
养成判断错误的好习惯,为调试做准备

#include "common.h"

int main(int argc, char *argv[])
{

 
 SU myaddr,serveraddr;//定义两个结构,一个用于绑定自己的ip和端口号,一个用于解析服务器的ip和端口号
 int sockfd,ret;
 
 char buf[15]="";//定义一个缓冲区,接收数据
 sockfd = socket(AF_INET,SOCK_STREAM,0);//  服务器端开始建立sockfd描述符 AF_INET:ipv4 SOCK_STREAM : tcp
 if( 0 > sockfd)
 {
  perror("socket");
  exit(-1);
 }
 
 bzero(&serveraddr,sizeof(SU));
 serveraddr.sin_family = AF_INET;
 serveraddr.sin_addr.s_addr  = htonl(INADDR_ANY);//由系统获得本机地址
 serveraddr.sin_port    = htons(1566);//设置本机端口号
 ret=bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr));//给自己注册,ip和端口号
 if( 0 > ret)
 {
  perror("bind");
  exit(-1);
 }
 

 bzero(&myaddr,sizeof(SU));
 myaddr.sin_family= AF_INET;//ipv4
 myaddr.sin_port  = htons(1234);//服务器的端口号
 myaddr.sin_addr.s_addr=htonl(INADDR_ANY);//这个是服务器的IP地址,我这时本机相连,所以由系统自己获得
 //将本机器上的long数据转化为网络上的long数据
 //INADDR_ANY i表示系统自动填充IP
  //server_addr.sin_addr.s_addr=inet_addr("192.168.1.1");这个是服务器的IP地址
 

 ret = connect(sockfd,(struct sockaddr *)&myaddr,sizeof(struct sockaddr));//与服务器建立连接
 while(1)//不断接收
 {

  if(  0 > ret)
  {
   perror("connect");
   exit(-1);
  }  
  
  ret=recv(sockfd,buf,sizeof(buf),0); //倾听来自天堂的声音
  if( 0  > ret)
  {
   perror("recv");
   exit(-1);
  }
  sleep(2);//让效果更明显
  printf("%s\n",buf);
  printf("%d\n",ret);
 }
 close(sockfd);//关闭双向通信,可以使用shutdowm(int sockfd , int howto)由howto的值决定关闭的方式,0,关闭读        //通道,但是还可以继续写数据,1,关闭写通道,只能从套接字读取数据 ,2,关闭读写通道,和close一样
 
}

=======================================================================server============================================================================================

#include"common.h"

 int main()
{

 char buf[]="hello world!";
 SU myaddr,clientaddr;
 int sockfd,newfd;
 
 sockfd = socket(AF_INET,SOCK_STREAM,0);
 if( 0 > sockfd)
 {
  perror("socket");
  exit(-1);
 }
 
 bzero(&myaddr,sizeof(myaddr));
 myaddr.sin_family = AF_INET;
 myaddr.sin_port  = htons(1234);设置端口号
 myaddr.sin_addr.s_addr =htonl(INADDR_ANY);// 服务器本机地址
 
 int ret =bind(sockfd,(struct sockaddr*)&myaddr,sizeof(struct sockaddr));
 if( 0 > ret)
 {
  perror("bind");
  exit(EXIT_FAILURE);
 }

        ret = listen(sockfd,5);//
 if( 0 >  ret)
 {
  perror("listen");
  exit(EXIT_FAILURE);
 }
 int addrlen =sizeof(clientaddr);
 newfd =accept(sockfd,(struct sockaddr *)&clientaddr,&addrlen);//等待并接收客户端的连接请求
 if( 0 > ret)
 {
  perror("accept");
  exit(EXIT_FAILURE); 
 }
 while(1)//不断发送
 {
  printf("%s,%d",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));//将服务器传来的网络地址转化为点乘十进制,将其端口转换为本地端口
  ret = send(newfd,buf,sizeof(buf),0);//发送弦外之音 
  if( 0 > ret)
  {
   perror("send");
   exit(1);
  }
  sleep(2);//让效果更明显
 }
 close(newfd);
 return 0;

=======================================================================common.h============================================================================================

 

#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>//struct sockaddr_in,INADDR_ANY的定义
#define SU struct sockaddr_in
#include <string.h>
#include <netinet/in.h>//htonl
#endif