效果图:?
服务端代码:
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define BUFSIZE 1024
char buffer[BUFSIZE] = {0};
int client_sockets[10];
int client_len = 0;
int server_socket;
// init client_sockets
void init_client_sockets(){
memset(client_sockets, 0, sizeof(client_sockets[0]) * 10);
}
// send data to client
void sendMsg(int client_socket, int from_socket){
int len = strlen(buffer);
int i = len;
while(i > 0){
buffer[i + 1] = buffer[i - 1];
i --;
}
buffer[len + 2] = 0;
buffer[0] = from_socket + '0';
buffer[1] = ':';
send(client_socket, buffer, strlen(buffer), 0);
}
// recv from client
void * recvMsg(void *socket){
int * client_socket = (int *)socket;
while(1){
// clear buffer
bzero(buffer, BUFSIZE);
// read data from client
if(recv(*client_socket, buffer, BUFSIZE, 0) > 0){
printf("Message from client %d:%s\n",*client_socket, buffer);
// global send data
int i;
for(i = 0; i < client_len; i ++){
if(*client_socket != client_sockets[i])
sendMsg(client_sockets[i], *client_socket);
}
}
// is exit
if(!strncasecmp(buffer, "quit", 4)){
break;
}
}
pthread_exit(NULL);
}
int main(){
// init client_sockets
init_client_sockets();
// create socket
server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// bind ip port to socket
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));// use zero fill
server_addr.sin_family = AF_INET;// use IPV4 address
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// ip
server_addr.sin_port = htons(6666); // port
bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
// listen
listen(server_socket, 20);
// wait accept client
printf("accept thread start...\n");
while(1){
// accept client request
struct sockaddr_in client_addr;
socklen_t client_addr_size = sizeof(client_addr);
int* client_socket = (int *)malloc(sizeof(int));
*client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_size);
// apend client_socket to client_sockets
client_sockets[client_len++] = *client_socket;
printf("recv thread start...\n");
// create recv thread
pthread_t recv_thread;
pthread_create(&recv_thread, NULL, recvMsg,(void *)client_socket);
}
return 0;
}
客户端代码:?
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUFSIZE 1024
char buffer_send[BUFSIZE] = {0};
char buffer_recv[BUFSIZE] = {0};
// send to server
void * sendMsg(void *socket){
int * client_socket = (int *)socket;
while(1){
// send data to server
scanf("%s", buffer_send);
send(*client_socket, buffer_send, strlen(buffer_send), 0);
// is exit
if(!strncasecmp(buffer_send, "quit", 4)){
break;
}
}
pthread_exit(NULL);
}
// recv from server
void * recvMsg(void *socket){
int * client_socket = (int *)socket;
while(1){
// clear buffer_recv
bzero(buffer_recv, BUFSIZE);
// read data from client
if(recv(*client_socket, buffer_recv, BUFSIZE, 0) > 0){
printf("Message from client %s\n", buffer_recv);
}
// is exit
if(!strncasecmp(buffer_send, "quit", 4)){
break;
}
}
pthread_exit(NULL);
}
int main(){
// create socket
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
// requset server
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));// fill zero
server_addr.sin_family = AF_INET;// use IPV4 address
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// ip
server_addr.sin_port = htons(6666);// port
connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
// clear buffer_recv
bzero(buffer_recv, BUFSIZE);
// create send and recv thread
pthread_t send_thread, recv_thread;
pthread_create(&send_thread, NULL, sendMsg, (void *)&client_socket);
pthread_create(&recv_thread, NULL, recvMsg, (void *)&client_socket);
// wait send and recv thread over
pthread_join(send_thread, NULL);
pthread_join(recv_thread, NULL);
// close
close(client_socket);
return 0;
}
困难重重,但是终于实现了!!!但是没有做退出的功能,后面如果有时间会补上!