//网络编程--客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <arpa/inet.h>/*强调:当客户端连接服务器时,服务器会产生一个新的文件描述符(套接字)与客户端交互,这个新的套接字不是服务器端的监听套接字套接字是全双工的,在一个网络管道中的两端,每端都可以进行读写操作。*/typedef struct _recvmodel
{int st;struct sockaddr_in * addr;
} RecvModel;//send message
void * send_thread(void *arg)
{if (arg == NULL){printf("param is not allow NULL!\n");return NULL;}int st = *(int *) arg;char buf[1024] = { 0 };while (1){read(STDIN_FILENO, buf, sizeof(buf));if (send(st, buf, strlen(buf), 0) == -1){printf("send failed ! error message %s\n", strerror(errno));return NULL;}memset(buf, 0, sizeof(buf));}return NULL;
}//recv message
void * recv_thread(void * arg)
{if (arg == NULL){printf("param is not allow NULL!\n");return NULL;}RecvModel * model = (RecvModel *) arg;int flag = 0;char buf[1024] = { 0 };while (1){flag = recv(model->st, buf, sizeof(buf), 0);if (flag == 0){printf("对方已经关闭连接!\n");return NULL;} else if (flag == -1){printf("recv failed ! error message : %s\n", strerror(errno));return NULL;}printf("from %s:%s", inet_ntoa(model->addr->sin_addr), buf);memset(buf, 0, sizeof(buf));}return NULL;
}int main(int arg, char *args[])
{//打开socketint st = socket(AF_INET, SOCK_STREAM, 0);if (st == -1){printf("open socket failed! error message:%s\n", strerror(errno));return -1;}//定义IP地址结构struct sockaddr_in addr;memset(&addr, 0, sizeof(addr));//设置TCP/IP连接addr.sin_family=AF_INET;//设置端口号addr.sin_port = htons(8080);//设置允许连接地址addr.sin_addr.s_addr = inet_addr("192.168.1.102");//connect serverint numx = connect(st, (struct sockaddr *) &addr, sizeof(addr));if (numx == -1){printf("connect server failed ! error message :%s\n", strerror(errno));goto END;}RecvModel model;model.st = st;model.addr = &addr;//开启多线程--线程1接收消息,线程2发送消息
    pthread_t thr1, thr2;if (pthread_create(&thr1, NULL, send_thread, &st) != 0){printf("create thread failed ! \n");goto END;}if (pthread_create(&thr2, NULL, recv_thread, &model) != 0){printf("create thread failed ! \n");goto END;}pthread_join(thr1, NULL);pthread_join(thr2, NULL);END: close(st);return 0;
}

//网络编程--服务端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <arpa/inet.h>typedef struct _recvmodel
{int st;struct sockaddr_in * addr;
} RecvModel;//send message
void * send_thread(void *arg)
{if (arg == NULL){printf("param is not allow NULL!\n");return NULL;}int st = *(int *) arg;char buf[1024] = { 0 };while (1){read(STDIN_FILENO, buf, sizeof(buf));if (send(st, buf, strlen(buf), 0) == -1){printf("send failed ! error message %s\n", strerror(errno));return NULL;}memset(buf, 0, sizeof(buf));}return NULL;
}//recv message
void * recv_thread(void * arg)
{if (arg == NULL){printf("param is not allow NULL!\n");return NULL;}RecvModel * model = (RecvModel *) arg;int flag = 0;char buf[1024] = { 0 };while (1){flag = recv(model->st, buf, sizeof(buf), 0);if (flag == 0){printf("对方已经关闭连接!\n");return NULL;} else if (flag == -1){printf("recv failed ! error message : %s\n", strerror(errno));return NULL;}printf("from %s:%s", inet_ntoa(model->addr->sin_addr), buf);memset(buf, 0, sizeof(buf));}return NULL;
}int main(int arg, char *args[])
{//short port = atoi(args[1]);//打开socketint st = socket(AF_INET, SOCK_STREAM, 0);if (st == -1){printf("open socket failed! error message:%s\n", strerror(errno));return -1;}//设置系统地址可重用int on = 1;if (setsockopt(st, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1){printf("setsockpot failed ! error message %s\n", strerror(errno));goto END;}//定义IP地址结构struct sockaddr_in addr;memset(&addr, 0, sizeof(addr));//设置TCP/IP连接addr.sin_family = AF_INET;//设置端口号addr.sin_port = htons(8080);//设置允许连接地址addr.sin_addr.s_addr = htonl(INADDR_ANY);//bind ipif (bind(st, (struct sockaddr *) &addr, sizeof(addr)) == -1){printf("bind ip failed ! error message :%s\n", strerror(errno));goto END;}//监听连接if (listen(st, 20) == -1){printf("listen failed ! error message :%s\n", strerror(errno));goto END;}//接收客户端连接(阻塞)struct sockaddr_in client_addr;memset(&client_addr, 0, sizeof(client_addr));socklen_t client_addrlen = sizeof(client_addr);    //强调:这里的client_addrlen并不是为了在函数中设置client_addrlen的值,而是通过client_addrlen的值来判断client_addr是一个什么类型的结构,    //所以这里client_addrlen设置为0是错误的,必须是struct sockaddr_in这个结构的大小,不然返回值不正确int client_st = accept(st, (struct sockaddr *) &client_addr,&client_addrlen);if (client_st == -1){printf("accept failed ! error message :%s\n", strerror(errno));goto END;}RecvModel model;model.st = client_st;model.addr = &client_addr;printf("accept by=%s\n",inet_ntoa(client_addr.sin_addr));//开启多线程--线程1接收消息,线程2发送消息
    pthread_t thr1, thr2;if (pthread_create(&thr1, NULL, send_thread, &client_st) != 0){printf("create thread failed ! \n");goto END;}if (pthread_create(&thr2, NULL, recv_thread, &model) != 0){printf("create thread failed ! \n");goto END;}pthread_join(thr1, NULL);pthread_join(thr2, NULL);//关闭客户端管道
    close(client_st);END: close(st);return 0;
}

.SUFFIXES:.c .o
CC=gcc
SRCS1=mserver.c
SRCS2=mclient.c
OBJS1=$(SRCS1:.c=.o)
OBJS2=$(SRCS2:.c=.o)
EXEC1=mserv
EXEC2=mclistart:$(OBJS1) $(OBJS2)$(CC) -o $(EXEC1) $(OBJS1) -lpthread$(CC) -o $(EXEC2) $(OBJS2) -lpthread@echo "^_^ ------ OK ------ ^_^"
.c.o:$(CC) -Wall -g -o $@ -c $<
clean:rm -f $(OBJS1)rm -f $(OBJS2)rm -f $(EXEC1)rm -f $(EXEC2)

小结:这段升级版程序花费3小时,出现一个错误提示:" Transport endpoint is not connected",我仔细查找资料,网上说是socket套接字不对,可我程序中套接字是正确的,我没有办法,但是我有一个成功的程序,就是第一版socket程序,我将原来的socket程序复制到我的新程序中,一句句替换,终于发现这个问题问题:我缺少addr.sin_family = AF_INET;//将网络地址类型设置为TCP/IP协议;这句代码。缺少这段代码是导致报错的主要原因。另外注意我代码中强调的内容--网络管道是全双工的

转载于:https://www.cnblogs.com/zhanggaofeng/p/5877617.html

Linux 网络编程四(socket多线程升级版)相关推荐

  1. C++笔记--Linux网络编程(15-0)-socket(供自查,文档说明)

    目录 网络基础 协议的概念 什么是协议 典型协议 网络应用程序设计模式 C/S模式 B/S模式 优缺点 分层模型 OSI七层模型 TCP/IP四层模型 通信过程 协议格式 数据包封装 以太网帧格式 A ...

  2. Linux网络编程2——socket编程

    学习视频链接 黑马程序员-Linux网络编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1iJ411S7UA?p=17 目录 一.网络套接字(英文so ...

  3. linux网络编程、socket编程

    进程间通信: 特点:依赖于内核,造成缺陷--无法实现多机通信. 网络: 地址:由IP地址(IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物 ...

  4. linux网络编程Internet Socket地址,套接字,和函数

    文章内容节选<linux/UNIX 系统网络编程> Internet domain socket地址有两种:IPv4 IPv6 IPv4被存储在结构体中, 该结构体在 netinet/in ...

  5. Linux 网络编程基础-socket

    标题文章目录 Linux 网络基础 分层模型结构: C/S 模型:client-server B/S模型:browser-server 以太网帧和ARP协议 IP 协议 UDP 协议 TCP 协议 网 ...

  6. Linux网络编程【socket编程】

    网络套接字:socket 在通信过程中,套接字一定是成对出现(listen监听除外) Linux内核实现套接字通信: 一个文件描述符,两个缓冲区 一个文件描述符指向一个套接字(该套接字内部由内核借助两 ...

  7. Linux网络编程基础及多线程并发案例

    目录 1.ip:端口  TCP/IP协议 2.socket 头文件  sys/socket.h 3.字节序 4.ip地址转换函数 5.sockaddr和sockaddr_in 6.服务器端基本函数 b ...

  8. linux网络编程之用多线程实现客户端到服务端的通信(基于udp)

    1.开启一个线程接受数据,主线程发送数据的代码 #include <unistd.h> #include <stdio.h> #include <stdlib.h> ...

  9. Linux网络编程篇之ICMP协议分析及ping程序实现

    Linux网络编程系列: Linux网络编程篇之Socket编程预备知识 Linux网络编程篇之TCP协议分析及聊天室功能实现 如果对Linux网络编程,对socket通信不是太清楚的同学,强烈推荐看 ...

最新文章

  1. RGB-D对红外热像仪和毫米波雷达标定
  2. 纳米孔测序高错误区域恢复率高达99%,肖传乐/刘奕志/王建新等在Nature子刊发表新校正组装算法
  3. Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)【Dalston版】
  4. maven 报错一站式解决方案
  5. BZOJ 1020 安全的航线flight
  6. MySQL数据库的常用命令语句记录——安全用户语句及函数
  7. Ansys Maxwell三相变压器制作方法教程
  8. 算法的稳定性matlab,基于MATLAB地震反应谱数值算法的稳定性和精度分析
  9. JavaFx 自制厘米尺标尺
  10. premiere小tips(参考于干的教程)
  11. 想学PLC编程,先弄清5种PLC专用语言
  12. MATLAB启动慢解决措施
  13. asp.net调用51ditu
  14. java计算机毕业设计计算机专业招聘网站MyBatis+系统+LW文档+源码+调试部署
  15. 自噬决定免疫细胞分化及功能执行
  16. 2021-11-05 springMVC 错误:org.springframework.http.converter.HttpMessageNotWritableException No conve
  17. 5 种全局 ID 生成方式、优缺点及改进方案
  18. 启动计算机时听到嘀嘀声,为何电脑开机时会有滴滴的声音?
  19. canvas效果案例:安卓机器人
  20. Python爬虫的起点,一文轻松入门

热门文章

  1. ffmpeg利用libav库把yuv视频流转换为TS串流
  2. 数据库 -- 由数据库连接池引出的三种设计模式
  3. drf6 权限和频率控制组件
  4. java存入数据库是问号_Java插入中文到数据库中文变成问号解决
  5. 遍历二维数组_Java编程基础阶段笔记 day06 二维数组
  6. 搭载鸿蒙处理器的手机,荣耀Magic3被曝光,或采用安卓与鸿蒙双系统,搭载麒麟9000处理器...
  7. python语言的类型是_Python语言类型
  8. eclipse远程连接hadoop_1个文件,3个类,mapreduce就是这么简单,动手搭建Hadoop(8)...
  9. python爬取正确但不出文件_[求助] Python 爬虫爬取豆瓣_请不要害羞,语法没有报错,但是最终没有得到图片,请各位大神帮我看看,到底哪里出现了问题??急求...
  10. Quick BI 功能“炸弹”:即席分析、模板市场、企业微信免密登录等强势功能