一、头文件
#ifndef __HEAD_H__ //防止头文件被重复定义
#define __HEAD_H__ 防止头文件被重复定义#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <poll.h>
#include <semaphore.h>
#include <pthread.h>#endif 防止头文件被重复定义
二、客户端
思路: socket------>connect------>pthread(建立两个线程,一个负责send发送,一个负责recv接收)------>close
使用自己的IP号
#include "head.h"
int init_tcp_cli(char *ip,unsigned short port)
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
perror("fail sockfd");
return -1;
}
struct sockaddr_in ser;
ser.sin_family =AF_INET;
ser.sin_port = htons(port);
ser.sin_addr.s_addr = inet_addr(ip);
int ret = connect(sockfd,(struct sockaddr *)&ser,sizeof(ser));
if (-1 == ret)
{
perror("fail connect");
return -1;
}
return sockfd;
}
void *thread1(void *argc)
{
int sockfd = *(int *)argc;
while(1)
{
char buff[1024] = {0};
fgets(buff,sizeof(buff),stdin);//终端输入
send(sockfd,buff,sizeof(buff),0);
}
}
void *thread2(void *argc)
{
int sockfd = *(int *)argc;
while(1)
{
char buff[1024] = {0};
recv(sockfd,buff,sizeof(buff),0);
printf("ser------cli: %s\n", buff);
}
}
int main(int argc, char const *argv[])
{
int sockfd = init_tcp_cli("192.168.1.148",50000);//使用自己的IP号
pthread_t tidsend;
pthread_t tidresv;
pthread_create(&tidsend,NULL,thread1,&sockfd);//线程1发送
pthread_create(&tidresv,NULL,thread2,&sockfd);//线程2接收
pthread_join(tidsend,NULL);
pthread_join(tidresv,NULL);
close(sockfd);
return 0;
}
三、服务端
思路: socket------>sendto----->pthread(建立两个线程,一个负责发送,一个负责接收)------>close
使用自己的IP号
#include "head.h"
int init_tcp_ser(char *ip ,unsigned short port)
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
perror("fail socket");
return -1;
}
struct sockaddr_in ser;
ser.sin_family = AF_INET;
ser.sin_port = htons(port);
ser.sin_addr.s_addr = inet_addr(ip);
int ret = bind(sockfd,(struct sockaddr *)&ser,sizeof(ser));
if(-1 == ret)
{
perror("fail bind");
return -1;
}
ret = listen(sockfd,10);
if(-1 == ret)
{
perror("fail listen");
return -1;
}
return sockfd;
}
void *thread1(void *arg)
{
int sockfd = *(int *)arg;
char p[1024]={0};
while(1)
{
fgets(p,sizeof(p),stdin);
send(sockfd,p,sizeof(p),0);
}
}
void *thread2(void *arg)
{
int sockfd = *(int *)arg;
while(1)
{
char buff[1024] = {0};
recv(sockfd,buff,sizeof(buff),0);
printf("cli------ser: %s\n", buff);
}
}
int main(int argc, char const *argv[])
{
//socket
//bind
//listen
//accpet------>connfd
//recv
//send
//close
int sockfd = init_tcp_ser("192.168.1.148",50000);
int connfd = accept(sockfd,NULL,NULL);
if(-1 == connfd)
{
perror("fail accept");
return -1;
}
pthread_t tidsend;
pthread_t tidresv;
pthread_create(&tidsend,NULL,thread1,&connfd);//在connfd中
pthread_create(&tidresv,NULL,thread2,&connfd);
pthread_join(tidsend,NULL);
pthread_join(tidresv,NULL);
close(connfd);
close(sockfd);
return 0;
}