服务端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通信和多线程的更多相关文章

  1. Linux 下socket通信终极指南(附TCP、UDP完整代码)

    linux下用socket通信,有TCP.UDP两种协议,网上的很多教程把两个混在了一起,或者只讲其中一种.现在我把自己这两天研究的成果汇总下来,写了一个完整的,适合初学者参考,也方便自己以后查阅. ...

  2. Linux下socket通信和epoll

    上一篇博客用多线程实现服务端和多个客户端的通信,但是在实际应用中如果服务端有高并发的需求,多线程并不是一个好选择. 实现高并发的一种方法是IO多路复用,也就是select,poll,epoll等等. ...

  3. (8)Linux(客户端)和Windows(服务端)下socket通信实例

    Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows   Client端 #include <st ...

  4. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  5. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  6. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  7. linux下串口通信与管理

    linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get ...

  8. UNIX下socket通信 - UDP通信

    一.UNIX下socket通信: socket套接字是一种可以进行网络通信的内核对象,它是一个唯一的标示符,一般称它为socket描述符. 注意:UDP通信需要客户端先发送消息,服务端先进行等待客户端 ...

  9. Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...

随机推荐

  1. Day 13 迭代器,生成器.

    一.迭代器 可以进行for循环的 数据类型 str ,list tuple dict set 文件句柄 什么是可迭代对象? 方法一:dir(被测对象) 如果他含有__iter__,那这个对象就叫做可迭 ...

  2. django orm 以列表作为筛选条件进行查询

    在Django的orm中进行查询操作时,可以通过传入列表,列表内的元素为索引值,作为一个筛选条件来进行行查询 from .models import UserInfo user_obj = UserI ...

  3. webpack快速入门——CSS中的图片处理

    1.首先在网上随便找一张图片,在src下新建images文件夹,将图片放在文件夹内 2.在index.html中写入代码:<div id="pic"></div& ...

  4. LINUX中如何查看某个端口是否被占用

    之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下: 1.netstat  -anp  |grep   端口号 如下,我以3306为例,netstat  -anp  |grep   ...

  5. ajax获取json数据及实现跨域请求

    最近想练习一下ajax获取json数据 , 首先上网找一些在线的可用来测试的接口. -----------------------------------------------------这里是接口 ...

  6. 2019年北航OO第一次博客总结

    一.基于度量对程序结构的分析 1. 第一次作业 1.1 基于类的分析的度量 首先,基于类的属性个数,方法个数,每个方法的规模,每个方法的控制分支数目,类总代码规模等特征对本次作业的结构进行分析. 1. ...

  7. 数据结构---平衡查找树之B树和B+树(转)

    本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...

  8. 从您的帐户中删除 App 及 iTunes Connect 开发人员帮助

    iTunes Connect 开发人员帮助 从您的帐户中删除 App 删除您不想继续销售或提供下载,且不会再重新使用其名称的 App.如果您的 App 至少有一个获准的版本,且最新版本处于下列状态之一 ...

  9. UIDevice currentDevice model possible values

    NOTE: The below code may not contain all device's string, I'm with other guys are maintaining the sa ...

  10. Docker容器(三)

    一.创建容器 容器是Docker另一个核心的概念,简单来说,容器是镜像的一个运行实例,所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层 1.1. 新建容器 使用docker crea ...