Linux C 语言 Socket 通信(多对多)多线程实现
生活随笔
收集整理的這篇文章主要介紹了
Linux C 语言 Socket 通信(多对多)多线程实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
效果圖:?
服務端代碼:
#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 1024char 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 bufferbzero(buffer, BUFSIZE);// read data from clientif(recv(*client_socket, buffer, BUFSIZE, 0) > 0){printf("Message from client %d:%s\n",*client_socket, buffer);// global send dataint i;for(i = 0; i < client_len; i ++){if(*client_socket != client_sockets[i])sendMsg(client_sockets[i], *client_socket);}}// is exitif(!strncasecmp(buffer, "quit", 4)){break;}}pthread_exit(NULL); }int main(){// init client_socketsinit_client_sockets();// create socketserver_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// bind ip port to socketstruct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));// use zero fillserver_addr.sin_family = AF_INET;// use IPV4 addressserver_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// ipserver_addr.sin_port = htons(6666); // portbind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));// listenlisten(server_socket, 20);// wait accept clientprintf("accept thread start...\n");while(1){// accept client requeststruct 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_socketsclient_sockets[client_len++] = *client_socket;printf("recv thread start...\n");// create recv threadpthread_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 1024char 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 serverscanf("%s", buffer_send);send(*client_socket, buffer_send, strlen(buffer_send), 0);// is exitif(!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_recvbzero(buffer_recv, BUFSIZE);// read data from clientif(recv(*client_socket, buffer_recv, BUFSIZE, 0) > 0){printf("Message from client %s\n", buffer_recv);}// is exitif(!strncasecmp(buffer_send, "quit", 4)){break;}}pthread_exit(NULL); }int main(){// create socketint client_socket = socket(AF_INET, SOCK_STREAM, 0);// requset serverstruct sockaddr_in server_addr;memset(&server_addr, 0, sizeof(server_addr));// fill zeroserver_addr.sin_family = AF_INET;// use IPV4 addressserver_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// ipserver_addr.sin_port = htons(6666);// portconnect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));// clear buffer_recvbzero(buffer_recv, BUFSIZE); // create send and recv threadpthread_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 overpthread_join(send_thread, NULL);pthread_join(recv_thread, NULL);// closeclose(client_socket);return 0; }困難重重,但是終于實現了!!!但是沒有做退出的功能,后面如果有時間會補上!
總結
以上是生活随笔為你收集整理的Linux C 语言 Socket 通信(多对多)多线程实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ICEM 二维块的拉伸
- 下一篇: eeglab加载显示脑电数据,eegla