问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

linux中关于流式套接字编程代码的解释,求大神把每行代码加上注释,具体一点

发布网友 发布时间:2022-05-01 15:10

我来回答

2个回答

热心网友 时间:2023-10-21 00:09

服务器端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
 
int main(int argc,char* argv)
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

//获得一个socket文件描述符,使用tcp ip 协议 
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
server_address.sin_family=AF_INET;
//设置服务器端接受任何主机的请求
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
//使用端口9734 来接受请求
server_address.sin_port=htons(9734);
server_len=sizeof(server_address);
//绑定socket 
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
 
 //监听连接请求,连接请求队列 大小为 5 
listen(server_sockfd,5);
 
while(1)
{
char ch;
printf("server waiting\n");
 
client_len=sizeof(client_address);
 
 //接受client 端的连接请求,如果没有连接请求,该进程将阻塞
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
//读数据
read(client_sockfd,&ch,1);
ch++;
//写数据
write(client_sockfd,&ch,1);

//关闭与client端的连接
close(client_sockfd);
 
}
}

客户端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
 
int main(int argc,char* argv)
{
int sockfd;
int len;
struct sockaddr_in address;
int result;
char ch='A';
 
 //设置需要连接服务器的 ip port 
sockfd=socket(AF_INET,SOCK_STREAM,0);
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr("127.0.0.1");
address.sin_port=htons(9734);
len=sizeof(address);
 
 //连接服务器
result=connect(sockfd,(struct sockaddr *)&address,len);
if(result==-1)
{
perror("oops:client3");
exit(1);
}
 
 //写数据
write(sockfd,&ch,1);
//读数据
read(sockfd,&ch,1);
printf("char from server=%c\n",ch);
//关闭与服务器的连接
close(sockfd);
exit(0);
 
}


关于你的问题:
1.简单的方法,设置socket套接字为非阻塞模式,然后轮询,并查看是否超时。

或者是使用select poll 等方法 ,设置超时时间。

或者 使用 alarm 信号,都可以。

2..每当接收到一个client 端的连接请求,就开辟一个线程为之服务。

或者使用select poll  epoll等方法,推荐这个。

3.你是指的是处理信号吗?这个有专门的函数 signal 可以处理。

热心网友 时间:2023-10-21 00:09

楼上写的真不少,30-分值的送他,辛苦了。

热心网友 时间:2023-10-21 00:09

服务器端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
 
int main(int argc,char* argv)
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

//获得一个socket文件描述符,使用tcp ip 协议 
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
server_address.sin_family=AF_INET;
//设置服务器端接受任何主机的请求
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
//使用端口9734 来接受请求
server_address.sin_port=htons(9734);
server_len=sizeof(server_address);
//绑定socket 
bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
 
 //监听连接请求,连接请求队列 大小为 5 
listen(server_sockfd,5);
 
while(1)
{
char ch;
printf("server waiting\n");
 
client_len=sizeof(client_address);
 
 //接受client 端的连接请求,如果没有连接请求,该进程将阻塞
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
//读数据
read(client_sockfd,&ch,1);
ch++;
//写数据
write(client_sockfd,&ch,1);

//关闭与client端的连接
close(client_sockfd);
 
}
}

客户端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
 
int main(int argc,char* argv)
{
int sockfd;
int len;
struct sockaddr_in address;
int result;
char ch='A';
 
 //设置需要连接服务器的 ip port 
sockfd=socket(AF_INET,SOCK_STREAM,0);
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr("127.0.0.1");
address.sin_port=htons(9734);
len=sizeof(address);
 
 //连接服务器
result=connect(sockfd,(struct sockaddr *)&address,len);
if(result==-1)
{
perror("oops:client3");
exit(1);
}
 
 //写数据
write(sockfd,&ch,1);
//读数据
read(sockfd,&ch,1);
printf("char from server=%c\n",ch);
//关闭与服务器的连接
close(sockfd);
exit(0);
 
}


关于你的问题:
1.简单的方法,设置socket套接字为非阻塞模式,然后轮询,并查看是否超时。

或者是使用select poll 等方法 ,设置超时时间。

或者 使用 alarm 信号,都可以。

2..每当接收到一个client 端的连接请求,就开辟一个线程为之服务。

或者使用select poll  epoll等方法,推荐这个。

3.你是指的是处理信号吗?这个有专门的函数 signal 可以处理。

热心网友 时间:2023-10-21 00:09

楼上写的真不少,30-分值的送他,辛苦了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
农业银行助学贷款还款流程 助学贷款到什么银行还款 农业银行助学贷款还款查询 海藻丸相关方剂 “与医收海藻”的出处是哪里 小狗在外面只尿一点点,回到家尿一大泡,气死人。要怎么解决啊_百度知 ... 狗狗为什么总是尿一点 狗狗到处尿一点点 相机内存卡不小心格式化怎么恢复 佳能相机不小心格式化了照片是否可以恢复_佳能相机不小心格式化了照片还 ... 为什么我我的红米手机照像拍照时不亮灯 公积金贷款后,如以后停止缴纳公积金。公积金公司和银行该怎样处理这种情况?利率改变吗? linux select检测为啥是监听套接字 公积金贷款之后,现在公积金断交了,有什么影响,该怎么办 为什么linux中监听套接字时最大能监听多少套接字 离职后公积金停交了,里面的钱还能还房贷吗 如果还着公积金贷款,突然公积金断了,怎么还贷款呢? Linux 使用 socket 函数建立套接字后,这个套接字文件会放在哪里 公积金贷款的还款过程中,公积金停交后,续交了没扣款怎么办理继续代扣? linux 下创建套接字函数SOCKET()头文件问题。 用住房公积金贷款买房后,住房公积金报停,贷款怎么还 linux中套接字文件丢失怎么办 公积金停了贷款怎么还 怎样用手机进入微信文件夹 如何进入手机微信文件夹? 肥东滑翔伞在哪 合肥到黄麓镇现在怎么坐车 合肥滨湖何时通公交到长临河古镇 长临河镇的地理位置 肥东长临河到湖滨湿地公国有多少公里 红米手机照相时闪光灯怎么不亮 红米k30至尊纪念版相机的闪光灯4种模式都是什么? 手机双卡双待怎么用? Linux编程问题,有关本地域套接字和EPOLL的 linux下如何用socket套接字来代替ping程序来检测终 linux原始套接字怎么从报文提取数据data 求教:怎么将红米手机里面的相机和手电筒同时打开使用 linux一个程序可以创建几个套接字?求大神指点迷津 linux soket编程 服务端 为什么要两个套接字呢 要上高速etc安装时间半年了卡拿下来了一直没用怎么用? 高速公路 ETC 使用疑问。我一周走一次高速,平时我是把卡拔下来,用的时候再插上。还是一直插上? ETC卡不用时拔下二三个月还能用吗? etc长时间没用,设备没移动过,卡一拔一插显示蓝牙已可以正常抬杆吗? 居家瘦的减肥方式如何? 居家一周减肥食谱 从木樨园到北京站怎么坐公交或者坐地铁? 从木樨园去北京站坐多少路公交车 从北京木樨园到北京火车站该怎么转车啊? 北京木胥圆到北京站坐车怎么走 从木樨园长途汽车站到北京西站 怎么走