1、UDP实现
服务器端:
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include<pthread.h>
typedef struct sockaddr *(SA);
//th函数是一个线程函数,负责持续接收来自客户端的消息
void* th(void* arg)
{
int fd=*(int*)arg;
char buf[512];
while (1)
{
recvfrom(fd, buf, sizeof(buf), 0, NULL,NULL);
if(strcmp(buf, "#quit")==0)
{
printf("client has left\n");
exit(0);
}
printf("Me:%s\n",buf);
}
return NULL;
}
int main()
{
//1创建UDP套接字
int udpfd=socket(AF_INET, SOCK_DGRAM, 0);
if(-1==udpfd)
{
perror("socket");
return 1;
}
//2设置服务器地址
struct sockaddr_in ser,cli;
bzero(&ser, sizeof(ser));
bzero(&cli, sizeof(cli));
ser.sin_family=AF_INET;
ser.sin_port=htons(50000);
ser.sin_addr.s_addr=inet_addr("192.168.31.86");
//3绑定套接字
int ret=bind(udpfd, (SA)&ser, sizeof(ser));
if(-1==ret)
{
perror("bind");
return 1;
}
//4等待客户端连接
char buf[512];
socklen_t len=sizeof(cli);
recvfrom(udpfd, buf, sizeof(buf), 0, (SA)&cli, &len);
//5创建接收线程
pthread_t tid;
pthread_create(&tid,NULL,th,&udpfd);
//6主线程循环发送消息给客户端
printf("You:");
while (1)
{
fgets(buf, sizeof(buf), stdin);
sendto(udpfd, buf, sizeof(buf), 0, (SA)&cli, len);
if(0==strcmp("#quit", buf))
{
exit(0);
}
printf("You:");
}
//清理工作
pthread_join(tid1, NULL);
close(udpfd);
return 0;
}
客户端:
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include<pthread.h>
typedef struct sockaddr *(SA);
//th函数是一个线程函数,负责持续接收来自服务器的消息
void* th1(void* arg)
{
int fd=*(int*)arg;
while (1)
{
char buf[128]={0};
recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
if(strcmp(buf, "#quit")==0)
{
printf("server has left\n");
exit(0);
}
printf("You:%s\n",buf);
}
return NULL;
}
int main()
{
//1创建UDP套接字
int udpfd=socket(AF_INET, SOCK_DGRAM, 0);
if(-1==udpfd)
{
perror("socket");
return 1;
}
//2设置服务器地址
struct sockaddr_in ser;
bzero(&ser, sizeof(ser));
ser.sin_family=AF_INET;
ser.sin_port=htons(50000);
ser.sin_addr.s_addr=inet_addr("192.168.31.86");
//3发送消息建立初始链接
char buf[512]="start";
sendto(udpfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));
//4创建接收线程
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,th1,&udpfd);
//5主线程循环发送消息到服务器
printf("You:");
while (1)
{
char buf[512];
fgets(buf, sizeof(buf), stdin);
sendto(udpfd, buf, sizeof(buf), 0, (SA)&ser, sizeof(ser));
if(0==strcmp("#quit", buf))
{
exit(0);
}
printf("You:");
}
//清理工作
pthread_join(tid1, NULL);
close(udpfd);
return 0;
}
2、TCP实现
服务器端:
#include<netinet/in.h>
#include<netinet/ip.h>
#include <pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <strings.h>
#include<sys/socket.h>
#include<sys/types.h>
#include <thread_db.h>
#include<time.h>
#include<unistd.h>
typedef struct sockaddr*(SA);
//th函数是一个线程函数,负责持续接收来自客户端的消息
void *th(void *arg)
{
int fd=*(int*)arg;
char buf[512];
while (1)
{
recv(fd, buf, sizeof(buf), 0);
if(strcmp("#quit\n",buf)==0)
{
exit(0);
}
printf("You:%s",buf);
}
return NULL;
}
int main()
{
//1创建TCP监听套接字
int listfd=socket(AF_INET, SOCK_STREAM, 0);
if(-1==listfd)
{
perror("socket");
return 1;
}
//2设置服务器地址
struct sockaddr_in ser,cli;
bzero(&ser, sizeof(ser));
bzero(&cli, sizeof(cli));
ser.sin_family=AF_INET;
ser.sin_port=htons(50000);
ser.sin_addr.s_addr=INADDR_ANY;
//3绑定套接字
int ret=bind(listfd, (SA)&ser, sizeof(ser));
if(-1==ret)
{
perror("bind");
return -1;
}
//4开始监听
listen(listfd, 3);//3代表同一时间可以与服务器建立连接的排队数
//5接受客户端连接
socklen_t len=sizeof(cli);
int conn=accept(listfd, (SA)&cli, &len);
if(-1==conn)
{
perror("conn");
return -1;
}
//6接收初始消息建立连接
char buf[512];
recv(conn, buf, strlen(buf), 0);
//7创建接收线程
pthread_t tid;
pthread_create(&tid, NULL, th, &conn);
//8主线程循环发送消息到客户端
while (1)
{
printf("You:");
fgets(buf, sizeof(buf), stdin);
// buf[strlen(buf)-1]='\0';
send(conn, buf, strlen(buf), 0);
if(0==strcmp("#quit\n", buf))
{
exit(0);
}
}
//清理工作
pthread_join(tid, NULL);
close(listfd);
close(conn);
return 0;
}
客户端:
#include <arpa/inet.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <strings.h>
#include<sys/socket.h>
#include<sys/types.h>
#include <thread_db.h>
#include<time.h>
#include<unistd.h>
#include<pthread.h>
typedef struct sockaddr*(SA);
//th函数是一个线程函数,负责持续接收来自服务器的消息
void *th(void *arg)
{
int fd=*(int*)arg;
while (1)
{
char buf[128]={0};
recv(fd, buf, sizeof(buf), 0);
if(strcmp("#quit\n",buf)==0)
{
exit(0);
}
printf("You:%s",buf);
}
return NULL;
}
int main()
{
//1创建TCP套接字
int conn=socket(AF_INET, SOCK_STREAM, 0);
if(-1==conn)
{
perror("socket");
return 1;
}
//2设置服务器地址
struct sockaddr_in ser;
bzero(&ser, sizeof(ser));
ser.sin_family=AF_INET;
ser.sin_port=htons(50000);
ser.sin_addr.s_addr=inet_addr("192.168.31.86");
//3连接服务器
int ret=connect(conn, (SA)&ser, sizeof(ser));
if(-1==ret)
{
perror("connect");
return 1;
}
//4发送初始消息建立连接
char buf[512]="start";
send(conn, buf, strlen(buf), 0);
//5创建接收线程
pthread_t tid;
pthread_create(&tid, NULL, th, &conn);
//6主线程循环发送消息到服务器
while (1)
{
printf("You:");
char buf[512];
fgets(buf, sizeof(buf), stdin);
// buf[strlen(buf)-1]='\0';
send(conn, buf, strlen(buf), 0);
if(0==strcmp("#quit\n", buf))
{
exit(0);
}
}
//清理工作
pthread_join(tid, NULL);
close(conn);
return 0;
}