day11
|#include <stdio.h>
include <string.h>
include <sys/types.h>
include <sys/socket.h>
include <netinet/in.h>
include <arpa/inet.h>
include <netinet/ip.h>
include <unistd.h>
include <sys/wait.h>
include <stdlib.h>
include <pthread.h>
define PORT 8080
define IP "192.168.11.100"
typedef struct sockaddr SA;
typedef struct sockaddr_in SIN;
int len=sizeof(SIN);
/*
服务端和客户端之间正常通信
客户端
*/
void *cli_send(void *arg)
{
long temp=(long)arg;
int fd=(int)temp;
char buf[100]={0};
while(1)
{
memset(buf,0,100);//读取终端数据之前清空buf内容
read(0,buf,100);//读取终端信息
send(fd, buf, strlen(buf), 0);//发送信息到服务器
if(strncmp("quit",buf,4) == 0)//判断是否退出连接
{
break;
}
}
pthread_exit(NULL);//回收线程资源,不返回数据
}
void *cli_recv(void *arg)
{
long temp=(long)arg;
int fd=(int)temp;
char buf[100]={0};
while(1)
{
memset(buf,0,100);//接受之前清空buf
recv(fd, buf, 100, 0);//接受服务端的信息
printf("receive:%s\r\n",buf);//输出到终端
if(strncmp("quit",buf,4) == 0)
{
break;
}
}
pthread_exit(NULL);//回收线程资源
}
int main(int argc,char *argv[])
{
//1、创建socket套接字文件 socket()
int sockfd=socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1)
{
perror("socket create fai;ure\r\n");
return 0;
}
//2、创建结构体变量,初始化信息 struct socksddr端口号和IP写在一起 struct socksddr_in
SIN cli_addr;
cli_addr.sin_family=AF_INET;
cli_addr.sin_port=htons(PORT);
cli_addr.sin_addr.s_addr=inet_addr(IP);
//3、主动申请连接服务器connect()
if(connect(sockfd, (SA *)&cli_addr,len) == -1)
{
perror("connect failure\r\n");
return 0;
}
printf("连接成功!!!\r\n");
//创建两个线程函数,分别用来发送信息和接受信息
long temp=(long)sockfd;//转换类型,防止数据丢失,避免不能传送
pthread_t tid[2]={0};
pthread_create(&tid[0], NULL,cli_send, (void *)temp);
pthread_create(&tid[1], NULL,cli_recv, (void *)temp);
pthread_join(tid[0], NULL);//不希望往下走,这是阻塞等待
pthread_join(tid[1], NULL);
//关闭文件
close(sockfd);
return 0;
} |