Linux下socket通信和多线程
服务端socket流程:socket() –> bind() –> listen() –> accept() –> 读取、发送信息(recv,send等)
客户端socket流程:socket() –> connect() –> 发送、读取信息(send,recv等)
参考:Socket基本操作
本文包含基本实现,多线程版本
基本实现
服务端监听某个端口,客户端连接之后发送数据——>客户端断开连接后,服务端也关闭了
服务端:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h> const int Port = ; int main(void){
int sock_fd;
struct sockaddr_in mysock;
struct sockaddr_in client_addr;
int new_fd;
socklen_t sin_size
char buf[];
char sedbuf[] = "recv successfully.\n"; //初始化socket
sock_fd = socket(AF_INET,SOCK_STREAM,); //编辑地址信息
memset(&mysock,,sizeof(mysock));
mysock.sin_family = AF_INET;
mysock.sin_port = htons(Port);
mysock.sin_addr.s_addr = INADDR_ANY; //绑定地址,然后监听
bind(sock_fd,(struct sockaddr *)&mysock,sizeof(struct sockaddr));
if(listen(sock_fd,) < -){
printf("listen error.\n");
} sin_size = sizeof(struct sockaddr_in); printf("listening...\n");
new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &sin_size);//accpet
while(){
int len = recv(new_fd,buf,sizeof(buf),);
fputs(buf,stdout);
send(new_fd, sedbuf, sizeof(sedbuf), );
if(strcmp(buf,"exit\n") == ){
break;
}
memset(buf,,sizeof(buf));
}
close(new_fd);
close(sock_fd);
return ;
客户端:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#include<errno.h> const int Port = ; int main(void){
int sock_fd;
char buf[], sendbuf[], recvbuf[];
struct sockaddr_in server_addr;
sock_fd = socket(AF_INET, SOCK_STREAM, );//初始化socket
if(sock_fd == -){
printf("%s\n",strerror(errno));
return ;
} bzero(&server_addr, sizeof(server_addr));//编辑服务端地址信息
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(Port);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); int tmp = connect(sock_fd, (struct sockaddr *)(&server_addr),
sizeof(struct sockaddr));//连接服务端socket
if(tmp == -){
printf("%s\n",strerror(errno));
return ;
} while(){
fgets(sendbuf, sizeof(sendbuf), stdin);
send(sock_fd, sendbuf, strlen(sendbuf), );
if(strcmp(sendbuf, "exit\n") == )
break;
recv(sock_fd, recvbuf, sizeof(recvbuf), );
fputs(recvbuf, stdout);
memset(sendbuf, , sizeof(sendbuf));
memset(recvbuf, , sizeof(recvbuf));
}
close(sock_fd);
return;
}
多客户端与服务端通信(多线程)
只需在服务端修改,增加多线程,就可以同时接收多个客户端发送的信息了。
服务端:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h> const int Port = ;
pthread_mutex_t g_mutext; struct pthread_data{
struct sockaddr_in client_addr;
int sock_fd;
}; void *serveForClient(void * arg); int main(void){
int sock_fd;
struct sockaddr_in mysock;
struct pthread_data pdata;
pthread_t pt;
socklen_t sin_size = sizeof(struct sockaddr_in);
struct sockaddr_in client_addr;
int new_fd; //初始化socket
sock_fd = socket(AF_INET,SOCK_STREAM,); //编辑地址信息
memset(&mysock, , sizeof(mysock));
mysock.sin_family = AF_INET;
mysock.sin_port = htons(Port);
mysock.sin_addr.s_addr = INADDR_ANY; //绑定地址,然后监听
bind(sock_fd,(struct sockaddr *)&mysock,sizeof(struct sockaddr));
if(listen(sock_fd,) < -){
printf("listen error.\n");
} printf("listening...\n");
while(){
//accpet
new_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &sin_size);
pdata.client_addr = client_addr;
pdata.sock_fd = new_fd;
pthread_create(&pt, NULL, serveForClient, (void *)&pdata);
}
close(new_fd);
close(sock_fd);
return ;
} void *serveForClient(void *arg){
struct pthread_data *pdata = (struct pthread_data*)arg;
int new_fd = pdata->sock_fd;
char recvbuf[];
char sendbuf[] = "recv successfully.\n";
while(){
recv(new_fd, recvbuf, sizeof(recvbuf), );
fputs(recvbuf,stdout);
strcpy(sendbuf, recvbuf);
if(strcmp(recvbuf,"exit\n") == ){
send(new_fd, "connection close.\n", sizeof("connection close.\n"), );
break;
}
send(new_fd, sendbuf, sizeof(sendbuf), );
memset(recvbuf,,sizeof(recvbuf));
}
//close(new_fd);评论中指出多了一次close,所以这里不close了,留待main函数中统一close
pthread_exit();
}
Linux下socket通信和多线程的更多相关文章
- Linux 下socket通信终极指南(附TCP、UDP完整代码)
linux下用socket通信,有TCP.UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种.现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅. ...
- Linux下socket通信和epoll
上一篇博客用多线程实现服务端和多个客户端的通信,但是在实际应用中如果服务端有高并发的需求,多线程并不是一个好选择. 实现高并发的一种方法是IO多路复用,也就是select,poll,epoll等等. ...
- (8)Linux(客户端)和Windows(服务端)下socket通信实例
Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows Client端 #include <st ...
- Linux下进程通信的八种方法
Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...
- linux下socket编程实例
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
- Linux下Socket编程的端口问题( Bind error: Address already in use )
Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...
- linux下串口通信与管理
linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get ...
- UNIX下socket通信 - UDP通信
一.UNIX下socket通信: socket套接字是一种可以进行网络通信的内核对象,它是一个唯一的标示符,一般称它为socket描述符. 注意:UDP通信需要客户端先发送消息,服务端先进行等待客户端 ...
- Linux下socket编程基本知识
本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...
随机推荐
- H - The LCIS on the Tree HDU - 4718
The LCIS on the Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- 《Python黑帽子:黑客与渗透测试编程之道》 扩展Burp代理
下载jython,在Burpsuite的扩展中配置jython路径: Burp模糊测试: #!/usr/bin/python #coding=utf-8 # 导入三个类,其中IBurpExtender ...
- 【BZOJ3625】【codeforces438E】小朋友和二叉树 生成函数+多项式求逆+多项式开根
首先,我们构造一个函数$G(x)$,若存在$k∈C$,则$[x^k]G(x)=1$. 不妨设$F(x)$为最终答案的生成函数,则$[x^n]F(x)$即为权值为$n$的神犇二叉树个数. 不难推导出,$ ...
- OS之内存管理 ---基本的内存管理策略(一)
基本概念 基本硬件 CPU可以直接访问的通用存储只有内存和处理器的内置的寄存器.机器指令可以用内存地址作为参数,而不能用磁盘地址作为参数.所以执行指令以及指令使用的数据,应在这些可执行访问的存储设备上 ...
- 学习微信小程序及知识占及v-if与v-show差别
注意点: 一.接口调用方式: getOpenid: function () { var that = this; return new Promise(function (resolve, rejec ...
- Css权重解析
Css权重解析 关于CSS权重,我们需要一套计算公式来去计算,这个就是 CSS Specificity,我们称为CSS 特性或称非凡性,它是一个衡量CSS值优先级的一个标准 具体规范入如下: spec ...
- pycharm 使用jupyter notebook 报错:'_xsrf' argument missing from POST
出问题的关键点就在: 我用cmd启动的jupyter notebook,然后用pycham新建了一个jupyter notebook 结果 一直报错'_xsrf' argument missing f ...
- Android硬件抽象层(HAL)深入剖析(一)【转】
作为一个搞android驱动或者说搞底层的人,我觉得对于hal那是必须要掌握的,而且必须达到一定深度,于是我总结了一下,将整个自己的分析思路写下来. 主要是看android源代码,根据源代码得到的思路 ...
- sublime text 2+sublimeClang
sublimeClang 是github上面的开源项目,可用于C/C++的自动补全 github:https://github.com/quarnster/SublimeClang 配置sublime ...
- java编程常用的快捷键
Eclipse 常用快捷键 Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1. [ALT+/] 此快捷键为用户 ...