/************************************ 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);
}
}