日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux C 语言 Socket 通信(多对多)多线程实现

發(fā)布時(shí)間:2023/12/31 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux C 语言 Socket 通信(多对多)多线程实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

效果圖:?

服務(wù)端代碼:

#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; }

困難重重,但是終于實(shí)現(xiàn)了!!!但是沒(méi)有做退出的功能,后面如果有時(shí)間會(huì)補(bǔ)上!

總結(jié)

以上是生活随笔為你收集整理的Linux C 语言 Socket 通信(多对多)多线程实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。