server2--client2

/************************************ server2 program ***********************************/ /************************************ server2 program ***********************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <sys/un.h>
#include <pthread.h>

#include <netinet/in.h>
#include <sys/wait.h>

#define SERVPORT 3333 /*服务器监听端口号 */

int sockfd,newfd;
void *read_socket();
void *write_socket();

int main()
{
 int ret;
 pthread_t read_tid,write_tid;
 struct sockaddr_in server_addr;

    sockfd=socket(PF_INET,SOCK_STREAM,0);
 if (sockfd<0)
 {
  printf("调用socket函数建立socket描述符出错!/n");
  exit(1);
 }
 printf("调用socket函数建立socket描述符成功!/n");
 
 memset(&server_addr,0,sizeof(server_addr));
 server_addr.sin_family=AF_INET;
 server_addr.sin_port=htons(SERVPORT);//转换为16字节的网络字节序
 server_addr.sin_addr.s_addr = INADDR_ANY;
 
   
 ret=bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(server_addr));
 if (ret<0)
 {
  printf("调用bind函数绑定套接字与地址出错!/n");
  exit(2);
 }
 printf("调用bind函数绑定套接字与地址成功!/n");

 ret=listen(sockfd,4);
 if (ret<0)
 {
  printf("调用listen函数出错,无法宣告服务器已经可以接受连接!/n");
  exit(3);
 }
 printf("调用listen函数成功,宣告服务器已经可以接受连接请求!/n");

 newfd=accept(sockfd,NULL,NULL);/*newfd连接到调用connect的客户端*/
 if (newfd<0)
 {
  printf("调用accept函数出错,无法接受连接请求,建立连接失败!/n");
  exit(4);
 }
 printf("调用accept函数成功,服务器与客户端建立连接成功!/n");
   
 /************* 服务器端建立两个线程,分别负责从socket读取和发送数据 **************/
 pthread_create(&read_tid,NULL,read_socket,NULL);
 pthread_create(&write_tid,NULL,write_socket,NULL);
 /********************* 令原线程睡眠 ************************/
   
 while(1)
 {
  sleep(10000);
 }
}

/****************** 从socket读取数据 ********************/
void *read_socket()
{
    int recv_num,recv_num_total=0;
    char recv_buf[50];
    while (1)
    {
        recv_num=recv(newfd,recv_buf,26,0);
        if (recv_num<0)
            printf("服务器端:调用recv接收失败!/n");
        else if(recv_num>0)
        {
            recv_num_total+=recv_num;
            printf("服务器端:调用recv接收成功!本次接收到%d个字节,内容为:/"%s/"。共收到%d个字节的数据。/n",recv_num,recv_buf,recv_num_total);
        }
        else/*收到数据为0,表明服务器与客户端的连接已经中断*/
        {
            printf("服务器端:与客户端的连接已中断,当前共收到%d个字节的数据。服务器将再次等待客户端的连接。/n",recv_num_total);
            newfd=accept(sockfd,NULL,NULL);/*当客户端退出后,再次开始接收客户端的连接*/
        }
        sleep(1);
    }
}

/****************** 向socket发送数据 ********************/
void *write_socket()
{
    int send_num,send_num_total=0;
    char send_buf[]="I'm the data from SERVER!";
    while(1)
    {
        send_num=send(newfd,send_buf,sizeof(send_buf),0);
        if (send_num<0)
            printf("服务器端:调用send函数失败!");
        else
        {
            send_num_total+=send_num;
            printf("服务器端:调用send函数成功,本次发送%d个字节,内容为:/"%s/"。目前共发送了%d个字节的数据。/n",send_num,send_buf,send_num_total);
        }
        sleep(2);
    }   
}

 

 

 

 

 

==========================================================

/************************************ client program ***********************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <sys/un.h>
#include <pthread.h>

#include <netinet/in.h>
#include <sys/wait.h>

#define SERVPORT 3333 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */

int sockfd,newfd;
void *read_socket();
void *write_socket();

int main()
{
 int ret;
 pthread_t read_tid,write_tid;
 struct sockaddr_in server_addr;

 sockfd=socket(PF_INET,SOCK_STREAM,0);
     if (sockfd<0)
 {
         printf("调用socket函数建立socket描述符出错!/n");
         exit(1);
 }
 printf("调用socket函数建立socket描述符成功!/n");

 //memset(&server_addr,0,sizeof(server_addr));
 bzero(&server_addr,sizeof(server_addr));// 可以在前面先清0
 server_addr.sin_family=AF_INET;
 server_addr.sin_port=htons(SERVPORT);
 //serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
 server_addr.sin_addr.s_addr = INADDR_ANY;

 ret=connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(server_addr));
 if (ret<0)
 {
  printf("调用connect函数失败,客户端连接服务器失败!/n ");
  exit(2);
 }
     printf("调用connect函数成功,客户端连接服务器成功!/n");
   
 /************* 客户端建立两个线程,分别负责从socket读取和发送数据 **************/
 pthread_create(&read_tid,NULL,read_socket,NULL);
 pthread_create(&write_tid,NULL,write_socket,NULL);
   
 /********************* 令原线程睡眠 ************************/
 while(1)
 {
  sleep(10000);
 }
}
/****************** 从socket读取数据 ********************/
void *read_socket()
{
 int recv_num,recv_num_total=0;
 char recv_buf[50];
 
 while (1)
 {
  recv_num=recv(sockfd,recv_buf,26,0);
  if (recv_num<0)
   printf("客户端:调用recv接收失败!/n");
  else
  {
   recv_num_total+=recv_num;
   printf("客户端:调用recv函数成功,本次接收到%d个字节,内容为:/"%s/"。共收到%d个字节的数据。/n",recv_num,recv_buf,recv_num_total);
  }
  sleep(1);
 }
}

/****************** 向socket发送数据 ********************/
void *write_socket()
{
  int send_num,send_num_total=0;
 char send_buf[]="I'm the data from CLIENT!";
 while(1)
 {
  send_num=send(sockfd,send_buf,sizeof(send_buf),0);
  if (send_num<0)
   printf("客户端:调用send函数失败!");
  else
  {
   send_num_total+=send_num;
   printf("客户端:调用send函数成功,本次发送%d个字节,内容为:/"%s/"。目前共发送了%d个字节的数据。/n",send_num,send_buf,send_num_total);
  }
  sleep(2);
 }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值