Linux Socket多线程通信
Socket通信流程:
多线程版服务端代码:
#include<stdio.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string>
#include<unistd.h>
#include<pthread.h>
//using namespace std;
void* client_process(void* arg) {
int c_fd = *(int*)arg;
int recv_len;
char buf[BUFSIZ];
while ((recv_len=read(c_fd,buf,sizeof(buf)))>0)
{
printf("content:%s\n", buf);
for (int i = 0; i < recv_len; i++) {
buf[i]=toupper(buf[i]);
}
write(c_fd, buf, recv_len);
}
printf("client closed!");
close(c_fd);
return NULL;
}
int main() {
int s_fd = 0, c_fd = 0, err_log = 0;
pthread_t thread_id;
sockaddr_in s_addr, c_addr;
socklen_t len = sizeof(c_addr);
s_addr.sin_family = AF_INET;
s_addr.sin_addr.s_addr = htonl(INADDR_ANY);
s_addr.sin_port = htons(8888);
s_fd = socket(AF_INET, SOCK_STREAM, 0);
err_log = bind(s_fd, (struct sockaddr*)&s_addr, sizeof(s_addr));
if (err_log!=0) {
perror("bind fail!");
close(s_fd);
exit(-1);
}
err_log = listen(s_fd, 100);
if (err_log != 0) {
perror("listen fail!");
close(s_fd);
exit(-1);
}
while (true)
{
c_fd = accept(s_fd, (struct sockaddr*)&c_addr, &len);
if (c_fd < 0) {
perror("accept this time");
}
printf("IP:%s, port:%d", inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port));
if (c_fd > 0) {
pthread_create(&thread_id, NULL, client_process, (void*)&c_fd);
pthread_detach(thread_id);
}
}
return 0;
}