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 ...
随机推荐
- 首次进入页面的时候用js刷新页面
window.onload = function(){ var url=document.location.href; //获取浏览器访问栏里的地址 if( url.indexOf("tim ...
- POJ 1154
#include<iostream> #include<stdio.h> #define MAXN 20 using namespace std; int DFS(int i, ...
- (转)防止人为误操作MySQL数据库技巧一例
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1321061 防止人 ...
- (转)更换镜像rootvg卷组中的硬盘
F85系统镜像盘更换实录之一:删除原有镜像操作 # cfgmgr # lsdev -Cc disk hdisk0 Available 11-09-00-8,0 16 Bit LVD SCSI Dis ...
- InterView之PHP
PHP HTTP Keep-Alive的作用 作用 Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接.Web服务器 ...
- Nodejs学习笔记(六)—Node.js + Express 构建网站预备知识
前言 前面经过五篇Node.js的学习,基本可以开始动手构建一个网站应用了,先用这一篇了解一些构建网站的知识! 主要是些基础的东西... 如何去创建路由规则.如何去提交表单并接收表单项的值.如何去给密 ...
- [笔记] Python字符串
1.字符串是以单引号'或双引号"括起来的任意文本 比如'Mifen',"Amd794",'-956-$*'等等.注意:不能单双引号组合,涉及字符串中存在单双引号出现,应用 ...
- springMVC对于Controller返回值的可选类型
2018-01-11 对于springMVC处理方法支持支持一系列的返回方式: (1)ModelAndView (2)Model (3)ModelMap (4)Map (5)View (6)Stri ...
- 【Xmail】使用Xmail搭建局域网邮件服务器
下载地址: http://www.xmailserver.org/xmail-1.27.win32bin.zip,当前最新版本 1.27. 解压文件:xmail-1.27.win32bin.zip ...
- webbrowser打开新窗口事件+=
测试可用: private void SaveSnapshot_Click(object sender, EventArgs e) { this.webBrowser1.Navigate(txturl ...